pytest
![]() | |
Оригинальный автор(ы) | Крекель и др. |
---|---|
Стабильная версия | 8.3.2 [1] ![]() |
Репозиторий | |
Написано в | Питон |
Платформа | macOS , Windows , POSIX |
Тип | Фреймворк для тестирования программного обеспечения |
Лицензия | МОЯ лицензия |
Веб-сайт | pytest ![]() |
Pytest — это среда тестирования Python , созданная на основе проекта PyPy . Его можно использовать для написания различных типов тестов программного обеспечения, включая модульные тесты , интеграционные тесты , сквозные тесты и функциональные тесты . Его функции включают параметризованное тестирование, фикстуры и утверждений перезапись .
Фикстуры Pytest предоставляют контексты для тестов, передавая имена параметров в тестовых примерах; его параметризация исключает дублирование кода для тестирования нескольких наборов ввода и вывода; а его переписанные операторы утверждения предоставляют подробный вывод о причинах сбоев.
История
[ редактировать ]Pytest был разработан как часть усилий сторонних пакетов по устранению недостатков встроенного в Python модуля unittest. Он возник как часть PyPy, альтернативной реализации Python стандартному CPython . С момента своего создания в начале 2003 года PyPy уделял большое внимание тестированию . В PyPy были модульные тесты для вновь написанного кода, регрессионные тесты на наличие ошибок и интеграционные тесты с использованием набора тестов CPython. [2]
В середине 2004 года появилась среда тестирования под названием utest, и участники PyPy начали конвертировать существующие тестовые примеры в utest. Тем временем на выставке EuroPython 2004 была изобретена дополнительная стандартная библиотека для тестирования под названием std. В этом пакете изложены принципы, такие как переписывание утверждений, того, что позже станет pytest. В конце 2004 года проект std был переименован в py, std.utest стал py.test, а библиотека py была отделена от PyPy. В ноябре 2010 года pytest 2.0.0 был выпущен как отдельный от py пакет. До августа 2016 года он по-прежнему назывался py.test, но после выпуска pytest 3.0.0 рекомендуемой в командную строку точкой входа стал pytest. [3]
Разработчик платформы безопасности Snyk классифицировал Pytest как один из ключевых проектов экосистемы Python из-за его популярности. Некоторые известные проекты, которые перешли на pytest с unittest и носа (еще одного пакета тестирования), включают проекты Mozilla и Dropbox . [4] [5] [6] [7]
Функции
[ редактировать ]Параметризованное тестирование
[ редактировать ]При тестировании программного обеспечения распространена практика отправки значений через тестовые функции и проверки правильности вывода. Во многих случаях для тщательного тестирования функциональности необходимо протестировать несколько наборов ввода/вывода, а написание таких случаев по отдельности может привести к дублированию кода , поскольку большинство действий останутся прежними, отличаясь только значениями ввода/вывода. Функция параметризованного тестирования Pytest исключает такой дублирующийся код, объединяя различные итерации в один тестовый пример, затем запуская эти итерации и отображая результат каждого теста отдельно. [8]
Параметризованные тесты в pytest отмечены значком @pytest.mark.parametrize(argnames, argvalues)
декоратор , где первый параметр , argnames
, представляет собой строку имен, разделенных запятыми, и argvalues
это список значений для передачи в argnames
. Когда в списке несколько имен argnames
, argvalues
будет списком кортежей, где значения в каждом кортеже соответствуют именам в argnames
по индексу. Имена в argnames
затем передаются в тестовую функцию, отмеченную декоратором как параметры. Когда pytest запускает такие декорированные тесты, каждая пара argnames
и argvalues
будет представлять собой отдельный запуск с собственным тестовым результатом и уникальным идентификатором. Затем идентификатор можно использовать для запуска отдельных пар данных. [8] : 52–58 [9]
Утверждать переписывание
[ редактировать ]При написании тестов программного обеспечения оператор утверждения является основным средством сообщения о неудачном тесте, когда ожидаемые значения сравниваются с фактическими значениями. [8] : 32–34 В то время как встроенное ключевое слово Assertion в Python в случае сбоя вызывает только AssertionError без каких-либо подробностей, pytest переписывает ключевое слово Assert Python и предоставляет подробный вывод о причинах сбоев, например, какие выражения в операторе Assert оцениваются. Сравнение можно провести с помощью операторов утверждения unittest (встроенного модуля Python для тестирования): [8] : 32
pytest | юниттест |
---|---|
assert x
|
assertTrue(x)
|
assert x == y
|
assertEqual(x, y)
|
assert x <= y
|
assertLessEqual(x, y)
|
unittest
придерживается более подробного синтаксиса, поскольку он вдохновлен Java языка программирования JUnit , как и большинство библиотек модульного тестирования; pytest достигает того же результата, перехватывая встроенные вызовы утверждений Python, что делает подход более кратким. [8] : 32 [6]
Приборы Pytest
[ редактировать ]Тесты Pytest подтверждают, что компьютерный код работает должным образом. [10] с использованием тестов, которые структурированы в последовательность «организовать, действовать и утверждать», известную как AAA. [11] Его фикстуры обеспечивают контекст для тестов. Их можно использовать для перевода системы в известное состояние и передачи данных в тестовые функции. Фиксаторы практически составляют этап организации в анатомии теста (AAA, сокращение от «организовать» , «действовать» , «утверждать» ). [11] [10] unittest и носа (еще одной сторонней среды тестирования Python) Фикстуры Pytest могут запускаться перед тестовыми примерами в качестве настройки или после тестовых сценариев для очистки, но они отличаются от настроек и демонтажа . Функции, объявленные как фикстуры pytest, помечаются значком @pytest.fixture
декоратор , имена которого затем можно передавать в тестовые функции в качестве параметров. [12] Когда pytest находит имена фикстур в параметрах тестовых функций, он сначала ищет такие фикстуры в том же модуле, а если не находит, ищет такие фикстуры в файле conftest.py. [8] : 61
Например:
import pytest
@pytest.fixture
def dataset():
"""Return some data to test functions"""
return {'data1': 1, 'data2': 2}
def test_dataset(dataset):
"""test and confirm fixture value"""
assert dataset == {'data1': 1, 'data2': 2}
В приведенном выше примере приспособление pytest dataset
возвращает словарь, который затем передается в тестовую функцию test_dataset
для утверждения. Помимо обнаружения фикстур в том же файле, что и тестовые примеры, фикстуры pytest также можно поместить в файл conftest.py в каталоге тестов. Может существовать несколько файлов conftest.py, каждый из которых расположен в каталоге тестов, чтобы можно было обнаружить приспособления для каждого подмножества тестов. [8] : 63
Область применения приспособлений
[ редактировать ]В pytest области действия приспособлений позволяют пользователю определять, когда следует вызывать приспособление. Существует четыре области видимости: область функции , класса область , область модуля и область сеанса. Фикстуры в области функций используются по умолчанию для всех фикстур pytest, которые вызываются каждый раз, когда запускается функция, имеющая фикстуру в качестве параметра. Целью указания более широкой области действия фикстуры является устранение повторных вызовов фикстуры, которые могут замедлить выполнение теста. Фикстуры в области класса вызываются один раз для каждого тестового класса, независимо от того, сколько раз они вызываются, и та же логика применима ко всем остальным областям. При изменении области видимости фикстуры достаточно добавить параметр области в декораторы фикстуры, например: @pytest.fixture(scope="class")
. [8] : 72 [13]
Тестовая фильтрация
[ редактировать ]Еще одной особенностью pytest является его способность фильтровать тесты, при которых для запуска выбираются только нужные тесты или они ведут себя определенным образом, как того желает разработчик. «k» С опцией (например, pytest -k some_name), pytest будет запускать только тесты, имена которых включают some_name
. Обратное верно, где можно бежать pytest -k "not some_name", и pytest запустит все тесты, имена которых не включают some_name
. [14]
Маркеры Pytest могут не только изменять поведение теста, но и фильтровать тесты. Маркеры Pytest — это декораторы Python, начиная с @pytest.mark.<markername>
синтаксис, размещенный поверх тестовых функций. С разными маркерами с произвольными именами запуск pytest -m <markername> в командной строке будут запускаться только те тесты, которые отмечены такими маркерами. [8] : 13 Все доступные маркеры можно просмотреть с помощью pytest --markers вместе с их описаниями; пользовательские маркеры также могут определяться пользователями и регистрироваться в pytest.ini, и в этом случае pytest --markers также перечислит эти пользовательские маркеры вместе со встроенными маркерами. [8] : 147
См. также
[ редактировать ]- JUnit , известная среда тестирования программного обеспечения на основе Java.
- Doctest , известная платформа тестирования Python. на строк документации
- Список фреймворков модульного тестирования
Ссылки
[ редактировать ]- ^ «Выпуск 8.3.2» . 25 июля 2024 г. Проверено 26 июля 2024 г.
- ^ Больц-Терайк, Карл Фридрих (9 сентября 2018 г.). «Блог о статусе PyPy» . ПиПи . Архивировано из оригинала 6 июля 2022 года . Проверено 12 мая 2022 г.
- ^ «История» . pytest . Архивировано из оригинала 16 мая 2022 года . Проверено 13 апреля 2022 г.
- ^ «Примеры проектов» . Пайтест . Архивировано из оригинала 1 февраля 2022 года . Проверено 1 февраля 2022 г.
- ^ Курапати, Нипунн. «Инструменты Pytest с открытым исходным кодом» . Дропбокс . Архивировано из оригинала 11 июня 2024 года . Проверено 1 февраля 2022 г.
- ^ Jump up to: а б Оливейра, Бруно (август 2018 г.). Краткое руководство по запуску pytest . Пакт Паблишинг . ISBN 978-1-78934-756-2 . Архивировано из оригинала 1 февраля 2022 года . Проверено 1 февраля 2022 г.
- ^ "pytest" . Сник . Архивировано из оригинала 27 июня 2022 года . Проверено 12 мая 2022 г.
- ^ Jump up to: а б с д и ж г час я дж Оккен, Брайан (сентябрь 2017 г.). Тестирование Python с помощью Pytest (1-е изд.). Прагматичная книжная полка. ISBN 9781680502404 . Архивировано из оригинала 20 января 2022 года . Проверено 22 января 2022 г.
- ^ «Параметризация приборов и функции тестирования» . pytest.org . Архивировано из оригинала 4 июня 2022 года . Проверено 24 мая 2022 г.
- ^ Jump up to: а б Виафоре, Патрик (12 июля 2021 г.). Надежный питон . O'Reilly Media, Inc. ISBN 978-1-0981-0061-2 . Архивировано из оригинала 3 июля 2022 года . Проверено 3 июля 2022 г.
Тесты проверяют, что то, что вы создаете, работает так, как вы ожидаете.
- ^ Jump up to: а б Хориков, Владимир (январь 2020 г.). Принципы, практики и шаблоны модульного тестирования . Опубликовано издательством Manning Publications. ISBN 9781617296277 . Архивировано из оригинала 4 июня 2022 года . Проверено 4 июня 2022 г.
- ^ «О светильниках» . Пайтест . Архивировано из оригинала 7 февраля 2022 года . Проверено 7 февраля 2022 г.
- ^ Ашвин, Паджанкар (27 февраля 2017 г.). Автоматизация модульного тестирования Python: практические методы для разработчиков и тестировщиков Python . Апресс. ISBN 9781484226766 . Архивировано из оригинала 7 марта 2022 года . Проверено 7 марта 2022 г.
- ^ Молина, Алессандро (февраль 2021 г.). Создание программного обеспечения, управляемого тестированием, с помощью Python . Издательство: Packt Publishing. ISBN 9781838642655 . Архивировано из оригинала 8 марта 2022 года . Проверено 8 марта 2022 г.