Можно ли @ mark.parametrize дважды один тест? - PullRequest
2 голосов
/ 01 мая 2020

У меня есть несколько функций, которые raise ValueError для тестирования. Пока что мое решение:

import pytest
import record

@pytest.fixture(name='raised')
def is_value_error_raised(func, args):
    try:
        func(*args)
        return True
    except ValueError:
        return False


@pytest.mark.parametrize(('func', 'args', 'expected'),
                         ((record.check_length, ('Test', 1, 100), True),
                          (record.check_length, ('', 1, 100), False),
                          ))
def test_length_check(raised, expected):
    assert raised == expected


@pytest.mark.parametrize(('func', 'args', 'expected'),
                         ((record.check_lang_code, ['EN'], True),
                          (record.check_lang_code, ['Test'], False),
                          ))
def test_lang_check(raised, expected):
    assert raised == expected

, но в этом подходе я повторяю имя функции в каждом тестовом примере. Я пытаюсь избавиться от этого. Мне было интересно, возможно ли сделать что-то похожее на:

@pytest.mark.parametrize(('func', record.check_lang_code))
@pytest.mark.parametrize(('args', 'expected'),
                         ((['EN'], True),
                          (['Test'], False),
                          ))
def test_lang_check(raised, expected):
    assert raised == expected

Это производит ValueError. Есть ли способ использовать два маркера параметризации, работающих друг с другом? Если нет, как я могу исправить этот код?

1 Ответ

0 голосов
/ 01 мая 2020

Я решил свою проблему, сопоставив функцию тестирования с проверенным элементом внутри прибора. В любом случае, я все еще задаюсь вопросом, возможно ли достичь того же эффекта, используя двойную параметризацию. Другие, более элегантные решения будут по достоинству оценены.

import pytest
import record

@pytest.fixture(name='raised')
def is_value_error_raised(request, args):
    try:
        test_name = request.node.function.__name__
        {'test_length_check': record.check_length,
         'test_lang_check': record.check_lang_code,
        }[test_name](*args)
        return True
    except ValueError:
        return False


@pytest.mark.parametrize(('args', 'expected'), (
        (('Test', 1, 100), True),
        (('', 1, 100), False),
))
def test_length_check(raised, expected):
    assert raised == expected


@pytest.mark.parametrize(('args', 'expected'), (
        (['EN'], True),
        (['Test'], False),
))
def test_lang_check(raised, expected):
    assert raised == expected
...