Как писать тесты на pytest — assert, запуск, параметризация?
- Чем 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, а исключение проверяют через падение теста
- ✗Тесты должны запускаться строго в определённом порядке
- ✗Чтобы проверить исключение, тест должен упасть
Разбор темы
- Окружение, импорты и тесты на pytest
Виртуальные окружения и зависимости, как работает импорт и чем опасны циклические импорты, __name__ == "__main__", pytest, фикстуры и mock.patch.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.