Python在文件文件中保存Unittest结果

时间:2017-08-30 08:59:32

标签: python unit-testing

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()

请告诉我某人我错过了什么或做错了什么?谢谢

1 个答案:

答案 0 :(得分:0)

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

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类似的行为,请查看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()