Настройка набора тестов для вашего кода может показаться препятствием, к которому вы не готовы, но эта библиотека берет на себя большую нагрузку.
Тестирование — неотъемлемая часть разработки программного обеспечения. Это помогает выявлять ошибки на ранней стадии и снижает вероятность ошибок в дальнейшем.
Pytest — один из самых популярных фреймворков для тестирования Python. Он позволяет вам писать небольшие и читаемые тесты, которые можно масштабировать по мере роста вашего приложения. Узнайте, как настроить и использовать Pytest с кодом Python.
Настройка Pytest
Перед установкой Pytest лучше создать виртуальную среду чтобы изолировать тестовую среду, чтобы избежать конфликтов с другими пакетами и зависимостями.
Чтобы создать виртуальную среду, выполните следующую команду перед установкой Pytest.
python -m venv тесты
Это создаст новую виртуальную среду с именем test в вашем текущем каталоге. Чтобы активировать среду, выполните эту команду, если вы используете Linux или Mac:
исходные тесты/бен/активировать
Для Windows выполните эту команду:
тесты\\скрипты\\активировать
Чтобы установить Pytest, вы можете использовать pip, менеджер пакетов Python, с помощью этой команды в своем терминале:
пип установить pytest
Если у вас нет Пипа, не волнуйтесь; ты можешь установить Pip на Windows, Mac и Linux.
Выполните следующую команду, чтобы проверить, правильно ли вы установили Pytest.
pytest --версия
Это должно вернуть установленный номер версии.
Создание вашего первого теста
Рассмотрим следующую функцию, которая складывает два числа и возвращает результат.
дефadd_numbers(а, б):
возвращаться а + б
Несколько вещей могут пойти не так с этой функцией. Например, рассмотрим, что произойдет, если вы вызовете функцию с нечисловыми значениями, такими как None или значение типа string. Это некоторые из потенциальных пограничных случаев, которые могут привести к сбою функции.
Один из первых написанных вами тестов должен проверить, возвращает ли функция ожидаемый результат. Для этого вы можете использовать ключевое слово assert, чтобы сравнить фактический результат функции с ожидаемым результатом. В случае с функцией add_numbers тестовая функция может выглядеть так:
дефtest_add_numbers():
утверждать add_numbers(2, 3) == 5
утверждать add_numbers(-1, 1) == 0
утверждать add_numbers(0, 0) == 0
Эта тестовая функция включает три оператора assert, каждый из которых сравнивает выходные данные функции add_numbers с ожидаемым значением. Первый тест проверяет, что сложение 2 и 3 возвращает 5, второй тест проверяет, что сложение -1 и 1 возвращает 0, а третий тест проверяет, что сложение 0 и 0 возвращает 0.
Как запускать тесты с помощью Pytest
После того, как вы написали свои тесты, следующим шагом будет их запуск. Чтобы сделать это с помощью Pytest, перейдите в каталог, содержащий ваш тестовый файл, и выполните команду pytest:
питест
Если все работает как положено, вы увидите сообщение о том, что все тесты прошли успешно. Однако, если какое-либо из утверждений не выполняется, Pytest сообщит об ошибке и покажет вам входные значения, вызвавшие ошибку.
Например, допустим, вы запустили следующую тестовую функцию для функции add_numbers:
дефtest_add_numbers():
утверждать add_numbers(2, 3) == 6
утверждать add_numbers(-1, 1) == 0
утверждать add_numbers(0, 0) == 0
Первое утверждение завершится ошибкой, так как ожидаемое значение равно 6, а фактическое значение равно 5 (сумма 2 и 3). Pytest вернет следующее сообщение:
Это сообщение показывает вам входные значения, которые вызвали это значение, а также сообщает вам, каким должно быть фактическое значение. Это упрощает быстрое выявление и исправление ошибок в вашем коде.
Использование Pytest.raises для утверждения исключений
Теперь давайте напишем тест, чтобы покрыть один из крайних случаев функции add_numbers. Когда вы передаете функции нечисловой аргумент, например None, Python должен вызвать исключение TypeError.
Вы уже должны быть обработка исключений в ваших программах Python, и вы можете проверить, правильно ли ваш код вызывает их.
Для этого скопируйте следующую тестовую функцию в свой файл. Он использует менеджер контекста pytest.raises, чтобы проверить, вызывает ли вызов функции add_number с «None» исключение TypeError.
Импортировать питест
дефtest_add_numbers_with_invalid_inputs():
с pytest.raises (TypeError):
add_numbers(Никто, 2)
Затем запустите Pytest из командной строки. Если исключение не возникнет, тест завершится ошибкой.
Вы можете пойти дальше и проверить детали сообщения об исключении. Менеджер контекста создает объект ExceptionInfo с подробностями.
Например, в этой тестовой функции подтвердите сообщение об исключении следующим образом:
дефtest_add_numbers_with_invalid_inputs():
с pytest.поднимает(Ошибка типа) как exc_info:
add_numbers(Никто, 2)
утверждать exc_info.value.args[0] == "неподдерживаемый тип(ы) операнда для +: 'NoneType' и 'int'"
Если сообщение не совпадает с сообщением в тесте, Pytest укажет на сбой.
Как использовать параметризованное тестирование для одновременного тестирования нескольких входных данных
Вместо того, чтобы вручную вызывать функцию с несколькими входными данными, например:
дефtest_add_numbers():
утверждать add_numbers(2, 3) == 6
утверждать add_numbers(-1, 1) == 0
утверждать add_numbers(0, 0) == 0
Pytest предоставляет функцию параметризованного тестирования, которая позволяет вам делать то же самое проще. Вот как вы можете переписать тестовую функцию выше:
Импортировать питест
@pytest.mark.parametrize("а, б, ожидается", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0)
])
дефtest_add_numbers(а, б, ожидается):
утверждатьadd_numbers(а, б)== ожидается
Как запустить несколько тестов
Пока вы написали только два теста для функции add_numbers. Для более сложных функций с большим количеством тестов вы можете сгруппировать их в класс.
Например, вот как можно создать тестовый класс для функции добавления.
сорттестаддфункция:
@pytest.mark.parametrize («а, б, ожидаемо», [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0),
])
дефtest_addition_with_numbers(я, а, б, ожидаемый):
утверждать add_numbers (a, b) == ожидается
дефtest_add_numbers_with_invalid_inputs(себя):
с pytest.raises (TypeError) как exc_info:
add_numbers(Никто, 2)
утверждать exc_info.value.args[0] == "неподдерживаемый тип(ы) операнда для +: 'NoneType' и 'int'"
Обратите внимание, что вам нужно добавить к имени класса префикс «Test», чтобы Pytest мог идентифицировать его как тестовый класс и запустить его.
Pytest имеет гораздо больше возможностей
Используя Pytest, вы можете автоматически проверять, работает ли ваш код так, как вы ожидаете. Pytest предлагает множество других функций, таких как фикстуры, которые позволяют вам настраивать и удалять тестовые данные, а также метки для настройки метаданных в ваших тестовых функциях.
Кроме того, вы можете интегрировать Pytest в конвейер непрерывной интеграции и запускать тесты автоматически и непрерывно при изменении кода.