鼻子:测试给定包装中的所有模块

时间:2011-09-11 21:40:33

标签: python testing nose

我有一个包含多个子包的包,其中一个用于测试(名为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.barfoo.baz - 我想避免这种情况。

那么,我怎样才能指示鼻子在给定包中的所有模块中查找测试(在我的情况下为tests)?我可以为这个任务编写一个鼻子插件,但我正在寻找一个标准的解决方案。

3 个答案:

答案 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