Hy,我是python的新手并使用Unittest而且我找不到类似的问题,甚至找不到我的问题的解决方案。
我正在编写一个代码,通过Unittest进行测试,如果某个主页上存在多个元素。 测试后我希望结果保存在文本文件中。 但是textfile中的结果如下所示:
......................
.........
------------------------------------------
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()
请告诉我某人我错过了什么或做错了什么?谢谢
答案 0 :(得分:0)
如果要保存在文件中的输出与打印到控制台的输出相对应,则有两个主要选项。
然后只需将输出重定向到文件:
python script.py > output.txt
但是,输出将不再打印到控制台。
如果要保留控制台输出,请使用tee
unix命令:
python script.py | tee output.txt
您可以使用专门的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
类似的行为,请查看this post。
我们的想法是定义一个包含两个所需流的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()