Pytest что такое фикстура

Фикстуры pytest : явные, модальные, расширяемые¶

Тестовые фикстуры инициализируют тестовые функции. Они обеспечивают надежность тестов, согласованнность и повторямость их результатов. При инициализации можно настраивать сервисы, состояния, переменные окружения. Доступ к ним осуществляется через аргументы тестовых функций; для каждой фикстуры, используемой тестовой функцией, в самой функции, как правило, существует соответствующий аргумент, имя которого совпадает с наименованием фикстуры.

фикстуры имеют явные имена и активируются путем их объявления в тестовых функциях, модулях, классах и проектах.

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

управление фикстурами расширяется от простого модуля до комплексного функционального тестирования, позволяя параметризовать фикстуры и тесты в соответствии с конфигурацией и опциями компонентов, или повторно использовать фикстуры внутри функции, класса, модуля или тестовой сесси в целом.

Фикстуры как аргументы функций¶

Фикстура smtp_connection() вызывается для создания объекта-функции.

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

Фикстуры: яркий пример внедрения зависимостей¶

Фикстуры позволяют тестовым функциям легко получать предварительно инициализированные объекты и работать с ними, не заботясь об импорте/установке/очистке.

Вот яркий пример внедрения зависимостей, где фикстуры играют роль внедренного объекта, а тестовые функции являются потребителями объектов-фикстур.

conftest.py : расширение фикстур¶

Расширение тестовых данных¶

Область действия (уровень) фикстуры: расширение фикстуры на все тесты класса, модуля, сессии¶

Мы видим, что оба оператора assert 0 упали. И, поскольку pytest показывает значения входящих параметров, мы также можем увидеть, что в обе тестовые функции был передан один и тот же объект smtp_connection (с уровнем модуля). В итоге, мы выполнили только одно smtp-подключение для обеих тестовых функций вместо двух.

Если вы предпочитаете создавать одно smtp-подключение на сессию, можно просто задать параметру scope значение session :

pytest кэширует только один экземпляр фикстуры одновременно. Это значит, что при использовании параметризованных фикстур pytest может вызывать фикстуру для заданного уровня больше одного раза.

Область действия package (экспериментальная возможность)¶

Эта возможность рассматривается как экспериментальная и в последующих версиях может быть удалена, если при ее использовании будут обнаружены подводные камни или серьезные проблемы. Поэтому, пожалуйста, используйте ее с осторожностью и не забывайте сообщать об обнаруженных проблемах.

Динамическая область действия¶

В ситуациях, когда требуется значительное время для инициализации фикстуры (например, при создании процессов docker-контейнеров), такая возможность может быть очень полезна. Например, можно использовать опцию командной строки для определения области действия процессов docker-контейнеров в разных виртуальных средах:

Порядок создания фикстур¶

Рассмотрим следующий код:

s1 : фикстура с самой широкой областью действия ( session ).

m1 : фикстура второго уровня ( module ).

a1 : фикстура с областью действия function ( function-scoped fixture) и параметром autouse = True : экземпляр этой фикстуры будет создан до создания остальных function-scoped фикстур.

f3 : function-scoped фикстура, которую запрашивает функция f1 : ее нужно создать в момент запроса

Финализаторы в фикстуре / выполнение завершающего кода¶

Операторы print и smtp.close() будут выполнены после завершения последнего теста модуля независимо от того, было ли вызвано исключение или нет.

Обратите внимание, что можно использовать синтаксис yield с оператором with :

Использование финализатора менеджера контекста contextlib.ExitStack() гарантирует корректное закрытие соединений, вне зависимости от того, вызвала ли установочная часть кода фикстуры исключение. Это удобно, поскольку позволяет корректно очищать все ресурсы, созданные фикстурой, даже если один из них не удастся создать или получить:

Если в приведенном примере попытка установить соединение «C28» будет неудачной, «C1» и «C3» все равно будут корректно разорваны.

Обратите внимание: если исключение было вызвано во время выполнения установочной части (до оператора yield ), завершающий код (после yield ) выполнен не будет.

