pytest 是否有类似 google test 的非致命 EXPECT_* 行为?

jxr*_*mos 5 python googletest pytest

我更熟悉谷歌测试框架,并了解他们支持的主要行为对ASSERT_*vsEXPECT_*哪些是致命和非致命断言模式。

文档

断言成对出现,测试相同的事物但对当前函数有不同的影响。ASSERT_*版本失败时会产生致命的失败,并中止当前功能。 EXPECT_*版本生成非致命故障,不会中止当前功能。通常首选 EXPECT_*,因为它们允许在测试中报告多个失败。但是,如果在相关断言失败时继续操作没有意义,您应该使用 ASSERT_*。

问题:pytest 是否也有我可以启用的非致命断言风格或模式?

允许最大程度地执行完整范围的测试以获得最丰富的故障历史记录而不是在第一次故障时中止并可能隐藏必须通过运行测试应用程序的多个实例分段发现的后续故障,这很好。

hoe*_*ing 5

我用于pytest-assume非致命断言。它的工作做得很好。

安装

照常,

$ pip install pytest-assume
Run Code Online (Sandbox Code Playgroud)

使用示例

$ pip install pytest-assume
Run Code Online (Sandbox Code Playgroud)

如果你觉得写得pytest.assume有点太多了,就给 import 起个别名:

import pytest


def test_spam():
    pytest.assume(True)
    pytest.assume(False)

    a, b = True, False
    pytest.assume(a == b)

    pytest.assume(1 == 0)
    pytest.assume(1 < 0)

    pytest.assume('')
    pytest.assume([])
    pytest.assume({})
Run Code Online (Sandbox Code Playgroud)

运行上述测试结果:

import pytest.assume as expect


def test_spam():
    expect(True)
    ...
Run Code Online (Sandbox Code Playgroud)


wim*_*wim 4

中没有这样的功能pytestassert当表达式的结果为假时,普通语句将立即无法通过测试。对于非致命断言,您可以使用函数调用 - hoefling 的答案提到了提供此类函数的第 3 方 pytest 插件。您可以轻松地重新创建 EXPECT_* 想法,而无需使用插件,方法是附加到错误列表,然后在测试结束时断言该列表为空。

最好允许全方位的测试最大限度地执行以获得最丰富的故障历史记录,而不是在第一次故障时中止,并可能隐藏必须通过运行测试应用程序的多个实例来分段发现的后续故障。

对于这是否好有不同的看法。在Python OSS中,流行的方法是:编写更多的测试,编写更小的测试,以及编写(理想情况下)仅对一件事进行断言的测试。每个潜在的“分段发现的后续故障”都将写入其自己的单独测试中。