为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

牛魔王的故事 2023-06-27 13:25:35
我目前正在尝试在以下上下文中使用 pytest 的参数化功能:我有多个功能,应该使用一组通用的测试用例进行测试。根据测试的功能,相同的测试用例应该通过或失败。我想出了一个愚蠢的例子来说明这一点:import pytest# Functions to testdef sum_int(a, b):    assert isinstance(a, int)    assert isinstance(b, int)    return a + bdef sum_any(a, b):    return a + b# Universal test casesTESTCASES = [    "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实现这一目标的好方法是什么?
查看完整描述

2 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

我不得不发现我的问题的答案相对简单。该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


查看完整回答
反对 回复 2023-06-27
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

如果您试图仅标记字符串测试的总和,您可以这样做:


# Universal test cases

TESTCASES = [

    "a,b,result", [

        (1, 1, 2),

        pytest.mark.xfail(("a", "a", "aa"))

        ]

    ]

查看完整回答
反对 回复 2023-06-27
  • 2 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信