我正在开发一个包含多个源文件的Python模块,每个源文件都有自己的源代码测试类,这些测试类源自unittest.考虑目录结构:
dirFoo\ test.py dirBar\ __init__.py Foo.py Bar.py
要测试Foo.py或Bar.py,我会在Foo.py和Bar.py源文件的末尾添加它:
if __name__ == "__main__": unittest.main()
并在任一源上运行Python,即
$ python Foo.py ........... ---------------------------------------------------------------------- Ran 11 tests in 2.314s OK
理想情况下,我会"test.py"自动搜索dirBar以获取任何unittest派生类,并调用"unittest.main()".在实践中这样做的最佳方法是什么?
我尝试使用Python为dirBar中的每个*.py文件调用execfile,它为找到的第一个.py文件运行一次并退出调用test.py,然后我必须通过添加unittest.main()来复制我的代码每个源文件 - 违反DRY原则.
从Python 2.7开始,测试发现在unittest包中自动完成.来自文档:
Unittest支持简单的测试发现.为了与测试发现兼容,所有测试文件必须是可从项目的顶级目录导入的模块或包(这意味着它们的文件名必须是有效的标识符).
测试发现在实现中
TestLoader.discover()
,但也可以从命令行使用.基本命令行用法是:cd project_directory python -m unittest discover
默认情况下,它会查找名为的软件包test*.py
,但这可以更改,因此您可以使用类似的软件包
python -m unittest discover --pattern=*.py
代替test.py脚本.
这是我的测试发现代码,似乎可以完成这项工作.我想确保我可以轻松地扩展测试,而不必在任何涉及的文件中列出它们,但也避免在一个单独的Übertest文件中编写所有测试.
所以结构是
myTests.py testDir\ __init__.py testA.py testB.py
myTest.py看起来像这样:
import unittest if __name__ == '__main__': testsuite = unittest.TestLoader().discover('.') unittest.TextTestRunner(verbosity=1).run(testsuite)
我相信这是在一个目录中编写多个测试用例的最简单的解决方案.该解决方案需要Python 2.7或Python 3.
我知道有一个明显的解决方案:
dirFoo\ __init__.py test.py dirBar\ __init__.py Foo.py Bar.py
dirFoo/test.py的内容
from dirBar import * import unittest if __name__ == "__main__": unittest.main()
运行测试:
$ python test.py ........... ---------------------------------------------------------------------- Ran 11 tests in 2.305s OK
抱歉这个愚蠢的问题.
你应该试试鼻子.它是一个帮助创建测试的库,它与unittest
或集成doctest
.您需要做的就是运行nosetests
,它将为您找到所有的单元测试.
% nosetests # finds all tests in all subdirectories % nosetests tests/ # find all tests in the tests directory