Альтернативным способом добиться выполнения завершающего кода является использование метода addfinalizer объекта request-context для регистрации финализатора.

Вот пример использования addfinalizer для разрыва соединения в фикстуре smtp_connection :

А вот пример фикстуры equipments с использованием addfinalizer :

Фикстуры могут анализировать запрашивающий контекст¶

Фикстура может принимать объект request для анализа контекста запрашивающей тестовой функции, класса или модуля. В продолжением предыдущего примера, давайте прочтем URL сервера из тестового модуля, который использует нашу фикстуру.

Давайте быстренько создадим еще один тестовый модуль, который задает URL сервера в простарнстве имен модуля:

Вуаля! Фикстура smtp_connection взяла имя нашего почтового сервера из пространства имен использующего ее модуля.

Фикстура как фабрика данных¶

Шаблон «фабрика-фикстура» может помочь в ситуациях, когда результат, возвращаемый фикстурой используется много раз в отдельном тесте. Суть в том, что вместо того, чтобы напрямую возвращать данные, фикстура возвращает функцию, которая генерирует данные. И затем эта функция может быть неоднократно вызвана в тесте.

Если нужно, фабрики-фикстуры могут принимать параметры:

Если нужно управлять данными, созданными фабриками, фикстура позаботится и об этом (в нашем случае, будут очищены созданные записи):

Параметризация фикстур¶

Фикстуры могут быть параметризованы, если их нужно вызывать неоднократно, выполняя несколько одинаковых, использующих эти фикстуры, тестов. Обычно повторно запускаемые тестовые функции не зависят друг от друга. И в этом случае параметризация фикстур помогает писать исчерпывающие функциональные тесты для компонентов, которые сами по себе могут быть сконфигурированы разными способами.

Числа, строки, логические значения и значение None имеют свои строковые представления, которые используются в ID теста. Для остальных объектов pytest создает строку, основываясь на имени аргумента. С помощью ключевого слова ids можно самостоятельно определить строку, которая будет использоваться в ID теста для определенного значения фикстуры:

При запуске тестов из примеров выше будут сгенерированы следующие ID:

Использование маркировки с параметризованными фикстурами¶

При выполнении этого теста вызов data_set со значением 2 будет пропущен (skipped).

Модальность: использование фикстур фикстурами¶

Автоматическая группировка тестов экземплярами фикстур¶

pytest минимизирует число активных фикстур во время выполнения теста. Если у вас есть параметризованная фикстура, то каждый экземпляр теста, ее использующий, сначала запускается с очередным параметром, а затем вызывает финализатор прежде, чем слудующий объект фикстуры будет инициализирован. Это, как и другие предоставляемые возможности, облегчает тестирование приложений, которые создают и используют глобальные состояния.

При этом параметризованная фикстура otherarg с уровнем функции инициализировалась и демонтировалась для каждого теста, который ее использовал.

Использование фикстур в классах, модулях и проектах¶

Иногда тестовым функциям не нужно напрямую обращаться к объекту фикстуры. Например, для тестов может потребоваться пустой рабочий каталог, но нам не важно, какой именно каталог это будет. Вот здесь можно посмотреть, как для этого использовать встроенную фикстуру pytest tempfile. Мы же опишем создание такой фикстуры в файле conftest.py :

Затем объявим ее использование в тестовом модуле с помощью декортатора usefixtures :

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

Также можно «прицепить» несколько фикстур сразу

и определять использование фикстуры на уровне модуля, используя возможности механизма маркировки:

Можно также затребовать вашу фикстуру для всех тестов проекта, указав в «ini»-файле:

Внимание! Такая маркировка неэффективна для функций-фикстур! Нижеприведенный код не будет работать так, как должен:

На данный момент подобный код не генерирует ошибок или предупреждений, но это планируется исправить, см. #3664.

Фикстуры autouse (автоматическое использование фикстур)¶

Запустив, получим два успешно пройденных теста:

Вот как работают фикстуры на разных уровнях:

