📜  Python|将测试输出记录到文件

📅  最后修改于: 2022-05-13 01:55:13.365000             🧑  作者: Mango

Python|将测试输出记录到文件

问题——将运行单元测试的结果写入文件而不是打印到标准输出。

运行单元测试的一种非常常见的技术是在测试文件的底部包含一个小代码片段(如下面的代码所示)。

代码#1:

import unittest
class MyTest(unittest.TestCase):
    ...
if __name__ == '__main__':
    unittest.main()

这使得测试文件可执行,并将运行测试的结果打印到标准输出。要重定向此输出,请稍微展开 main() 调用并编写自己的 main()函数,如下面的代码所示:

代码#2:

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()函数后面的测试运行程序相同。