如何在目录中运行所有 Python 单元测试?

新手上路,请多包涵

我有一个包含我的 Python 单元测试的目录。每个单元测试模块的格式为 test_*.py 。我正在尝试创建一个名为 all_test.py 的文件,您猜对了,它会运行上述测试表单中的所有文件并返回结果。到目前为止,我已经尝试了两种方法;两者都失败了。我将展示这两种方法,我希望有人知道如何正确地执行此操作。

对于我的第一次勇敢尝试,我想“如果我只在文件中导入所有测试模块,然后调用这个 unittest.main() ,它会起作用,对吧?”好吧,事实证明我错了。

 import glob
import unittest

testSuite = unittest.TestSuite()
test_file_strings = glob.glob('test_*.py')
module_strings = [str[0:len(str)-3] for str in test_file_strings]

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

这没有用,我得到的结果是:

 $ python all_test.py

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

对于我的第二次尝试,我想,好吧,也许我会尝试以更“手动”的方式进行整个测试。所以我试图在下面这样做:

 import glob
import unittest

testSuite = unittest.TestSuite()
test_file_strings = glob.glob('test_*.py')
module_strings = [str[0:len(str)-3] for str in test_file_strings]
[__import__(str) for str in module_strings]
suites = [unittest.TestLoader().loadTestsFromName(str) for str in module_strings]
[testSuite.addTest(suite) for suite in suites]
print testSuite

result = unittest.TestResult()
testSuite.run(result)
print result

#Ok, at this point I have a result
#How do I display it as the normal unit test command line output?
if __name__ == "__main__":
    unittest.main()

这也没有用,但看起来很接近!

 $ python all_test.py
<unittest.TestSuite tests=[<unittest.TestSuite tests=[<unittest.TestSuite tests=[<test_main.TestMain testMethod=test_respondes_to_get>]>]>]>
<unittest.TestResult run=1 errors=0 failures=0>

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

我似乎有某种套件,我可以执行结果。我有点担心它说我只有 run=1 ,看起来应该是 run=2 ,但这是进步。但是我如何将结果传递并显示给 main?或者我如何基本上让它工作以便我可以只运行这个文件,并在这样做时运行这个目录中的所有单元测试?

原文由 Stephen Cagle 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 528
2 个回答

使用 Python 2.7 及更高版本,您不必编写新代码或使用第三方工具来执行此操作;通过命令行执行递归测试是内置的。将 __init__.py 放入您的测试目录并:

 python -m unittest discover <test_directory>
# or
python -m unittest discover -s <directory> -p '*_test.py'

您可以在 python 2.7python 3.x 单元测试文档中阅读更多内容。


2021 年更新:

许多现代 python 项目使用更高级的工具,如 pytest 。例如,下拉 matplotlibscikit-learn ,你会看到它们都在使用它。

了解这些较新的工具很重要,因为当您有超过 7000 个测试时,您需要:

  • 更高级的方法来总结通过、跳过、警告、错误的内容
  • 查看他们如何失败的简单方法
  • 运行完成百分比
  • 总运行时间
  • 生成测试报告的方法
  • 等等等等

原文由 Travis Bear 发布,翻译遵循 CC BY-SA 4.0 许可协议

在 python 3 中,如果您使用的是 unittest.TestCase

  • 您的 test 目录中必须有一个空(或其他) __init__.py 文件( 必须 命名为 test/
  • 您在 test/ 中的测试文件匹配模式 test_*.py
    • 它们可以位于 test/ 下的子目录中。这些子目录可以任意命名,但它们都需要有一个 __init__.py 文件

然后,您可以运行所有测试:

 python -m unittest

完毕!少于 100 行的解决方案。希望另一个 python 初学者可以通过找到这个来节省时间。

原文由 tmck-code 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题