если «autouse»-фикстура определена в тестовом модуле, то ее будут автоматически использовать все тесты модуля.

и, наконец (пожалуйста, используйте эту возможность с осторожностью): если вы определяете «autouse»-фикстуру в плагине, она будет вызываться для всех тестов во всех проектах, где установлен этот плагин. Это может быть полезно, если фикстура работает только при определенных настройках (указанных, например, в «ini»-файлах). Такая глобальная фикстура всегда должна быстро определять, нужно ли ей что-либо делать, чтобы избежать дорогостоящего импорта и вычислений.

И затем, если понадобится, создать тестовый класс, объявив ее использование:

В этом случае фикстуру transact будут использовать все тестовые методы класса TestClass ; остальные тесты не будут к ней обращаться, пока вы так же явно не укажете необходимость ее использования.

Переопределение фикстур разного уровня¶

В больших тестовых наборах вам может понадобиться переопределять глобальные ( global ) или корневые ( root ) фкстуры локальными ( locally ), сохраняя тестовый код читабельным и поддерживаемым.

Переопределение фикстур на уровне каталога (conftest.py)¶

Допустим, наш проект имеет такую файловую структуру:

Как видите, фикстура с одним и тем же именем может быть переопределена на уровне конкретного подкаталога. При этом «базовая» фикстура доступна в переопределенной (см. пример выше).

Переопределение фикстуры на уровне тестового модуля¶

Рассмотрим еще одну файловую структуру:

Пример показывает, как можно переопределить фикстуру с одним и тем же именем в конкретном тестовом модуле.

Переопределению фикстуры с помощью параметризации¶

Возьмем следующую структуру тестов:

В этом варианте значение фикстуры переопределяется значением параметра. Обратите внимание, что значение фикстуры может быть переопределено таким способом, деже если тесты не используют фикстуру напрямую (т. е. она не упоминается в самих функциях).

Замена параметризованной фикстуры непараметризованной и наоборот¶

Расммотрим такую структуру:

Здесь параметризованная фикстура заменяется непараметризованной и наоборот в рамках конкретного тестового модуля. То же самое можно проделывать и для тестовых каталогов/подкаталогов.

Источник

Как в Яндексе используют PyTest и другие фреймворки для функционального тестирования

Всем привет! Меня зовут Сергей, и в Яндексе я работаю в команде автоматизации тестирования сервисов монетизации. Перед каждой командой, которая занимается задачами автоматизации тестирования, встает вопрос: «Какой [фреймворк|инструмент] выбрать для написания своих тестов?» В этом посте я хочу помочь вам на него ответить. Если быть конкретнее, речь пойдет об инструментах тестирования на языке Python, но многие из идей и выводов можно распространить на другие языки программирования, поскольку подходы часто не зависят от конкретной технологии.

Pytest что такое фикстура. image loader. Pytest что такое фикстура фото. Pytest что такое фикстура-image loader. картинка Pytest что такое фикстура. картинка image loader

В Python существует множество инструментов для написания тестов и выбор между ними неочевиден. Я опишу интересные варианты использования PyTest и расскажу о его [плюсах|минусах|неявных возможностях]. В статье вы найдёте развёрнутый пример использования Allure, который служит для создания простых и понятных отчётов автотестов. Также в примерах будет применяться фреймворк для написания матчеров — Hamcrest для Python. Надеюсь, что в итоге, те, кто сейчас в поиске инструментов для тестирования, смогут на основе изложенных примеров быстро внедрить функциональное тестирование в своем окружении. Те же, кто уже использует какой-то инструмент, смогут узнать новые подходы, варианты использования и концепции.

Исторически так сложилось, что в нашем проекте обитает целый зоопарк технологий со сложными схемами взаимодействий друг с другом. При этом их API и функциональность только растут, так что нужно реализовывать интеграционные тесты.

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

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

