繁体   English   中英

pytest:通过夹具参数化测试用例

[英]pytest: Parameterized test cases via fixtures

你如何编写一个产生/返回参数化测试参数的夹具(一种方法)?

例如,我有一个测试如下:

@pytest.mark.parametrize(
    "input,expected", 
    [("hello", "hello"),
    ("world", "world")])
def test_get_message(self, input, expected):
    assert expected == MyClass.get_message(input)

我没有inputexpected通过@pytest.mark.parametrize传递,而是对以下方法感兴趣:

@pytest.fixture(scope="session")
def test_messages(self):
    # what should I write here to return multiple 
    # test case with expected value for each?
    pass

def test_get_message(self, test_messages):
    expected = test_messages["expected"] # somehow extracted from test_messages?
    input = test_messages["input"]       # somehow extracted from test message?
    assert expected == MyClass.get_message(input)

要将参数移动到夹具中,您可以使用夹具参数:

@pytest.fixture(params=[("hello", "hello"),
    ("world", "world")], scope="session")
def test_messages(self, request):
    return request.param

def test_get_message(self, test_messages):
    input = test_messages[0]   
    expected = test_messages[1]
    assert expected == MyClass.get_message(input)

您还可以将参数放入单独的 function (与parametrize相同),例如

def get_test_messages():
    return [("hello", "hello"), ("world", "world")]

@pytest.fixture(params=get_test_messages(), scope="session")
def test_messages(self, request):
    return request.param

对我来说,您似乎想返回一个字典数组:

@pytest.fixture(scope="session")
def test_messages():
    return [
        {
            "input": "hello",
            "expected": "world"
        },
        {
            "input": "hello",
            "expected": "hello"
        }
    ]

要在测试用例中使用它,您需要遍历数组:

def test_get_message(self, test_messages):
    for test_data in test_messages:
        input = test_data["input"]
        expected = test_data["expected"]
        assert input == expected

但我不确定这是否是最好的方法,因为它仍然被认为只是一个测试用例,所以它只会在输出/报告中显示为一个测试用例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM