我有一个包含目录“tests”的包,其中存储了我的单元测试。我的包裹看起来像:
.
├── LICENSE
├── models
│ └── __init__.py
├── README.md
├── requirements.txt
├── tc.py
├── tests
│ ├── db
│ │ └── test_employee.py
│ └── test_tc.py
└── todo.txt
从我的包目录中,我希望能够同时找到tests/test_tc.py
和tests/db/test_employee.py
。我希望不必安装第三方库(nose
或其他),也不必手动构建一个TestSuite
来运行它。
肯定有办法告诉unittest discover
一旦找到测试就不要停止寻找?python -m unittest discover -s tests
将找到tests/test_tc.py
,python -m unittest discover -s tests/db
将找到tests/db/test_employee.py
。不是有办法找到两者吗?
如果您可以在测试中添加一个
__init__.py
文件,那么您可以在那里放置一个load_tests
函数来处理发现。我并不相信这是最好的方法,但编写该函数的一种方法是:
很难看,我同意。
首先将所有子目录添加到测试包的路径(Docs)。
然后,使用^{} 遍历路径,查找包或模块。
当它找到一个,然后检查模块成员,看看它们是否是类,如果它们是类,它们是否是
unittest.TestCase
的子类。如果是,则将类中的测试加载到测试套件中。现在,从项目根目录中,您可以键入
使用
-p
模式开关。如果一切顺利,你会看到我所看到的,就像:这正是预期的,我的两个示例文件中的每个都包含两个测试,
testFoo
和testBar
。编辑:在进一步挖掘之后,您可以将此函数指定为:
这使用
loader.loadTestsFromModule()
方法,而不是我上面使用的loader.loadTestsFromTestCase()
方法。它仍然修改tests
包路径并遍历它寻找模块,我认为这是这里的关键。现在输出看起来有点不同,因为我们一次将找到的测试套件添加到主测试套件
suite
:但是我们仍然可以在两个类和两个子目录中得到我们期望的4个测试。
在做一些深入研究时,似乎只要深层模块仍然是可导入的,它们就会通过
python -m unittest discover
被发现。然后,解决方案只是在每个目录中添加一个__init__.py
文件,使它们成为包。只要每个目录都有一个
__init__.py
,python -m unittest discover
就可以导入相关的test_*
模块。相关问题 更多 >
编程相关推荐