pytest参数化具有多个断言的夹具

时间:2016-03-02 08:35:55

标签: python testing pytest

我有一个示例代码,其中我有一个带有两个断言的参数化测试函数:

@pytest.mark.parametrize("test_input,expected", [
    ("3", 8),
    ("2", 6),
])
def test_eval(test_input, expected):
    assert test_input == expected # first assert
    assert test_input + 2 ==expected # second assert

所以我想要的输出是(伪代码):

assertion error 3==8
assertion error 5==8
assertion error 2==6
assertion error 4==6

在对所有组合执行测试时,即使第一个断言失败,还是有办法达到第二个断言吗?

作为替代方案,我想知道有没有办法把它放到课堂上,例如类似的东西:

@pytest.mark.parametrize("test_input,expected", [
    ("3", 8),
    ("2", 6),
])
class TestFunc(object):
   def test_f1(test_input, expected):
     assert test_input==expected
   def test_f2(test_input, expected):
     assert test_input+2==expected

我希望获得与前一种情况相同的输出:

assertion error 3==8
assertion error 5==8
assertion error 2==6
assertion error 4==6

1 个答案:

答案 0 :(得分:0)

pytest-expect插件可以执行此类操作。

您在课堂上使用@pytest.mark.parametrize概述的方式是开箱即用的,您只需忘记self

另一种可能性是简单地编写两个测试并共享参数化:

eval_parametrize = pytest.mark.parametrize("test_input, expected", [
    ("3", 8),
    ("2", 6),
])

@eval_parametrize
def test_f1(test_input, expected):
    assert test_input == expected

@eval_parametrize
def test_f2(test_input, expected):
    assert test_input + 2 == expected