`python -m unittest discover` 未能发现测试
Python的unittest发现不了我的测试!
我一直在用nose来查找我的单元测试,效果很好。从我项目的顶层,如果我运行 nosetests
,我会得到:
Ran 31 tests in 0.390s
现在Python 2.7的unittest 已经有了发现功能,我尝试使用
python -m unittest discover
但是我得到的是
Ran 0 tests in 0.000s
我的文件夹结构是:
myproj/
reporter/
__init__.py
report.py
[other app modules]
tests/
__init__.py
test-report.py
[other test modules]
你知道为什么unittest的发现算法找不到测试吗?
我在Windows 7上使用的是Python 2.7.1和nose 1.0.0。
4 个回答
作为一个对Python还比较陌生的人,我发现文档中的命名规则让我有点困惑。Ben的评论帮了我大忙:默认的查找模式是寻找以“test”开头的测试模块。
我原以为只要看类名就行,不需要特定的文件命名规则。
文档中是这么说的:
https://docs.python.org/3/library/unittest.html
命令是:python -m unittest discover -s project_directory -p "_test.py"。
我一开始没能成功,但当我把文件名改成“test_.py”后,终于成功了!
我遇到这个问题是因为项目中的一些文件夹缺少了 __init__.py
文件。我原以为在 Python 3.7 里不需要这个文件。
其实,只要在 每个 文件夹里添加 __init__.py
文件,接着用 python3 -m unittest
命令就能自动找到测试了。
这个行为是故意的,但文档可以写得更清楚一些。如果你看看测试发现部分的第一段,它提到:
为了让项目的测试能够被发现,它们必须都能从项目的顶层目录导入(换句话说,它们必须都在Python包里面)。
由此可知,文件名也必须是有效的Python模块名称。比如说,test-report.py
就不符合这个要求,因为test-report
不是一个合法的Python标识符。
建议在-p
模式选项的文档中明确提到这一点,可能是一个不错的改进方向。