Исследователи из JetBrains подсчитали, что каждый второй программист, работающий на языке Python, использует фреймворк PyTest для автоматизации тестирования. Почему он так популярен? Подробно разбираемся в возможностях решения и его преимуществах для работы QA-специалистов.
Что такое PyTest
PyTest — фреймворк для быстрого создания автоматических тестов с возможностью масштабирования на языке Python. С помощью этого решения можно не только поддерживать сложное функциональное тестирование приложений и библиотек, но и настраивать параметры запуска тестов, а также разрабатывать окружение для их реализации.
Пример PyTest теста
Напишем тест для проверки работы функции sum2 (x,y). Она возвращает сумму двух входящих аргументов. В тестовом случае test_sum2() мы будем использовать assert для сравнения результата вызова функции sum2 () с ожидаемым значением. Тест будет считаться пройденным, если результаты совпадут, и непройденным, если будут обнаружены расхождения. В этом случае при использовании команды pytest мы увидим сообщение об ошибке.
def sum2(x, y):
return x + y
def test_sum2():
assert sum2(10, 7) == 17
Также полезно: Будет ли востребована профессия тестировщика в 2025 году?
Как работает PyTest
В основу работы PyTest заложен несложный алгоритм: решение использует функции описания тестовых случаев, автоматически выявляет эти функции в коде и выполняет их. Используя PyTest, специалисты могут внедрять в код теста следующие функции и механизмы:
- Assertions (утверждения). Механизм для оценки корректности выполнения кода в тестовых случаях. С их помощью решение сравнивает полученные результаты выполнения кода с ожидаемыми. При обнаружении несоответствия тест считается непройденным и Pytest генерирует сообщение об ошибке.
Пример кода:
def multiply(a, b):
return a * b
def test_multiply():
assert multiply(3, 4) == 12
assert multiply(0, 3) == 0
assert multiply(-2, 3) == -6
- Parametrization (настройка параметров). Установка наборов характеристик для проверки разных вариантов использования кода тестов. Еще позволяет исключить дубли.
Пример кода:
def multiply(a, b):
return a * b
@pytest.mark.parametrize("a, b, expected_result", [ (3, 4, 12), (0, 3, 0), (-2, 3, -6), ])
def test_multiply(a, b, expected_result):
assert multiply(a, b) == expected_result
- Fixtures (фикстуры). Функции для создания и предварительной настройки тестового окружения. Решение запускает фикстуры перед реализацией каждого тестового случая или их группой, чтобы подготовить данные к тестированию.
Пример кода:
import pytest
@pytest.fixture
def setup_data():
data = [5, 6, 7, 8, 9]
return data
def calculate_sum(data):
return sum(data)
def test_calculate_sum(setup_data):
result = calculate_sum(setup_data)
assert result == 35
- Marking (маркировки). Механизм сопоставления дополнительных метаданных с тестовыми случаями или их группами для запуска или пропуска тестов согласно заданным условиям либо для настройки дополнительных действий до или после выполнения тестов.
Пример кода с использованием метки smoke для быстрого проведения основных тестов и regression для проверки стабильности и воспроизводимости отдельных функций приложения:
import pytest
@pytest.mark.smoke
def test_addition():
result = 3 + 3
assert result == 6
@pytest.mark.regression
def test_subtraction():
result = 7 - 3
assert result == 4
@pytest.mark.regression
def test_multiplication():
result = 4 * 5
assert result == 20
@pytest.mark.smoke
@pytest.mark.regression
def test_division():
result = 20 / 2
assert result == 10
- Test sessions (тестовые сеансы). Запуск тестов в разных режимах. Например:
- test discovery — для обнаружения недостатков кода;
- failing tests replay — для воспроизведения отказов;
- coverage reporting — режим с генерацией отчетов о покрытии.
Этот механизм дает возможность подстроить тестирование под требования любого проекта.
Пример кода для проверки корректности операций сложения и вычитания:
import pytest
def add(a, b):
return a + b
def subtract(a, b):
return a - b
def test_addition():
result = add(2, 2)
assert result == 4
def test_subtraction():
result = subtract(5, 3)
assert result == 2
Для запуска тестовых сеансов и реализации всех тестов из этого каталога достаточно указать pytest в командной строке.
Читайте также: Какие бывают этапы и виды тестирования: подробный разбор
Возможности и недостатки PyTest
Разработчики и QA специалисты выбирают PyTest благодаря следующим преимуществам:
- Возможность получить детальную информацию о проваленных тестах. Решение использует универсальный оператор.
- Отсутствие сложных конструкций в синтаксисе кода — он может состоять всего из двух строк.
- Автоматическое обнаружение тестовых функций и модулей. Стандартно Pytest определяет файлы, в которых используются методы и функции с префиксом test вне классов и внутри классов с префиксом Test.
- Автоматическое генерирование отчетов об ошибках в тестах.
- Использование фикстур для работы с параметризованными и несложными тестами и создания контекста для групп тестов.
- Совместимость с Unittest.
- Возможность с помощью меток настраивать условия, входные данные и другие элементы поведения тестов.
- Более 1500 регулярно обновляемых внешних плагинов и наборов разнообразных дополнительных функций.
- Активно развивающееся сообщество профессионалов.
Но отмечают, что у PyTest присутствуют и некоторые недостатки:
- Необходимость тщательно изучать документацию, чтобы понять логику и алгоритмы работы лаконичного кода решения.
- Необходимость устанавливать фреймворк отдельно, так как он не входит в стандартную библиотеку Python. Для этого у вас должен быть установлен Python 3.8 + или PyPy 3.
- Невозможность запускать тесты PyTest на других фреймворках.
Слушатели курса «Тестирование с PyTest» подробно изучают все элементы фреймворка и последовательность написания в нем тестовых случаев, а также приобретают практические навыки в работе с PyTest с помощью тренажера.