Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Pytest Python: Автоматическое тестирование

Когда тестов и файлов с тестами становится много, возникают новые вопросы. Как группировать тесты? Как запустить на выполнение все тесты из одной директории? Если их очень много и они долгие, можно ли запустить их параллельно?

Для решения этих вопросов используют специальные тестовые фреймворки. Они помогают организовать структуру тестов и дают много полезного, например, удобный вывод. С большинством из этих возможностей мы познакомимся далее по курсу. В Python-мире наиболее популярен фреймворк Pytest.

Python, один из немногих языков, в стандартную библиотеку которого уже включен тестовый фреймворк (называется unittest). Было бы логично рассмотреть его здесь, но он глубоко завязан на классы, которые вы можете не знать. Поэтому здесь мы рассматриваем Pytest, который все равно популярнее встроенного.

Ниже находится инструкция, в которой мы создадим проект с нуля и добавим в него тесты.

Настройка и запуск

Создайте где-нибудь на вашем компьютере директорию с названием hexlet_pytest. Зайдите в неё и выполните команды:

# Установка poetry https://python-poetry.org/docs/#installation
poetry new . # Создание базовой структуры
poetry install # Установка зависимостей

Команда poetry new создает болванку python-пакета и сразу добавляет туда Pytest с простым тестом, проверяющим версию текущего пакета. Посмотрите его содержимое в директории tests и проверьте что все работает правильно:

poetry run pytest
# Ниже примерный вывод
platform darwin -- Python 3.8.2, pytest-5.4.3, py-1.10.0, pluggy-0.13.1
rootdir: /private/tmp/hexlet_pytest
collected 1 item

tests/test_hexlet_pytest.py . [100%]

# Такой вывод означает что тест выполнился без ошибок

Теперь добавим немного исходного кода. Создайте файл hexlet_pytest/example.py с таким содержимым:

# Эта функция переворачивает переданную строку
def reverse(string):
    return string[::-1]

Pytest ожидает, что тесты находятся в директории tests, которую располагают в корне проекта. Внутри этого каталога, можно создавать любую структуру, Pytest найдёт все тесты, которые там лежат. Именование файлов с тестами должно быть таким: test_<name>.py. Где <name>, как правило, соответствует имени файла, который тестируется.

Напишем наш первый тест. Создайте файл tests/test_example.py со следующим содержимым:

from hexlet_pytest.example import reverse

def test_reverse():
    assert reverse('Hexlet') == 'telxeH'

def test_reverse_for_empty_string():
    assert reverse('') == ''

Далее мы разберём структуру этого файла, а пока попробуем запустить тест на выполнение:

poetry run pytest
platform darwin -- Python 3.8.2, pytest-5.4.3, py-1.10.0, pluggy-0.13.1
rootdir: /private/tmp/hexlet-pytest
collected 2 items

tests/test_example.py .       [ 50%]
tests/test_hexlet_pytest.py . [100%]

# Один тест запускается так
# poetry run pytest tests/test_example.py

https://replit.com/@hexlet/python-testing-pytest

Ура! Тесты прошли успешно.

Структура

Давайте ещё раз посмотрим на файл с тестом:

from hexlet_pytest.example import reverse

def test_reverse():
    assert reverse('Hexlet') == 'telxeH'

def test_reverse_for_empty_string():
    assert reverse('') == ''

Каждый тест внутри файла это функция начинающаяся с префикса test_. Тестовых функций можно делать любое количество, здесь уже зависит от сложности тестируемого кода. Внутри функций проверки выполняются с помощью инструкции assert. Несмотря на схожесть со встроенной инструкцией в Python, assert в Pytest работает немного по-другому. Попробуйте внести ошибку в исходную функцию и запустите тесты заново:

    def test_reverse():
>       assert reverse('Hexlet') == 'telxeH'
E       AssertionError: assert 'Hexlet' == 'telxeH'
E         - telxeH
E         + Hexlet

tests/test_example.py:4: AssertionError

Вывод Pytest содержит не только исходное утверждение, но и результат вызова функции. Плюсом помечается то что пришло, минусом – то что ожидалось. Благодаря такому выводу, найти и исправить ошибку становится значительно проще.

В работе Pytest есть одна особенность. Если понадобится распечатать что-то на экран, то Pytest ничего не выведет. По умолчанию он перехватывает и подавляет весь вывод. Отключить это поведение можно с помощью флага -s:

poetry run pytest -s
# Теперь видно все что выводится с помощью print

Самостоятельная работа

  1. Выполните все шаги из этого урока
  2. Создайте репозиторий hexlet_pytest на Github
  3. Залейте код на Github

Дополнительные материалы

  1. Pytest
  2. Эталонный пакет
  3. Курс "Python: Настройка окружения"

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

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

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

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

Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
25 мая 10 месяцев

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

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

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

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