В своё время была возможность поэкспериментировать, и выбор пал на перспективный фреймворк PyTest. Тогда он ещё не был таким популярным, и его мало кто использовал. Нам понравилась концепция использования фикстур и написание тестов в виде обычного Python-модуля без использования API. В итоге PyTest выстрелил, и теперь мы имеем очень гибкое решение с множеством фич, например:

Написание тестов

Фикстуры

В общепринятом смысле, фикстура — это фиксированное состояние стенда, на котором выполняются тесты. Это так же относится к действию, приводящему систему в определенное состояние.

В pytest фикстурой называют функцию, обёрнутую в декоратор @pytest.fixture. Сама функция выполняется в тот момент, когда она нужна (перед тестовым классом, модулем или функцией) и когда возвращенное ей значение доступно в самом тесте. При этом фикстуры могут использовать другие фикстуры, кроме того можно определять время существования конкретной фикстуры: в текущей сессии, модуле, классе или функции. Они помогают нам содержать тесты в модульном виде. А при тестировании интеграции повторно использовать их из соседних тестовых библиотек. Гибкость и удобство их использования были одними из основных критериев выбора именно pytest. Чтобы воспользоваться фикстурой, нужно указать её имя в качестве параметра к тесту.

Тестируемый сервер

Далее в примерах будут описаны тесты, которые проверяют функционал веб-сервера на Flask, ожидающий соединения на 8081 порту и принимающий GET запросы. Сервер берет строчку из параметра text и в ответе меняет каждое слово на его слово-перевертыш. Отдаётся json, если клиент умеет его принимать:

Напишем тест для тестируемого сервера, который будет проверять его наличие на указанном порту. Проверим, что наш сервер существует. Для этого воспользуемся модулем socket. Создадим фикстуру, которая подготовит сокет и после окончания теста его закроет.

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

Матчеры

Например, следующий тест:

вернет развёрнутый ответ о том, где ошибка:

PyHamcrest позволяет совмещать встроенные в него матчеры. Скомбинировав таким образом has_property и contains_string, получим удобные для использования простые матчеры:

Про Hamcrest можно почитать на Хабре. Ещё стоит обратить внимание на should-dsl.

Параметризация

Когда требуется запускать один и тот же тест с множеством разных параметров, на помощь приходит параметризация тестовых данных. С помощью параметризации утилизируется повторяющийся код в тестах. Визуальное выделение списка параметров помогает повысить читаемость и дальнейшую поддержку. Фикстуры описывают систему, подготавливают её или приводят к требуемому состоянию. Параметризация же используется для формирования набора различных тестируемых параметров, описывающих тест-кейсы.

В таком отчете совершенно непонятно, какой параметр был использован в конкретном запуске.

Маркировка

С помощью маркировки можно пометить тест как вызывающий ошибку, пропустить тест, либо добавить user-defined метку. Всё это метаданные для группировки, либо пометки необходимых тестов, кейсов или параметров. В случае группировки мы используем эту возможность для указания severity к тестам и классам, так как есть более и менее важные тесты.

Выполнение и отладка

Запуск

Дополнительно хотелось бы отметить, что pytest умеет запускать UnitTest и nose тесты.

Отладка

Pytest что такое фикстура. image loader. Pytest что такое фикстура фото. Pytest что такое фикстура-image loader. картинка Pytest что такое фикстура. картинка image loader

Анализ результатов

Результирующий отчет — это полученный набор данных об успешно пройденных, пропущенных и упавших тестах. Упавшие тесты должны описывать состояние системы, шаги, приводящие систему к такому результату, параметры, при которых тест упал, и что ожидалось от системы при использовании этих параметров. В отчете также может быть указано: на каком стенде запускались тесты, какие стенды являются целью, какая версия тестовой библиотеки используется, версии тестируемых сервисов и сопутствующих им приложений, что за тестпак: smoke или functional, какой тестовый файл был запущен. Понятное дело, что такие отчеты должны быть простые и понятные для чтения.

У pytest есть хороший генератор JUnit отчетов, который очень просто интегрируется в Jenkins-CI. Мы пользовались им, пока не появился замечательный фреймворк Allure, для формирования более красивых отчетов с дополнительными возможностями.

