Nose:测试给定包中的所有模块



我有一个包含几个子包的包,其中一个用于测试(名为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.barfoo.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。

最新更新