14.4 将测试输出用日志记录到文件中¶

问题¶

你希望将�元测试的输出写到到�个文件中去,而�是打�到标准输出。

解决方案¶

�行�元测试一个常�技术就是在测试文件底部加入下�这段代�片段:

import unittest

class MyTest(unittest.TestCase):
    pass

if __name__ == '__main__':
    unittest.main()

这样的�测试文件就是�执行的,并且会将�行测试的结果打�到标准输出上。 如果你想�定�输出,就需��下�这样修改 main() 函数:

import sys

def main(out=sys.stderr, verbosity=2):
    loader = unittest.TestLoader()
    suite = loader.loadTestsFromModule(sys.modules[__name__])
    unittest.TextTestRunner(out,verbosity=verbosity).run(suite)

if __name__ == '__main__':
    with open('testing.out', 'w') as f:
        main(f)

讨论¶

本节感兴趣的部分并�是将测试结果�定�到一个文件中, 而是通过这样��你展示了 unittest 模�中一些值得关注的内部工作原�。

unittest 模�首先会组装一个测试套件。 这个测试套件包�了你定义的��方法。一旦套件组装完�,它所包�的测试就�以被执行了。

这两步是分开的,unittest.TestLoader 实例被用�组装测试套件。 loadTestsFromModule() 是它定义的方法之一,用�收集测试用例。 它会为 TestCase 类扫��个模�并将其中的测试方法��出�。 如果你想进行细粒度的控制, �以使用 loadTestsFromTestCase() 方法�从�个继承TestCase的类中��测试方法。 TextTestRunner 类是一个测试�行类的例�, 这个类的主�用途是执行�个测试套件中包�的测试方法。 这个类跟执行 unittest.main() 函数所使用的测试�行器是一样的。 �过,我们在这里对它进行了一些列底层�置,包括输出文件和��级别。 尽管本节例�代�很少,但是能指导你如何对 unittest 框架进行更进一步的自定义。 �想自定义测试套件的装�方�,你�以对 TestLoader 类执行更多的�作。 为了自定义测试�行,你�以构造一个自己的测试�行类�模拟 TextTestRunner 的功能。 而这些已�超出了本节的范围。unittest 模�的文档对底层实现原�有更深入的讲解,�以去看看。