Step’ами можно сгруппировать действия, исполняемые в процессе теста, в отдельные блоки. Очень удобно их использовать в фикстурах, которые подготавливают стенд или меняют базу данных. Потом в отчете легко будет понять на какой стадии произошла ошибка и какие шаги были выполнены для данного тест-кейса.

Можно локально проверить, как это будет выглядеть на страничке, запустив следующие команды, если вы используете Ubuntu:

Pytest что такое фикстура. image loader. Pytest что такое фикстура фото. Pytest что такое фикстура-image loader. картинка Pytest что такое фикстура. картинка image loaderallure passed with headers

Если вы открываете отчет локально и у вас в браузере только серое окно с иконками, то вам нужно поправить политику безопасности, так как allure использует javascript для отображения отчета.

В заключении расскажу вам, какие плагины мы используем постоянно, а какие только пробовали:

Кроме этого, существует хорошая документация для PyTest. Также советую вам посмотреть несколько статей про его использование.

Источник

Pytest что такое фикстура

Pytest что такое фикстура. a1. Pytest что такое фикстура фото. Pytest что такое фикстура-a1. картинка Pytest что такое фикстура. картинка a1 Pytest что такое фикстура. a2. Pytest что такое фикстура фото. Pytest что такое фикстура-a2. картинка Pytest что такое фикстура. картинка a2 Pytest что такое фикстура. a3. Pytest что такое фикстура фото. Pytest что такое фикстура-a3. картинка Pytest что такое фикстура. картинка a3

Pytest что такое фикстура. twitter50. Pytest что такое фикстура фото. Pytest что такое фикстура-twitter50. картинка Pytest что такое фикстура. картинка twitter50 Pytest что такое фикстура. facebook50. Pytest что такое фикстура фото. Pytest что такое фикстура-facebook50. картинка Pytest что такое фикстура. картинка facebook50 Pytest что такое фикстура. vkontakte50. Pytest что такое фикстура фото. Pytest что такое фикстура-vkontakte50. картинка Pytest что такое фикстура. картинка vkontakte50 Pytest что такое фикстура. . Pytest что такое фикстура фото. Pytest что такое фикстура-. картинка Pytest что такое фикстура. картинка Pytest что такое фикстура. rss50. Pytest что такое фикстура фото. Pytest что такое фикстура-rss50. картинка Pytest что такое фикстура. картинка rss50

Что пишут в блогах

Заказать — https://shop.testbase.ru/buy/book. Пока самовывоз (см ниже где и когда!!). С почтой разберемся чуть позже.

Где: Кострома / онлайн

2 декабря буду выступать в Костроме. Приходите увидеться очно, или подключайтесь онлайн.

Pytest что такое фикстура. subscribe. Pytest что такое фикстура фото. Pytest что такое фикстура-subscribe. картинка Pytest что такое фикстура. картинка subscribe

Онлайн-тренинги

Что пишут в блогах (EN)

Blogposts:

Разделы портала

Про инструменты

Pytest что такое фикстура. 200x100 images stories library pytest the awesome parts. Pytest что такое фикстура фото. Pytest что такое фикстура-200x100 images stories library pytest the awesome parts. картинка Pytest что такое фикстура. картинка 200x100 images stories library pytest the awesome partsАвтор: Джош Грант (Josh Grant)
Оригинал статьи
Перевод: Ольга Алифанова

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

Фикстуры – интересная и часто смущающая новичков тема в Pytest. Вначале они кажутся контринтуитивными и попросту неправильными, но как только вы поймете, как это работает, фикстуры станут неотъемлемой частью хорошего кода Pytest.

Начнем с начала. Что такое фикстура? Это функция, несущая логику, применяемую в определенном контексте. Предположим для примера, что мы хотим протестировать библиотеку генератора случайных чисел по имени Rando. Мы можем использовать фикстуры для тестирования объект-экземпляра:

