我正在编写通过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
但是,输出将不再打印到控制台。如果要保留控制台输出,请使用tee
unix命令:
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()