当前位置:  开发笔记 > 编程语言 > 正文

Python:如何对子目录中的所有源文件运行unittest.main()?

如何解决《Python:如何对子目录中的所有源文件运行unittest.main()?》经验,为你挑选了4个好方法。

我正在开发一个包含多个源文件的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原则.



1> Peter Gibson..:

从Python 2.7开始,测试发现在unittest包中自动完成.来自文档:

Unittest支持简单的测试发现.为了与测试发现兼容,所有测试文件必须是可从项目的顶级目录导入的模块或包(这意味着它们的文件名必须是有效的标识符).

测试发现在实现中TestLoader.discover(),但也可以从命令行使用.基本命令行用法是:

cd project_directory
python -m unittest discover

默认情况下,它会查找名为的软件包test*.py,但这可以更改,因此您可以使用类似的软件包

python -m unittest discover --pattern=*.py

代替test.py脚本.


有关python 2.6的任何建议吗?

2> 小智..:

这是我的测试发现代码,似乎可以完成这项工作.我想确保我可以轻松地扩展测试,而不必在任何涉及的文件中列出它们,但也避免在一个单独的Ü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.



3> Pete..:

我知道有一个明显的解决方案:

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

抱歉这个愚蠢的问题.


要么你错过了'dirBar/__ init __.py`或`来自dirBar import*`将不起作用.顺便说一句,使用小写的包/模块名称.
所以7年后,我认为有人可能会添加init,因为没有其他人会这样做.
此外,问题在于您假设Foo.py和Bar.py的测试用例在dirBar __init__.py模块中公开.如果他们不是,你的test.py将不会测试任何东西.

4> Cristian..:

你应该试试鼻子.它是一个帮助创建测试的库,它与unittest或集成doctest.您需要做的就是运行nosetests,它将为您找到所有的单元测试.

% nosetests # finds all tests in all subdirectories
% nosetests tests/ # find all tests in the tests directory


问题明确询问了使用unittest的解决方案
推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有