Эта фикстура возвращает экземпляр Rando по имени rando, который можно передавать в функции. Каждая функция получает свой собственный независимый экземпляр rando, который можно использовать в логическом теле функции. Это кажется довольно простым синтаксически, но тут происходит кое-что интересное.

Во-первых, мы не используем в коде объектно-ориентированное программирование. Две вышеуказанных функции не обязаны быть членами класса. Фикстура может использоваться этими функциями, и не должна сохранять состояние между тестами.

Приведу пример объектно-ориентированного псевдокода:

Это более традиционный подход, который тоже сработает с классами в Python. Удивительный красивый момент тут в том, что ООП не требуется для работы с Pytest. И, как оказывается, для работы с Pytest ООП лучше вовсе не использовать.

Чтобы понять, почему, давайте рассмотрим другой клевый аспект использования фикстур: фикстуры могут пользоваться другими фикстурами.

Предположим, что в вышеприведенном примере генератора случайных чисел можно создать и передать RandoSeed в экземпляр Rando. Если мы хотим одновременно проверить и использовать его, мы создадим такие фикстуры:

(Не волнуйтесь, если вам не знакома генерация случайных чисел. Суть тут в подходе к тесту, а не в конкретных тестируемых свойствах. Генерация случайных чисел – сложная штука).

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

Эти примеры – это только начало использования фикстур в Python, но они дают общее представление о том, как работают фикстуры и какие проблемы они решают. Жизнь с фикстурами Pytest хороша!

Источник

Python Testing с pytest. Builtin Fixtures, Глава 4

Pytest что такое фикстура. image loader. Pytest что такое фикстура фото. Pytest что такое фикстура-image loader. картинка Pytest что такое фикстура. картинка image loaderВернуться Дальше Pytest что такое фикстура. image loader. Pytest что такое фикстура фото. Pytest что такое фикстура-image loader. картинка Pytest что такое фикстура. картинка image loader

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

Pytest что такое фикстура. image loader. Pytest что такое фикстура фото. Pytest что такое фикстура-image loader. картинка Pytest что такое фикстура. картинка image loader

Исходный код для проекта Tasks, а также для всех тестов, показанных в этой книге, доступен по ссылке на веб-странице книги в pragprog.com. Вам не нужно загружать исходный код, чтобы понять тестовый код; тестовый код представлен в удобной форме в примерах. Но что бы следовать вместе с задачами проекта, или адаптировать примеры тестирования, чтобы проверить свой собственный проект (руки у вас развязаны!), вы должны перейти на веб-страницу книги, чтобы скачать работу. Там же, на веб-странице книги есть ссылка на сообщение errata и дискуссионный форум.

Под спойлером приведен список статей этой серии.

В предыдущей главе вы рассмотрели, что такое фикстуры, как их писать и как их использовать для тестовых данных, а также для setup и teardown кода.

Повторное использование обычных фикстур настолько хорошая идея, что разработчики pytest включили некоторые часто требующиеся фикстуры в pytest. Вы уже видели, как tmpdir и tmpdir_factory используются проектом Tasks в разделе смены области для фикстур проекта Tasks на странице 59. Вы разберете их более подробно в этой главе.

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

Использование tmpdir и tmpdir_factory

Вот простой пример использования tmpdir :

Во второй строке примера tmpdir_factory функция getbasetemp() возвращает базовый каталог, используемый для данного сеанса. Оператор print в примере нужен, чтобы можно было посмотреть каталог в вашей системе. Давайте посмотрим, где он находится:

Использование временных каталогов для других областей

Например, предположим, что у нас есть модуль, полный тестов, и многие из них должны иметь возможность читать некоторые данные из файла json. Мы смогли положить фикстуру объема модуля в сам модуль, или в conftest.py файл, который настраивает файл данных следующим образом:

Фикстура author_file_json() создает временный каталог с именем data и создает файл с именем author_file.json в каталоге данных. Затем записывает словарь python_author_data как json. Поскольку это фикстура области модуля, json-файл будет создан только один раз для каждого модуля, использующего тест:

