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

时间:2018-05-31 18:44:42

标签: python pytest googletest

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

来自documentation

  

断言成对出现,测试相同的东西,但有   对当前功能的不同影响。生成ASSERT_*个版本   失败时致命的失败,并中止当前的功能。   EXPECT_*版本会产生非致命故障,而不会中止   当前功能。通常EXPECT_ *是首选,因为它们允许更多   在测试中报告的失败多于一次。但是,你应该使用   ASSERT_ *如果在断言中继续有意义继续   问题失败了。

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

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

2 个答案:

答案 0 :(得分:3)

我使用pytest-assume进行非致命断言。它做得很好。

安装

像往常一样,

$ pip install pytest-assume

用法示例

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({})

如果您觉得写pytest.assume有点太多,只需将导入别名:

import pytest.assume as expect


def test_spam():
    expect(True)
    ...

运行上述测试得出:

$ pytest -v
============================= test session starts ==============================
platform linux -- Python 3.6.5, pytest-3.6.0, py-1.5.3, pluggy-0.6.0 -- /data/gentoo64-prefix/u0_a82/projects/stackoverflow/so-50630845
cachedir: .pytest_cache
rootdir: /data/gentoo64-prefix/u0_a82/projects/stackoverflow/so-50630845, inifile:
plugins: assume-1.2
collecting ... collected 1 item

test_spam.py::test_spam FAILED                                            [100%]

=================================== FAILURES ===================================
__________________________________ test_spam ___________________________________
test_spam.py:6: AssumptionFailure
        pytest.assume(False)


test_spam.py:9: AssumptionFailure
        pytest.assume(a == b)


test_spam.py:11: AssumptionFailure
        pytest.assume(1 == 0)


test_spam.py:12: AssumptionFailure
        pytest.assume(1 < 0)


test_spam.py:13: AssumptionFailure
        pytest.assume('')


test_spam.py:14: AssumptionFailure
        pytest.assume([])


test_spam.py:14: AssumptionFailure
        pytest.assume([])


test_spam.py:15: AssumptionFailure
        pytest.assume({})

------------------------------------------------------------
Failed Assumptions: 7
=========================== 1 failed in 0.18 seconds ===========================

答案 1 :(得分:2)

不,pytest中没有类似的功能。最流行的方法是使用常规assert语句,如果表达式为false,则会立即使测试失败。

  

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

关于这是否好看的意见不一样。至少在开源Python社区中,流行的方法是:每个潜在的&#34;随后发生的分段故障&#34;将在其自己的单独测试中编写。更多的测试,更小的测试,(理想情况下)只在一件事上断言。

您可以通过附加到错误列表轻松地重新创建EXPECT_ *事物,然后在测试结束时断言列表为空,但pytest中没有直接支持此类功能。< / p>