如何组织python测试,使我可以在一个命令中运行所有测试?
目前,我的代码按以下树状结构组织:如何组织python测试,使我可以在一个命令中运行所有测试?,python,unit-testing,python-nose,Python,Unit Testing,Python Nose,目前,我的代码按以下树状结构组织: src/ module1.py module2.py test_module1.py test_module2.py subpackage1/ __init__.py moduleA.py moduleB.py test_moduleA.py test_moduleB.py 其中module*.py文件包含源代码,test\u module
src/
module1.py
module2.py
test_module1.py
test_module2.py
subpackage1/
__init__.py
moduleA.py
moduleB.py
test_moduleA.py
test_moduleB.py
其中module*.py
文件包含源代码,test\u module*.py
包含相关模块的TestCase
s
使用以下命令,我可以运行单个文件中包含的测试,例如:
$ cd src
$ nosetests test_filesystem.py
..................
----------------------------------------------------------------------
Ran 18 tests in 0.390s
OK
如何运行所有测试?我尝试了nosetests-m'test.*'
,但它不起作用
$cd src
$ nosetests -m 'test_.*'
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
谢谢这可能是一个热门话题,但我建议您将测试与模块分开。设置这样的东西 使用
setup.py
将它们安装到系统路径中(或者您可以修改环境变量以避免需要“安装”步骤)
现在,任何地方的任何python脚本都可以访问这些模块,而不是依赖于在本地目录中查找它们。将测试全部放在一边,如下所示:
tests/
test_module1.py
test_module2.py
test_subpackage1_moduleA,py
test_subpackage2_moduleB.py
我不确定您的nosetests
命令,但是现在您的测试都在同一个目录中,编写一个包装器脚本来简单地导入同一目录中的所有其他测试就变得容易多了。或者,如果这不可能,您至少可以通过一个简单的bash
循环来逐个获取测试文件:
#!/bin/bash
cd tests/
for TEST_SCRIPT in test_*.py ; do
nosetests -m $TEST_SCRIPT
done
我会回答的
在单个文件中运行测试类似于Nose:
testoob test_foo.py
要在多个文件中运行测试,可以使用Testoob收集器创建套件(在每个子包中)
及
我还没有尝试过您的特定场景。您是将测试和模块分开还是混合使用可能是一个品味问题,尽管我强烈主张将它们分开(设置原因、代码统计等) 使用nosetests时,请确保所有包含测试的目录都是真实的包:
src/
module1.py
module2.py
subpackage1/
__init__.py
moduleA.py
moduleB.py
tests/
__init__.py
test_module1.py
test_module2.py
subpackage1/
__init__.py
test_moduleA.py
test_moduleB.py
这样,您只需在顶级目录中运行
nosetests
,即可找到所有测试。但是,您需要确保src/
位于PYTHONPATH
上,否则由于缺少导入,所有测试都将失败。我不知道nosetests,但您可以使用标准的unittest模块实现这一点。您只需在根目录下创建一个test_all.py
文件,然后导入所有测试模块。就你而言:
import unittest
import test_module1
import test_module2
import subpackage1
if __name__ == "__main__":
allsuites = unittest.TestSuite([test_module1.suite(), \
test_module2.suite(), \
subpackage1.test_moduleA.suite(), \
subpackage1.test_moduleB.suite()])
每个模块应提供以下功能(例如带有两个单元测试的模块:Class1
和Class2
):
如果它们都以
test
开头,那么只要nosetest
就可以了。Nose会自动搜索任何以“test”开头的文件。我发现了问题,Nose会跳过这些文件,因为它们是可执行文件。我修复了重置可执行权限位并从subversion属性中删除svn:executable属性的问题。该选项将防止NoTests跳过可执行文件。可能值得考虑将其移动到nose2
,而不是nosetest
。这就是我一直在寻找的,除了我认为应该在每个套件名称之后省略()
(至少在Python 2.6.5下是这样)。Python 2.7有一种自动查找测试模块/包的方法,这似乎比记住显式地将它们添加到test_all.py中更容易维护。请看,我建议在测试目录中反映程序的包结构。否则,当程序增长时,测试目录将变得一团糟。
# src/alltests.py
test_modules = [
'subpackage1.suite',
'subpackage2.suite',
]
def suite():
import unittest
return unittest.TestLoader().loadTestsFromNames(test_modules)
if __name__ == "__main__":
import testoob
testoob.main(defaultTest="suite")
src/
module1.py
module2.py
subpackage1/
__init__.py
moduleA.py
moduleB.py
tests/
__init__.py
test_module1.py
test_module2.py
subpackage1/
__init__.py
test_moduleA.py
test_moduleB.py
import unittest
import test_module1
import test_module2
import subpackage1
if __name__ == "__main__":
allsuites = unittest.TestSuite([test_module1.suite(), \
test_module2.suite(), \
subpackage1.test_moduleA.suite(), \
subpackage1.test_moduleB.suite()])
def suite():
""" This defines all the tests of a module"""
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(Class1))
suite.addTest(unittest.makeSuite(Class2))
return suite
if __name__ == '__main__':
unittest.TextTestRunner(verbosity=2).run(suite())