Вопрос с собеседования · Python

Как писать тесты на pytest — assert, запуск, параметризация?

JuniorТестирование
Ещё спрашивают так:
  • Чем pytest лучше unittest?
  • Как параметризовать тест в pytest?
Коротко

Тест — функция с именем test_… в файле test_*.py, проверки — обычный assert: pytest показывает, какие значения не совпали. Запуск — команда pytest (или pytest путь::имя_теста). Один тест на много входов — @pytest.mark.parametrize. Ожидаемое исключение — with pytest.raises(ValueError).

  • pytest -x — остановиться на первой ошибке, -k — выбрать тесты по имени
  • Тест проверяет одно поведение и не зависит от порядка запуска
  • Данные и подготовку выносят в фикстуры

А ещё unittest работает в pytest без изменений, но новые тесты проще писать в стиле pytest

Подробно

Пример:

import pytest
from shop import price_with_discount

@pytest.mark.parametrize("price, percent, expected", [
    (100, 10, 90),
    (100, 0, 100),
    (50, 100, 0),
])
def test_discount(price, percent, expected):
    assert price_with_discount(price, percent) == expected

def test_negative_percent():
    with pytest.raises(ValueError):
        price_with_discount(100, -5)

Хорошие привычки: имена тестов описывают поведение, один сценарий — один тест, без обращения к сети и реальной базе в модульных тестах, тесты запускаются в CI.

Что хотят услышать

  • Соглашения об именах и assert.
  • Параметризация и pytest.raises.
  • Независимость тестов.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Функции test_… с обычным assert, parametrize для наборов входов, pytest.raises для исключений
  • ✗Тесты пишут только классами-наследниками unittest.TestCase, а исключение проверяют через падение теста
  • ✗Тесты должны запускаться строго в определённом порядке
  • ✗Чтобы проверить исключение, тест должен упасть

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования