【问题标题】:Nose: test all modules in a given package鼻子:测试给定包中的所有模块
【发布时间】:2013-03-25 16:14:14
【问题描述】:

我有一个包含几个子包的包,其中一个用于测试(名为tests)。由于子包名称清楚地表明包含的模块是测试模块,所以我不想用测试名称模式污染模块名称,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——我想避免这种情况。

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

【问题讨论】:

    标签: python testing nose


    【解决方案1】:

    如果您在测试中使用 test_ 前缀命名文件(即,将 something.py 重命名为 test_something.py,默认情况下,running nose 会选择它们。

    您说“我不希望使用测试名称模式来污染模块名称,nose 期望将它们包含在测试中”,但“某事”不是文件的描述性,因为该文件测试了某事。使用不混淆的标准命名测试有什么问题?

    【讨论】:

    • 是的,我知道将模块命名为test_... 是可行的,但恕我直言,这是多余的,因为包含模块的包tests 表明它们是测试模块——有点像与 DRY 原则相冲突。您可能会说tests 包中的所有模块不一定都必须是测试,但在这种情况下,__test__ = False 属性也可以完成这项工作。这就是我的理由,我的问题是鼻子是否以某种方式支持这种设置。
    【解决方案2】:

    您应该能够将文件导入您的__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 类中也可能存在设置方法和辅助方法(例如生成器)。

    【讨论】:

    • 初始化导入是个好主意。但是,同时我也使用 test_ 前缀作为测试模块。我不太喜欢这样,但在与其他期望标准命名方案的开发人员合作时,它可以避免混淆。
    【解决方案3】:

    有鼻子:

    nosetests --all-modules
    

    使用 py.test 可以通过将其放入 setup.cfg(配置文件)来完成:

    [pytest]
    python_files=*.py
    

    查看此文档:pytest docs

    【讨论】:

    • 好吧,我已经在我的问题中提到了--all-modules 选项,以及为什么这不是我正在寻找的解决方案的原因。
    • 另外,我正在寻找测试的好方法。目前我是cd ./my/test/module,然后是py.test or nosetests。当它不能工作时,我会停止使用它,而是尝试print...python myscript.py。这不是框架方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多