将单元测试结果保存在文本文件中



我正在编写通过unittest测试某个主页上是否存在多个元素的代码。测试结束后,我希望将结果保存在一个文本文件中。但文本文件中的结果如下:

......................
.........
------------------------------------------
Ran 12 tests in 22.562s
OK.

但我希望输出看起来像这样:

test_test1 (HomepageTest.HomePageTest) ... ok
test_test2 (HomepageTest.HomePageTest) ... ok
test_test3 (HomepageTest.HomePageTest) ... ok
etc....
-------------------------------------------------
Ran 12 tests in ...s
OK

这是我用来将输出保存到文本文件中的代码:

class SaveTestResults(object):
def save(self):
self.f = open(log_file, 'w')
runner = unittest.TextTestRunner(self.f)
unittest.main(testRunner = runner, defaultTest ='suite', verbosity = 2)

def main():
STR = SaveTestResults()
STR.save()
if __name__ == '__main__':
main()

我错过了什么或做错了什么?

如果要保存在文件中的输出与打印到控制台的输出相对应,则有两个主要选项。

1-您使用的是Linux

然后将输出重定向到一个文件:

python script.py > output.txt

但是,输出将不再打印到控制台。如果要保留控制台输出,请使用teeunix命令:

python script.py | tee output.txt

2-您正在使用Windows,或者不想将整个输出重定向到文件

您可以完全使用Python来实现或多或少相同的事情。您需要将sys.stdout的值设置为要写入输出的文件描述符。

import sys
sys.stdout = open("output.txt", 'w')
run_tests()

这将把输出流stdout设置为整个脚本的给定文件。我建议定义一个装饰器:

def redirect_to_file(func):
def decorated(*args, **kwargs):
actualStdout = sys.stdout
sys.stdout = open("log.txt", 'a')
result = func(*args, **kwargs)
sys.stdout = actualStdout
return result
return decorated

然后,只需修饰要将输出写入文件的函数:

@redirect_to_file
def run_test():
...

如果你想要类似于tee的行为,可以看看这篇文章。其思想是定义一个Tee类,该类包含两个所需的流:

class Tee:
def __init__(self, stream1, stream2):
self.stream1 = stream1
self.stream2 = stream2
def write(self, data):
self.stream1.write(data)
self.stream2.write(data)
def close(self):
self.stream1.close()
self.stream2.close()

然后,将sys.stdout设置为Tee实例,该实例的流之一是实际的stdout:

tee = Tee(sys.stdout, open("output.txt", 'w'))
sys.stdout = tee

不要忘记在脚本结束时关闭tee实例;否则,写入output.txt的数据将不会保存:

tee.close()

最新更新