我目前正在尝试在以下上下文中使用 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
海绵宝宝撒
TA贡献1809条经验 获得超8个赞
如果您试图仅标记字符串测试的总和,您可以这样做:
# Universal test cases
TESTCASES = [
"a,b,result", [
(1, 1, 2),
pytest.mark.xfail(("a", "a", "aa"))
]
]
添加回答
举报
0/150
提交
取消