Как подчеркнуть ограничения для входных данных в модульном тестировании? - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть параметризованный тест, например:

import pytest
from datetime import time


def get_next_hour(time_str: str):
    t = time(*map(int, time_str.split(':')))
    new_t = time((t.hour + 1) % 24, t.minute)
    return new_t.strftime('%H:%M')


@pytest.mark.parametrize(
    "t_str, result_str",
    [
        ('10:30', '11:30'),
        ('11:30', '12:30'),
    ]
)
def test_good_input(t_str, result_str):    
    result = get_next_hour(t_str)
    assert result == result_str

Тест test_good_input должен работать только с действительными временными строками (для недействительных данных у меня есть другой тест test_bad_input).Как я могу это подчеркнуть - в docstring, или используя assert для входных данных?

С docstring

def test_good_input(t_str, result_str):
    """for t_str allowed only time-valid strings"""

    result = get_next_hour(t_str)
    assert result == result_str

С проверочным вводом

def test_good_input(t_str, result_str):

    assert ':' in t_str, 'input data is not time'

    result = get_next_hour(t_str)
    assert result == result_str

Или есть другие способы

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Вы, конечно, можете добавить дополнительные комментарии или тому подобное.Но у вас уже есть несколько естественных мест для выражения ваших намерений: вашей тестовой функции можно дать более описательное имя, чем test_good_input, аргументам вашей тестовой функции можно дать более описательные имена, а переменные, вспомогательные функции и т. Д. Все могутимеют описательные имена.

Например, вы можете назвать свою тестовую функцию test_getNextHour_withValidTimeString_shouldGiveOneHourLaterTimeString.Я бы сказал, что этим все сказано.Если вы переименуете t_str в valid_time_str или что-то подобное, это дополнительно перенесет сообщение также в верхнюю часть поля параметра.

Я бы не добавлял утверждения или что-либо еще - давая неверную строку времени в качестве ввода,в любом случае привести к провалу теста.

0 голосов
/ 10 февраля 2019

Я бы сказал, что в комментарии должно быть полное предупреждение или строка документации тестовой функции.Это не недоверенный пользовательский ввод, который должен быть проверен;Кроме того, лучше сделать тесты максимально простыми.Если какой-то разработчик неправильно использует тестовые входы, не прочитав сначала документы, это его собственная ошибка.

Тем не менее, проверка аргументов теста, безусловно, возможна с помощью pytest (например, чтобы сообщить разработчикам, что в тестируемом нет ничего плохого)функция, и они используют тест неправильно).Я бы сделал неявную проверку аргументов с помощью косвенной параметризации.В приведенном ниже примере каждый аргумент из mark.parametrize будет сначала передан в прибор с тем же именем, где вы можете выполнить предварительную обработку перед началом теста:

def validate(input):
    try:
        datetime.strptime(input, '%H:%M')
    except ValueError as e:
        pytest.fail('Your test parametrization is wrong. The test argument is erroneous: {}'.format(e))


@pytest.fixture
def t_str(request):
    validate(request.param)
    return request.param


@pytest.fixture
def result_str(request):
    validate(request.param)
    return request.param


@pytest.mark.parametrize(
    "t_str, result_str",
    [
        ('10:30', '11:30'),
        ('11:30', '12:30'),
        ('10:30', 'bar'),
    ],
    indirect=True
)
def test_good_input(t_str, result_str):
    ...

Теперь третий тест не пройдёт с описательнымсообщение об ошибке:

test_spam.py::test_good_input[10:30-11:30] PASSED
test_spam.py::test_good_input[11:30-12:30] PASSED
test_spam.py::test_good_input[10:30-bar] ERROR

============================================= ERRORS ==============================================
__________________________ ERROR at setup of test_good_input[10:30-bar] ___________________________

...

input = 'bar'

    def validate(input):
        try:
            datetime.strptime(input, '%H:%M')
        except ValueError as e:
>           pytest.fail('Your test parametrization is wrong. The test argument is erroneous: {}'.format(e))
E           Failed: Your test parametrization is wrong. The test argument is erroneous: time data 'bar' does not match format '%H:%M'

test_spam.py:15: Failed
================================ 2 passed, 1 error in 0.05 seconds ================================

Дополнительная информация о непрямой параметризации: Откладывание настройки параметризованных ресурсов

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