Возможно ли глобально установить стандартную функцию `ids` для параметризации pytest? - PullRequest
2 голосов
/ 04 апреля 2019

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

Это сгенерирует два теста с идентификаторами "1" и "2" соответственно.Проблема в том, что у меня есть много тестов, организованных в несколько классов и файлов.Из-за этого я бы хотел глобально установить test_id_builder в качестве функции ids для всех параметризованных тестов в моем проекте.Есть ли способ сделать это?

Ответы [ 3 ]

3 голосов
/ 05 апреля 2019

Просто реализуйте пользовательский хук 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
2 голосов
/ 04 апреля 2019

Вы можете сделать свой заказ 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
0 голосов
/ 04 апреля 2019

Нет способа globally установить идентификаторы.но вы можете использовать pytest-generate-tests для генерации тестов из какого-то приспособления other.что other прибор может быть ограничен до session, что в целом будет имитировать предполагаемое поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...