是否可以为pytest的参数全局设置默认的“ ids”功能?

时间:2019-04-04 16:52:02

标签: python pytest

pytest.mark.parametrize接受一个ids参数,该参数可以是可调用的,如下所示:

def test_id_builder(arg):
    if isinstance(arg, int):
        return str(arg)

    ... # more logic

@pytest.mark.parametrize('value', [1, 2], ids=test_id_builder)
def test_whatever(value):
    assert value > 0

这将生成两个测试用例,分别具有ID“ 1”和“ 2”。问题是我有很多测试,它们组织在多个类和文件中。因此,我想将test_id_builder全局设置为项目中所有 all 参数化测试的ids函数。有办法吗?

3 个答案:

答案 0 :(得分:3)

只需实现自定义pytest_make_parametrize_id挂钩。在您的conftest.py中:

def pytest_make_parametrize_id(config, val, argname):
    if isinstance(val, int):
        return f'{argname}={val}'
    if isinstance(val, str):
        return f'text is {val}'
    # return None to let pytest handle the formatting
    return None

示例测试:

import pytest


@pytest.mark.parametrize('n', range(3))
def test_int(n):
    assert True

@pytest.mark.parametrize('s', ('fizz', 'buzz'))
def test_str(s):
    assert True


@pytest.mark.parametrize('c', (tuple(), list(), set()))
def test_unhandled(c):
    assert True

检查测试参数:

$ pytest -q --collect-only 
test_spam.py::test_int[n=0]
test_spam.py::test_int[n=1]
test_spam.py::test_int[n=2]
test_spam.py::test_str[text is fizz]
test_spam.py::test_str[text is buzz]
test_spam.py::test_unhandled[c0]
test_spam.py::test_unhandled[c1]
test_spam.py::test_unhandled[c2]

no tests ran in 0.06 seconds

答案 1 :(得分:2)

您可以自定义parametrize

import pytest

def id_builder(arg):
    if isinstance(arg, int):
        return str(arg) * 2

def custom_parametrize(*args, **kwargs):
    kwargs.setdefault('ids', id_builder)
    return pytest.mark.parametrize(*args, **kwargs)

@custom_parametrize('value', [1, 2])
def test_whatever(value):
    assert value > 0

为避免到处都将pytest.mark.parametrize重写为custom_parametrize,请使用以下众所周知的解决方法:

old_parametrize = pytest.mark.parametrize

def custom_parametrize(*args, **kwargs):
    kwargs.setdefault('ids', id_builder)
    return old_parametrize(*args, **kwargs)

pytest.mark.parametrize = custom_parametrize

答案 2 :(得分:0)

无法globally设置ID。但是您可以使用pytest-generate-tests从某些other固定装置生成测试。 other固定装置的范围可以是session,总体上将模仿预期的行为。