Вернуться к статьям

Тестирование на практике: как начать писать автотесты на Python с использованием pytest

Программирование 14.02.2026 21 просмотров

Ключевые слова

python pytest автотесты тестирование автоматизация тестирования юнит-тесты примеры тестов инструменты для тестирования разработка на python
Тестирование на практике: как начать писать автотесты на Python с использованием pytest

Автоматизация тестирования — одна из важнейших практик в современной разработке ПО. Даже если вы пишете код "для себя" или только начинаете, минимальный набор тестов экономит время и предотвращает критические ошибки. В этой статье мы разберём, как интегрировать автоматические тесты в Python-проект, используя популярный фреймворк pytest — и с чего начать, если вы ещё не писали автотесты.

Почему важно тестировать код автоматически

Автоматические тесты:

  • Помогают находить ошибки на ранней стадии
  • Дают уверенность при рефакторинге и добавлении новых функций
  • Облегчают командную разработку
  • Оформляются как "живущая" документация проекта
  • Экономят время на ручных проверках

Чем раньше вы внедрите автотесты, тем проще будет поддерживать и развивать ваш код. А с такими инструментами, как pytest, писать тесты становится проще и даже интересно.

Что такое pytest и почему он популярен

pytest — это фреймворк для написания и запуска тестов в Python, ориентированный на простоту, расширяемость и читаемость. Вот его основные плюсы:

  • Лаконичный и понятный синтаксис
  • Отдельное окружение для каждого теста
  • Гибкая система фикстур (fixtures) для подготовки данных
  • Удобные инструменты запуска, отчётов и параметризации
  • Много плагинов для интеграции с другими инструментами

Установка pytest

Установить pytest очень просто:

pip install pytest

Рекомендуется использовать venv или другой менеджер виртуальных окружений, чтобы не "засорять" глобальную систему зависимостей.

Создание первого теста

В качестве примера создадим простую функцию и проверим её с помощью pytest.

# my_math.py

def add(a, b):
    return a + b

Теперь напишем тестовый файл. Важно: pytest ищет файлы, начинающиеся с test_, например: test_my_math.py.

# test_my_math.py
from my_math import add

def test_add_positive_numbers():
    assert add(2, 3) == 5

def test_add_negative_numbers():
    assert add(-2, -3) == -5

def test_add_zero():
    assert add(0, 5) == 5

Запуск тестов

Чтобы запустить все тесты в директории, используйте команду:

pytest

Вы увидите лаконичный отчёт — прошли ли тесты, а если нет, где и почему возникла ошибка.

Банк советов для тех, кто начинает

1. Пишите тесты с самого начала

Начинать тестировать стоит не тогда, когда "проект станет большим", а сразу — даже для пары функций. Чем меньше изменений, тем проще интегрировать тесты.

2. Следуйте стандартной структуре

Храните тесты либо рядом с исходниками (например, project/test_*.py), либо в отдельной папке tests/. Пример:

project/
├── my_math.py
├── tests/
│   └── test_my_math.py

3. Используйте осмысленные имена тестов

Имена функций должны отражать, что вы тестируете. Например, test_add_negative_numbers.

4. Проверяйте граничные и ошибочные случаи

Тесты должны охватывать не только "хорошие" случаи, но и ошибки, исключения, неожиданные аргументы и так далее.

Пример теста на обработку ошибок

Давайте добавим обработку исключения и протестируем его:

# my_math.py

def add(a, b):
    if not (isinstance(a, (int, float)) and isinstance(b, (int, float))):
        raise TypeError("Both arguments must be numbers")
    return a + b
# test_my_math.py
import pytest
from my_math import add

def test_add_type_error():
    with pytest.raises(TypeError):
        add("a", 1)

С помощью pytest.raises можно проверить, что ваша функция действительно выбрасывает ожидаемое исключение.

Что такое фикстуры, и зачем они нужны

Фикстуры — способ заранее подготовить окружение или данные, которые нужны тестам. Например, подключение к базе данных, создание тестового файла, подготовка объекта.

# tests/conftest.py
import pytest

@pytest.fixture
def sample_list():
    return [1, 2, 3]

# test_some.py

def test_sum(sample_list):
    assert sum(sample_list) == 6

Фикстуру sample_list можно "подключать" к любым тестам — она автоматически создастся перед запуском каждого.

Частые ошибки новичков

  • Игнорирование тестов "ради скорости" — экономия минуты приводит к затратам часов на отладку в будущем.
  • Смешивание исходного кода и тестов — старайтесь держать их в разных файлах/папках.
  • Отсутствие проверки негативных сценариев — тестируйте не только "правильный" ввод, но и ошибки.
  • Сложные и длинные тесты — разбивайте на отдельные, пишите лаконично.

Дальнейшие шаги: что изучить после основ

  • Параметризация тестов (@pytest.mark.parametrize), чтобы уменьшить копипасту
  • Моки и патчи (unittest.mock, pytest-mock), чтобы "заменять" сложные зависимости
  • Генерация отчётов (pytest-html, pytest-cov — для покрытия кода тестами)
  • Запуск тестов в CI/CD (см. статью о GitHub Actions на сайте)

Заключение

Регулярное автоматизированное тестирование — ценный навык, который значительно улучшает качество и поддерживаемость вашего кода. Благодаря pytest начать просто: установите, создайте пару простых тестов, и уже через день-два вы почувствуете разницу в продуктивности и спокойствии за результат. Не бойтесь экспериментировать, используйте справку и документацию фреймворка, и пусть ваши проекты становятся надёжнее с каждым тестом!