我有一个包含几个子包的包,其中一个用于测试(名为tests
)。由于子包名称清楚地表明所包含的模块是测试模块,所以我不喜欢用test-name模式来污染模块名称,因为nose希望将它们包含在测试中。这就是我正在考虑的设置:
- foo
- __init__.py
...
- bar
- __init__.py
...
- baz
- __init__.py
...
- tests
- __init__.py
- something.py
现在,默认情况下nose不运行foo.tests.something
中找到的测试。我知道nose接受-i
选项来定义用于搜索测试的附加内容的正则表达式。所以nose -i something
在这里起作用。然而,我在tests
包中有一堆模块,不想显式地命名它们。nose -i tests..*
不工作,它看起来像鼻子只匹配模块基名。作为最后的手段,我可以运行nose --all-modules
,但这也检查foo.bar
和foo.baz
——我想避免这种情况。
那么,我如何指示nose在给定包(在我的情况下是tests
)中的所有模块中查找测试?我可以为这个任务写一个nose插件,但我正在寻找一个标准的解决方案。
如果您在测试中用test_
前缀命名文件(即将something.py
重命名为test_something.py
),则运行鼻应该默认拾取它们。
你说"我不喜欢用test-name模式污染模块名,因为它期望包含它们进行测试",但是"某物"并不是对文件的描述,因为文件测试的是某物。使用不容易混淆的标准方式命名测试有什么问题?
您应该能够将文件导入__init__.py
并将其拾取。我有这样的设置:
- app:
- __init__.py
- models.py
- views.py
- tests:
- __init__.py
- models.py # contain tests
- views.py # contain tests
在tests/__init__.py
文件中我有以下内容:
from app.tests.models import *
from app.tests.views import *
这破坏了使用正则表达式查找测试的一个好处(nose的一个目标),但却有效。
你也可以使用装饰器@istest
来标记一个单独的def作为一个测试,如果你想避免方法的命名来匹配正则表达式。我没有尝试过为不匹配正则表达式的模块(py文件)这样做,但我怀疑如果没有上面的导入,它会起作用。
注意,我已经离开了__init__.py
中的导入,只是在我的测试方法和文件名前面加上test_,并在我的类后面加上test。我发现这使得代码更加自我描述,因为即使在测试类中也可能有设置方法和辅助方法(例如生成器)。
with Nose:
nosetests --all-modules
与py 。测试它可以通过把它放在setup.cfg(配置文件):
[pytest]
python_files=*.py
检查这个文档:pytest docs。