ch4/authors/test_authors.py

Оба теста будут использовать один и тот же JSON-файл. Если один файл тестовых данных работает для нескольких тестов, нет смысла создавать его заново для обоих тестов.

Использование pytestconfig

С помощью встроенной фикстуры pytestconfig вы можете управлять тем, как pytest работает с аргументами и параметрами командной строки, файлами конфигурации, плагинами и каталогом, из которого вы запустили pytest. Фикстура pytestconfig является ярлыком для request.config, и иногда упоминается в документации pytest как «the pytest config object«(объект конфигурации pytest).

Чтобы узнать, как работает pytestconfig, вы можете посмотреть, как добавить пользовательский параметр командной строки и прочитать значение параметра из теста. Прочитать значение параметров командной строки вы сможете непосредственно из pytestconfig, но чтобы добавить параметр и проанализировать его, вам нужно добавить функцию-ловушку (hook). Функции hook, которые я более подробно описываю в Главе 5, «Плагины», на стр. 95, являются еще одним способом управления поведением pytest и часто используются в плагинах. Однако добавление пользовательской опции командной строки и чтение ее из pytestconfig достаточно широко распространено, поэтому я хочу осветить это здесь.

Добавление параметров командной строки через pytest_addoption должно выполняться через плагины или в файле conftest.py расположенного в верхней части структуры каталога проекта. Вы не должны делать это в тестовом подкаталоге.

Теперь мы можем получить доступ к этим опциям из теста:

Давайте посмотрим, как это работает:

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

Вы также можете получить доступ к встроенным параметрам, а не только к добавляемым, а также к информации о том, как был запущен pytest (каталог, аргументы и т.д.).

Вот пример нескольких значений и параметров конфигурации:

Мы вернемся к pytestconfig, когда я продемонстрирую ini-файлы в главе 6 «Конфигурация» на стр. 113.

Using cache

Обычно мы, тестировщики, думаем, что каждый тест максимально независим от других тестов. Следует убедиться, что не закрались зависимости учёта порядка. Хотелось бы иметь возможность запустить или перезапустить любой тест в любом порядке и получить тот же результат. Кроме того, надо, чтобы сеансы тестирования были повторяемыми и не изменяли поведение на основе предыдущих сеансов тестирования.

Чтобы увидеть их в действии, будем использовать эти два теста:

Вот параметризованный тест с одним сбоем:

Может быть, вы можете определить проблему сразу. Но давайте представим, что тест длиннее и сложнее, и не так уж очевидно, что тут не так. Давайте снова запустим тест, чтобы снова увидеть ошибку. Тестовый случай можно указать в командной строке:

Причина неудачи должна быть более очевидной.

Или вы можете посмотреть в директории кэша:

Интерфейс для кеш-фикстуры простой.

Вот наша фикстура, используемая для фиксации времени тестов:

Поскольку фикстура является autouse, на неё не нужно ссылаться из теста. Объект request используется для получения nodeid что бы использовать в ключе. nodeid — уникальный идентификатор, который работает даже с параметризованными тестами. Мы добавляем ключ с ‘duration/’, чтобы быть добропорядочныи жителями кэша. Код выше yield выполняется до тестовой функции; код после yield выполняется после тестовой функции.

Теперь нам нужны некоторые тесты, которые занимают разные промежутки времени:

Поскольку вы, вероятно, не хотите писать кучу тестов для этого, я использовал random и параметризацию, чтобы легко cгенерить некоторые тесты, которые поспят в течение случайного количества времени, все короче секунды. Давайте посмотрим пару раз, как это работает:

Что ж, это было весело. Давайте посмотрим, что в кэше:

Вы можете легко увидеть данные duration (продолжительности) отдельно от данных кэша из-за префикса имен данных кэша. Тем не менее, интересно, что функциональность lastfailed может работать с одной записью кэша. Наши данные о продолжительности занимают одну запись в кэше для каждого теста. Давайте последуем примеру lastfailed и поместим наши данные в одну запись.

