猿问

pytest 中的参数化测试对于不同的测试函数具有不同的标记

我目前正在尝试在以下上下文中使用 pytest 的参数化功能:


我有多个功能,应该使用一组通用的测试用例进行测试。根据测试的功能,相同的测试用例应该通过或失败。我想出了一个愚蠢的例子来说明这一点:


import pytest



# Functions to test

def sum_int(a, b):

    assert isinstance(a, int)

    assert isinstance(b, int)

    return a + b



def sum_any(a, b):

    return a + b



# Universal test cases

TESTCASES = [

    "a,b,result", [

        (1, 1, 2),

        ("a", "a", "aa")

        ]

    ]



class Tests:

    @pytest.mark.parametrize(*TESTCASES, ids=["int_pass", "str_fail"])

    def test_sum_int(self, a, b, result):

        assert sum_int(a, b) == result


    @pytest.mark.parametrize(*TESTCASES, ids=["int_pass", "str_pass"])

    def test_sum_any(self, a, b, result):

        assert sum_any(a, b) == result



不幸的是,似乎不可能只通过额外的分数(就像pytest.mark.xfail(reason=AssertionError)可以parametrize()用 ID 来完成一样。


# Does not work

@pytest.mark.parametrize(*TESTCASES,

                         ids=["int_pass", "str_fail"],

                         marks=[None, pytest.mark.xfail(reason=AssertionError)])

def test_sum_int(self, a, b, result):

    assert sum_int(a, b) == result

实现这一目标的好方法是什么?


牛魔王的故事
浏览 147回答 2
2回答

阿波罗的战车

我不得不发现我的问题的答案相对简单。该pytest.param机制允许为特定测试用例指定标记:@pytest.mark.parametrize(    TESTCASES[0],    [        pytest.param(*args, marks=marks)        for args, marks        in zip(TESTCASES[1], [[], [pytest.mark.xfail(reason=AssertionError)]])    ],    ids=["int_pass", "str_fail"],    )def test_sum_int(self, a, b, result):    assert sum_int(a, b) == result

海绵宝宝撒

如果您试图仅标记字符串测试的总和,您可以这样做:# Universal test casesTESTCASES = [    "a,b,result", [        (1, 1, 2),        pytest.mark.xfail(("a", "a", "aa"))        ]    ]
随时随地看视频慕课网APP

相关分类

Python
我要回答