Вопрос №55410 от пользователя Sergio в уроке «Плохие и хорошие практики тестирования», курс «Python: Автоматическое тестирование»

Sergio

Не понятен пример с тестом вне тестов. Во-первых сам пример выдает ошибку при тестировании. Во-вторых не понятно, а какой код в этом случае был бы правильным. Такой?

@pytest.fixture
def result():
    # Вызывается тестируемый код
    a = 5
    b = 9
    return a, b

def test_sum(result):
    assert sum(result) == 14
3 1

Станислав Дзисяк

Sergio, приветствую!

Во-первых сам пример выдает ошибку при тестировании.

В примере была опечатка, я её поправил. Функция sum() должна принимать на вход список чисел сумму которых нужно подсчитать sum([5, 9]).

Во-вторых не понятно, а какой код в этом случае был бы правильным. Такой?

Нет не такой. Данный пример демонстрирует неправильный подход в тестировании. Основная идея данного теста - проверить работу функции sum(), а задача фикстур - готовить данные нужные для тестов, или настраивать среду тестирования. В данном примере фикстура используется не по назначению, а именно в ней выполняется вызов тестируемой функции, то есть по факту она содержит часть тестов. Вызов тестируемых функций должен происходить непосредственнл в функциях с тестами, именно для этого они предназначены.

1

Sergio

Приветствую, Станислав! Хочется доразобраться. Задача фикструр - готовить данные. То есть result() должен вернуть данные для тестовой функции. В моем примере result() возвращает 2 значения. Дальше эти данные подставляются в тестируемую функцию и полученный ответ сверяется с правильным значением. В чем ошибка в моем примере? Данные в виде значений лучше передавать через @pytest.mark.parametrize?

0

Станислав Дзисяк

Сергей, приветствую!

В моем примере result() возвращает 2 значения. Дальше эти данные подставляются в тестируемую функцию и полученный ответ сверяется с правильным значением. В чем ошибка в моем примере?

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

0

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Фронтенд-разработчик
Профессия
Разработка фронтенд-компонентов веб-приложений
18 мая 10 месяцев
Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
18 мая 10 месяцев
Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
18 мая 10 месяцев
Иконка программы Node.js-разработчик
Профессия
Разработка бэкенд-компонентов веб-приложений
18 мая 10 месяцев
Иконка программы Fullstack-разработчик
Профессия
Новый
Разработка фронтенд и бэкенд компонентов веб-приложений
18 мая 16 месяцев
Иконка программы Верстальщик
Профессия
Вёрстка с использованием последних стандартов CSS
в любое время 5 месяцев
Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
18 мая 10 месяцев
Иконка программы Разработчик на Ruby on Rails
Профессия
Создает веб-приложения со скоростью света
18 мая 5 месяцев