Программирование • 12 сентября 2024 • 5 мин чтения

Как фреймворк Pytest упрощает тестирование кода

Рассказываем, почему разработчики и тестировщики любят этот инструмент и предпочитают его другим фреймворкам.

Что такое Pytest

В стандартной библиотеке Python есть набор инструментов для написания тестов. Он подходит для простых задач — проверки работы отдельных функций или небольших классов: например, если нужно убедиться, что функция правильно складывает числа или небольшой класс правильно обрабатывает данные. Но когда проект усложняется, а количество тестов растёт, нужны более гибкие инструменты — например, чтобы проводить тесты с разными наборами данных или проводить выборочные тестирования.

Один из таких инструментов — фреймворк для тестирования кода Pytest. Он позволяет писать тесты в виде простых функций, а не классов, использует всего одну команду для проверки условий — assert. Это делает код читаемым, а тесты — понятными. К тому же для фреймворка есть множество плагинов, которые упрощают работу с ним.

С помощью Pytest можно тестировать:

  • Функции — например, проверять, правильно ли суммируются числа.
  • Классы и методы — например, проверить, что банковский счёт правильно создаётся с нужным балансом, корректно пополняется и позволяет снимать деньги, не допуская отрицательного баланса. Pytest помогает структурировать тесты для каждого метода, упрощая их поддержку и проверку правильности работы кода.
  • API — чтобы убедиться, что сервер возвращает правильные ответы на запросы.
  • Базы данных — проверить, что запросы к базе данных возвращают правильные результаты.

Представим, что программист разработал функцию, которая суммирует элементы списка. Ему нужно убедиться, что она работает правильно. Разберём, как разработчик будет действовать с Pytest и без этого фреймворка.


Вручную


С Pytest

Пишет отдельные скрипты для тестирования функции, а затем вручную проверяет результаты. Это отнимает много времени и усилий
Создаёт файл с тестами один раз и запускает Pytest, который автоматически проверяет результаты
Каждый раз, когда он будет изменять код, придётся вручную запускать функцию с разными входными данными и проверять результаты
Добавляет тестовую функцию, которая проверяет результат
Разработчик сам должен разобраться, прошёл тест или нет. Если что-то не так — исправить ошибку и снова запустить скрипт
Запускает Pytest и сразу видит, прошёл он или нет. Pytest предоставляет подробные отчёты о результатах тестирования, показывая, какие тесты прошли, а какие нет

Фреймворки для тестирования используют не только разработчики, но и тестировщики-автоматизаторы. От классических тестировщиков они отличаются знанием языков программирования и более глубоким пониманием работы ПО. Например, чтобы использовать Pytest, тестировщику нужно освоить язык программирования Python. С этого начинается курс «Автоматизатор тестирования на Python». Студенты изучают основы языка и принципы объектно ориентированного программирования. Затем приступают к написанию простых юнит-тестов и постепенно учатся организовывать тестирование веб-приложений.

Станьте автоматизатором тестов на Python за 5 месяцев

Освоите pytest, Selenium WebDriver и другие инструменты, научитесь строить процесс автоматизации, будете учиться у тестировщиков из Яндекса.

Преимущества и недостатки


Плюсы


Минусы

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

def test_sum():
assert sum([1, 2, 3]) == 6

Изучение расширенных функций. Например, чтобы разобраться, как работают фикстуры или как писать плагины, потребуется некоторое время и усилия.

Порог входа для Pytest выше, чем для unittest: потребуется время, чтобы вникнуть в функциональное программирование.

Читаемость. Тесты, написанные с использованием Pytest, понятны и легко читаемы. Это делает их доступными не только для автора, но и для других членов команды. Например, тест на проверку правильности суммы чисел выглядит как обычная функция Python, что облегчает понимание и поддержку.

Совместимость с другими фреймворками. Если в проекте уже используется другой фреймворк для тестирования, с ним запустить тест Pytest не получится.

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

Мощные возможности. Фикстуры позволяют подготовить тестовую среду один раз и использовать её в нескольких тестах. Метки помогают организовать тесты и выбирать, какие тесты запускать. Например, продолжительные тесты помечают как slow и запускают отдельно от быстрых.

Установка и настройка Pytest

Самый простой способ установить Pytest — c помощью команды pip в терминале:

pip install -U pytest

Так выглядит установка Pytest в Windows. Она начнётся не сразу, а примерно через минуту

Для установки можно использовать poetry — инструмент для управления зависимостями и пакетами в проектах на Python. Он помогает легко устанавливать нужные библиотеки и следить за тем, чтобы все версии этих библиотек были совместимы друг с другом. Вот так будет выглядеть установка pytest с помощью poetry:

poetry add --dev pytest

Специальной настройки Pytest не требует.

Как писать тесты

Проверим функцию, которая определяет, является ли число чётным.

1. Создаём Python-файл. Это можно сделать в среде разработки (IDE) или в текстовом редакторе вроде «Блокнота». Назовём его test_example.py. Важно, чтобы расширение было .py, — так pytest поймёт, что имеет дело с python-файлом.

2. Пишем код теста. Чётное число делится на 2 без остатка, а нечётное — с остатком. Сначала мы создаём функцию is_even, которая принимает на вход одно число и возвращает True, если число чётное, и False, если нет. number % 2 — это выражение делит число на 2 и возвращает остаток. Если остаток равен 0, значит, число чётное, и функция возвращает True. Если остаток не равен 0, значит, число нечётное, и функция возвращает False.

Готовый код выглядит так:

def is_even(number):
return number % 2 == 0

def test_is_even():
assert is_even(2) == True # 2 — чётное число
assert is_even(3) == False # 3 — нечётное число
assert is_even(0) == True # 0 — считается чётным числом
assert is_even(-4) == True # -4 — чётное число