我有一个包含多个子包的包,其中一个用于测试(名为
tests
)。由于子包名称清楚地表明所包含的模块是测试模块,因此我不希望使用测试名称模式污染模块名称,nose 希望包含它们以进行测试。这就是我想到的设置:
- foo
- __init__.py
...
- bar
- __init__.py
...
- baz
- __init__.py
...
- tests
- __init__.py
- something.py
现在,默认情况下,nose 不会运行
foo.tests.something
中找到的测试。我知道鼻子接受 -i
选项来定义正则表达式,以搜索测试中的其他内容。所以 nose -i something
在这里完成工作。但是,我在 tests
包中有一堆模块,并且不想明确命名它们。 nose -i tests\..*
不起作用,看起来nose只与模块基本名称匹配。作为最后的手段,我可以运行 nose --all-modules
,但这也会检查 foo.bar
和 foo.baz
——我想避免这种情况。
那么,我如何指示nose在给定包内的所有模块中查找测试(在我的例子中是
tests
)?我可以为这个任务编写一个鼻子插件,但我正在寻找一个标准的解决方案。
如果您在测试中使用
test_
前缀命名文件(即,将 something.py
重命名为 test_something.py
,默认情况下,running nose 应该会拾取它们。
你说“我不喜欢用测试名称模式污染模块名称,nose希望包含它们进行测试”,但“某事”并不是对文件的描述,因为该文件测试了该东西。使用不令人困惑的标准方式命名测试有什么问题?
您应该能够将文件导入到您的
__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
将单个定义标记为测试。我没有尝试对与正则表达式不匹配的模块(py 文件)执行此操作,但我怀疑如果没有上述导入,它是否会起作用。
注意,我已经放弃了
__init__.py
中的导入,只需在我的测试方法和文件名前添加 test_ 前缀,并在我的类后添加 Test 即可。我发现这使得代码更具自描述性,即使在测试类中也可能有设置方法和辅助方法(例如生成器)。
鼻子填充物
使用鼻子填充物对许多一直在考虑[非手术鼻子整形]的人来说是有益的。通过这些程序可以暂时纠正不对称并消除缺陷。然而,结果各不相同,因此您应该咨询合格的从业者。在做出决定之前,请务必进行研究和审查。
有鼻子:
nosetests --all-modules
使用 py.test 可以通过将其放入 setup.cfg(配置文件)来完成:
[pytest]
python_files=*.py
检查此文档:pytest 文档。