1

我目前正在尝试在以下上下文中使用 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()它可以通过 IDs 来完成。

# 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

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

4

2 回答 2

0

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

# Universal test cases
TESTCASES = [
    "a,b,result", [
        (1, 1, 2),
        pytest.mark.xfail(("a", "a", "aa"))
        ]
    ]

在这里阅读https://docs.pytest.org/en/2.8.7/parametrize.html#:~:text=#%20content%20of%20test_expectation.py

于 2020-08-27T10:09:45.840 回答
0

我不得不发现我的问题的答案相对简单。该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
于 2021-02-16T18:30:44.010 回答