如何让py.test或nose在所有Python文件中查找测试?

5 投票
5 回答
6112 浏览
提问于 2025-04-16 03:52

我有几个小模块,里面有测试代码,但是 py.test 或者 nose 不会去查找这些测试,因为它们的文件名里没有 test 这个词。

我该怎么做才能让 py.test 或者 nose 在所有的 Python 文件中查找测试,甚至是那些文件名里没有 test 的文件呢?

在我的源文件里,我遵循了标准的命名规则:比如 class testSomeName 里面有方法 def test_some_name

如果这样做不行,那我还有什么其他方法可以达到同样的效果呢?

我不想手动列出所有包含测试的文件,我希望有一个能自动发现测试的解决方案。

5 个回答

5

使用py.test非常简单。你只需要创建一个名为conftest.py的文件,里面放入以下内容:

# content of conftest.py file at root of your project
def pytest_collect_file(path, parent):
    if path.ext == ".py":
        return parent.Module(path, parent)

这样做会让测试收集的过程变得更广泛,为每个“.py”文件创建一个测试“模块”节点。把这个放在conftest.py文件里,就变成了一个特定于项目的扩展,当你输入以下命令时,它会自动加载:

py.test 

如果你想了解更多信息,你还可以输入:

py.test --collectonly

这样可以查看收集到的测试和文件,输出示例:

<Directory 'morecollect'>
   <Module 'conftest.py'>
   <Directory 'pkg'>
     <Module 'test_x.py'>
        <Function 'test_hello2'>
   <Module 'x.py'>   # this is collected because of our conftest.py extension
     <Function 'test_hello'>

如果需要,你还可以把上面的conftest.py文件打包成一个可安装的插件,通过安装这个插件来使扩展可用。在这种情况下,你根本不需要任何conftest.py文件。

7

在项目的根目录下放一个名为 "setup.cfg" 的文件,里面写上这两行:

[pytest]
python_files=*.py

这样,py.test 就会从所有的 *.py 文件中选择测试用例。这里有详细的解释:pytest 文档

如果使用 Nose的话:

nosetests --all-modules
5

你还可以看看 Nose,这个工具可以在不需要固定文件命名规则的情况下,自动发现测试。

你可以用下面的代码跳过Nose中用来过滤文件的正则表达式。首先,创建一个Python模块(比如说 my_nosetests.py)。

import nose
from nose.plugins.base import Plugin

class ExtensionPlugin(Plugin):

    name = "ExtensionPlugin"

    def options(self, parser, env):
        Plugin.options(self,parser,env)

    def configure(self, options, config):
        Plugin.configure(self, options, config)
        self.enabled = True

    def wantFile(self, file):
        return file.endswith('.py')

    def wantDirectory(self,directory):
        return True

    def wantModule(self,file):
        return True


if __name__ == '__main__':
    includeDirs = ["-w", ".", ".."]
    nose.main(addplugins=[ExtensionPlugin()], argv=sys.argv.extend(includeDirs))

现在像运行 nosetests 一样运行 my_nosetests.py,这样你的测试就会开始运行了。不过要注意,你实际上是加载了所有模块,并在里面搜索测试,加载模块可能会有一些副作用。

撰写回答