如果定义了构造函数,py.test 会跳过测试类

Posted

技术标签:

【中文标题】如果定义了构造函数,py.test 会跳过测试类【英文标题】:py.test skips test class if constructor is defined 【发布时间】:2014-02-21 05:53:18 【问题描述】:

我有以下通过 py.test 运行的单元测试代码。 构造函数的存在使整个类在运行时跳过 py.test -v -s

已收集 0 项 / 已跳过 1 项

谁能向我解释一下 py.test 的这种行为?

我有兴趣了解 py.test 的行为,我知道不需要构造函数。

谢谢, 兹德内克

class TestClassName(object):
    def __init__(self):
       pass

    def setup_method(self, method):
       print "setup_method called"

    def teardown_method(self, method):
       print "teardown_method called"

    def test_a(self):
       print "test_a called"
       assert 1 == 1

    def test_b(self):
       print "test_b called"
       assert 1 == 1

【问题讨论】:

【参考方案1】:

py.test says 的文档说明 py.test 实现了以下标准测试发现:

收集从初始命令行参数开始,这些参数可能是目录、文件名或测试 ID。 递归到目录,除非它们匹配 norecursedirs test_*.py 或 *_test.py 文件,由它们的包名导入。 Test 前缀测试类(没有 __init__ 方法)[] test_前缀的测试函数或方法是测试项

所以并不是不需要构造函数,py.test 只是忽略了具有构造函数的类。还有一个guide 用于更改标准测试发现。

【讨论】:

对。我应该更仔细地阅读。非常感谢您发现它。 链接已修复。 This 是 Python 测试发现约定的更新链接,this 是指南的更新链接。两者都在 2019 年 9 月工作。【参考方案2】:

正如 Matti Lyra 的回答中已经提到的那样,py.test 故意跳过具有构造函数的类。这样做的原因是类仅用于 py.test 中的结构原因并且没有任何固有行为,而在实际编写代码时,则相反,并且很少有类的 .__init__() 方法。所以在实践中跳过一个带有构造函数的类可能是我们所希望的,通常它只是一个碰巧有一个冲突名称的类。

最后 py.test 需要实例化类以执行测试。如果构造函数接受任何参数,它就无法实例化它,所以再次跳过是正确的做法。

【讨论】:

我同意,但我认为将来应该发出警告(一旦 pytest 增长了一点警告机制)。 嗨,Holger,的确,那太好了。我只发现该类是通过从更大的测试套件中逐个模块运行来屏蔽的。一个明确的警告会立即说明。除此之外,让我重复一下我在 2010 年在 Europython 上告诉过你的话——感谢你提供了一个很棒的测试框架! IIRC 如果您使用 -rs 调用 py.test,您将已经看到带有 __init__() 的类被跳过。 如果您确实想在类中的其余测试之前初始化类中的某些内容,您可以使用 pytest 夹具。即@pytest.fixture(autouse=True) def _setup(self): self.something = something 看来 pytest 终于有了这个警告机制! PytestCollectionWarning: cannot collect test class 'TestClass' because it has a __init__ constructor (from: test/test_classes.py)。搜索该警告导致我来到这里...... :)。 (我使用的是 pytest 5.3.5)

以上是关于如果定义了构造函数,py.test 会跳过测试类的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS:为啥会跳过函数?

如何告诉 py.test 跳过某些目录?

如果没有空格分隔符,为啥 XmlReader 会跳过所有其他元素?

当我在函数中调用函数时,它会跳过代码并终止程序?

如果未通过,Pytest 会跳过寻找间接参数吗?

TestNG:@BeforeClass 方法失败时会跳过所有后续测试类?