Pytest — это среда тестирования, основанная на Python. Ее используют для написания и выполнения тестового кода.
Тестировать код важно, потому что:
- даже если баги не нашли, это помогает разработчику быть уверенным в качестве кода;
- с помощью автотестов уменьшается количество регрессионных ошибок — багов, которые обнаруживаются в уже протестированном коде. Бывает, что после внесения изменений в программу перестает работать кусок кода, который не меняли.
Чтобы написать и поддерживать тесты, нужно время. Поэтому разработчики используют дополнительные инструменты, в том числе фреймворк Pytest.
Преимущества Pytest
Pytest подходит и для модульного (тестирование отдельных компонентов ПО), и для функционального тестирования (тестирование способности кода удовлетворять бизнес-требованиям).
У Python есть встроенные инструменты для тестирования, например unittest, но в нем придется писать много шаблонного кода и у него ограниченная возможность повторного использования компонентов (в Pytest это называется приспособлениями). Поэтому многие программисты выбирают Pytest для тестирования приложений.
Вот основные преимущества Pytest перед встроенными инструментами:
- Меньше повторяющегося кода за счет независимости от API.
- Выполнение определенного набора тестов с помощью фильтрации.
- Параметризация тестов — запуск одного и того же теста с разными наборами параметров.
- Гибкость — архитектура библиотеки основана на плагинах, которые можно установить отдельно.
- Полная обратная совместимость с unittest — возможность запуска тестов, написанных на нем.
- Выполнение нескольких тестов параллельно.
- Установочный код можно использовать повторно.
Установка и настройка Pytest
Установить и настроить Pytest можно из командной строки. Для программирования создайте виртуальную среду и работайте в ней. Для Python 3.6+ это делается так:
$ mkdir pytest-skillfactory
$ cd pytest-skillfactory
$ python3 -m venv .venv
$ source .venv/bin/activate # в Windows: $ venv\Scripts\activate.bat
Затем установите Pytest с помощью команды:
$ pip install pytest
Это включит команду pytest в установочной среде. На этом установка завершена.
Требования к названиям
Есть требования к наименованию тестовых файлов и директорий, чтобы Pytest автоматически мог их найти.
- Имя файла должно начинаться с ”test” или заканчиваться “test.py”.
- Имена функций и переменных должны быть написаны в нижнем регистре, а слова должны быть разделены подчеркиванием. При этом имя тестовой функции должно начинаться с “test_”, например “test_skillfactory”.
Пример использования Pytest для тестирования приложения
Протестируем простую функцию приветствия. В файле welcome.py содержится функция, которая возвращает строку с приветствием.
# welcome.py
def hello(name):
return “Hello, “ + name
Теперь протестируем функцию. Для этого придумаем тестовые данные и ожидаемый результат после выполнения функции, а затем сравним, совпадает ли ожидаемый результат с реальным.
В файл welcome_test.py импортируем тестируемую функцию и напишем тест:
# welcome_test.py
from welcome import hello
def test_hello():
name = “SkillFactory”
assert hello(name) == “Hello, SkillFactory”
Ключевое слово assert сравнивает два значения и возвращает True, если они равны, и False — если нет.
Еще можно прописывать сообщение для отладки так:
assert hello(name) == “Hello, noname”, “Сообщение, если тест не прошёл”
Отладочные сообщения нужны, чтобы отследить, какой именно тест не проходит.
В одном файле с тестами может быть не одна тестовая функция, а несколько. Помимо этого, объединить несколько функций можно, поместив их в один класс. Пример:
# содержимое файла test_class_sf.py
class TestClassSF:
def test_one(self):
x = 1
assert x != 1 // False
def test_two(self):
x = 1
assert x != 2 // True
После создания тестов необходимо их запустить.
Запуск тестов
Чтобы просмотреть, какие тесты будут выполняться, не запуская их, и проверить правильность выбора опций, можно использовать:
$ pytest —collect-only
Чтобы выполнить все тесты в каталоге pytest-skillfactory (пример из начала статьи):
$ pytest pytest-skillfactory
Если для команды выше не указать каталог, по умолчанию фреймворк Pytest будет работать в текущем каталоге. Например:
$ pytest
В качестве аргументов можно указать отдельные файлы и даже функции:
$ pytest test_mod.py #запустит все тесты из файла test_mod.py
$ pytest test_mod.py::test_func #запустит функцию test_func из файла test_mod.py
Детализированный сводный отчет
Флаг -r используется для отображения краткой сводной информации о тесте. Так можно получить общую картину обо всех неудачных тестах в одном отчете.
По умолчанию для отображения списка сбоев и ошибок используется fE.
Пример использования флага -r с параметром a:
$ pytest -ra
Опция -r может принимать несколько параметров. В примере выше будут отображены все тесты, кроме пропущенных.
Вот список основных доступных параметров:
- f — тесты, которые не прошли (результат отличается от ожидаемого);
- E — ошибки;
- s — пропущенные тесты;
- p — тесты, которые прошли (результат совпадает с ожидаемым);
- P — тесты, которые прошли и вернули какое-то значение.
Описание всех возможностей Pytest есть в официальной документации.
0 комментариев