我有一个包含多个子包的包,其中一个用于测试(名为tests
)。由于子包名称清楚地表明包含的模块是测试模块,因此我不希望使用测试名称模式污染模块名称,鼻子希望将它们包含在测试中。这就是我想到的设置:
- 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
- 我想避免这种情况。
那么,我怎样才能指示鼻子在给定包中的所有模块中查找测试(在我的情况下为tests
)?我可以为这个任务编写一个鼻子插件,但我正在寻找一个标准的解决方案。
答案 0 :(得分:4)
如果您使用test_
前缀命名测试中的文件(即将something.py
重命名为test_something.py
,则默认情况下运行鼻子会选择它们。
你说“我不喜欢用测试名模式污染模块名称鼻子希望包含它们用于测试”,但“某些东西”不能描述文件,因为文件测试了一些东西。使用非混淆,标准的命名测试方法有什么问题?
答案 1 :(得分:3)
您应该可以将这些文件导入__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 *
这使得使用正则表达式找到测试(鼻子的目标)的好处之一失败但是有效。
如果要避免命名方法以匹配正则表达式,还可以使用装饰器@istest
将单个def标记为测试。我没有尝试为那些与正则表达式不匹配的模块(py文件)做这个,但我怀疑如果没有上面的导入它会工作。
注意,我已经放弃了__init__.py
中的导入,只使用test_将我的测试方法和文件名作为前缀,并使用Test对我的类进行后缀。我发现这使得代码更具自我描述性,即使在Test类中也可能存在设置方法和辅助方法(例如生成器)。
答案 2 :(得分:-1)
与鼻子:
nosetests --all-modules
使用py.test可以将它放在 setup.cfg (配置文件)中完成:
[pytest]
python_files=*.py
查看此文档:pytest docs。