我目前正在嘗試在以下上下文中使用 pytest 的參數(shù)化功能:我有多個功能,應(yīng)該使用一組通用的測試用例進行測試。根據(jù)測試的功能,相同的測試用例應(yīng)該通過或失敗。我想出了一個愚蠢的例子來說明這一點: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不幸的是,似乎不可能只通過額外的分數(shù)(就像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實現(xiàn)這一目標的好方法是什么?
2 回答

阿波羅的戰(zhàn)車
TA貢獻1862條經(jīng)驗 獲得超6個贊
我不得不發(fā)現(xiàn)我的問題的答案相對簡單。該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條經(jīng)驗 獲得超8個贊
如果您試圖僅標記字符串測試的總和,您可以這樣做:
# Universal test cases
TESTCASES = [
? ? "a,b,result", [
? ? ? ? (1, 1, 2),
? ? ? ? pytest.mark.xfail(("a", "a", "aa"))
? ? ? ? ]
? ? ]
添加回答
舉報
0/150
提交
取消