Вот одна из возможных реорганизаций одной и той же функциональности:

После запуска его пару раз, давайте посмотрим на сохраненный кэш:

Использование capsys

Фикстура capsys builtin обеспечивает две функциональные возможности: позволяет получить stdout и stderr из некоторого кода, и временно отключить захват вывода. Давайте посмотрим на получение stdout и stderr.

Предположим, у вас есть функция для печати приветствия для stdout:

Вы не можете проверить это, проверив возвращаемое значение. Вы должны как-то проверить stdout. Вы можете проверить результат с помощью capsys:

Теперь, ‘always print this’ всегда будет выводиться:

Использование monkeypatch

«monkey patch» — это динамическая модификация класса или модуля во время выполнения. Во время тестирования «monkey patching» — это удобный способ взять на себя часть среды выполнения тестируемого кода и заменить либо входные зависимости, либо выходные зависимости объектами или функциями, которые более удобны для тестирования. Встроенная фикстура monkeypatch позволяет сделать это в контексте одного теста. И когда тест заканчивается, независимо от того, пройден он или нет, оригинал восстанавливается, отменяя все изменения патча. Все это очень запутано, пока мы не перейдем к некоторым примерам. После изучения API мы рассмотрим, как monkeypatch используется в тестовом коде.

Фикстура monkeypatch обеспечивает следующие функции:

Параметр raising указывает pytest, следует ли создавать исключение, если элемент еще не существует. Параметр prepend для setenv() может быть символом. Если он установлен, значение переменной среды будет изменено на значение + prepend +

    .

Чтобы увидеть monkeypatch в действии, давайте посмотрим на код, который пишет dot-файл конфигурации. Поведение некоторых программ может быть изменено с помощью настроек и значений, заданных в dot-файле в домашнем каталоге пользователя. Вот несколько строк кода, который читает и записывает cheese-файл персональных настроек:

Одна из проблем с этим заключается в том, что любой, кто запустит этот тестовый код, перезапишет свой собственный cheese-файл настроек. В этом нет ничего хорошего.

Во время теста все, что в модуле cheese вызывает os.path.expanduser() получает вместо этого наше лямбда-выражение. Эта небольшая функция использует функцию модуля регулярного выражения re.sub для замены

Предположим, мы обеспокоены тем, что произойдет, если файл уже существует. Мы хотим быть уверенным, что он будет перезаписан по умолчанию, когда вызывается write_default_cheese_preferences() :

Использование doctest_namespace

Один из способов исправить это-поместить инструкцию import в каждую docstring:

Это определенно устраняет проблему:

Однако он также загромождает docstrings и не добавляет никакой реальной ценности читателям кода.

Я расскажу о запуске doctest из pytest в главе 7 «Использование pytest с другими инструментами» на стр. 125.

Использование recwarn

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

Мы можем убедиться, что предупреждение выдается правильно с тестом:

Значение recwarn действует как список предупреждений, и каждое предупреждение в списке имеет определенную category (категорию), message (сообщение), filename (имя файла) и lineno (номер строки), как показано в коде.

Контекстный менеджер pytest.warns() предоставляет элегантный способ отделения части кода для проверки предупреждения. Элемент recwarn и диспетчер контекста pytest.warns() обеспечивают аналогичную функциональность, поэтому решение о том, что использовать, является исключительно вопросом вкуса.

Упражнения

Что дальше

В этой главе вы рассмотрели несколько встроенных фикстур pytest. Далее вы более подробно рассмотрите Плагины. Нюансы написания больших плагинов могут стать книгой сами по себе; однако небольшие пользовательские плагины являются регулярной частью экосистемы pytest.

Pytest что такое фикстура. image loader. Pytest что такое фикстура фото. Pytest что такое фикстура-image loader. картинка Pytest что такое фикстура. картинка image loaderВернуться Дальше Pytest что такое фикстура. image loader. Pytest что такое фикстура фото. Pytest что такое фикстура-image loader. картинка Pytest что такое фикстура. картинка image loader

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *