Плагины pytest

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

Плагины pytest могут помочь в решении таких задач: параллельное выполнение тестов, управление базами данных, улучшение отчетов об ошибках и интеграция с конвейерами CI/CD. Они упрощают процесс тестирования, делая его более быстрым и надежным, а также сокращая ручные усилия и вероятность ошибок при этом. 

Как установить плагины pytest

Можно использовать pip для добавления плагинов из Python Package Index (PyPI). 

  • Найдите нужный вам плагин на PyPI, или в каталоге плагинов pytest. 
  • Используйте pip для его установки непосредственно в вашу среду: 
pip install <имя плагина> 

Например, чтобы установить pytest-check (популярный плагин для реализации ассертов), выполните следующую команду: 

pip install pytest-check

После этого можно импортировать установленный плагин в свои тестовые наборы.

8 лучших плагинов pytest 

Теперь рассмотрим некоторые плагины с примерами. 

Код примеров на GitHub.

pytest-check 

pytest-check — плагин, который представляет расширенные возможности утверждений (ассертов). Хотя pytest обладает солидным набором утверждений из коробки, плагин pytest-check предлагает нечно большее, позволяя проводить параметризацию и улучшая отчетность о неудачных утверждениях.

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

Чтобы установить этот плагин, выполните следующую команду:

pip install pytest-check

Пример

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

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

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

with check:
    assert len(message_element.text) > 50
    assert message_element.text == message
time.sleep(3)

Здесь тест проверяет, что содержимое отображаемого сообщения превышает 50 символов и соответствует введенному сообщению. Добавление time.sleep(3) делает небольшую паузу, чтобы ответ успел отобразиться на веб-странице перед переходом к следующей итерации. 

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

В приведенном ниже выводе сгенерирован репорт pytest-check, содержащий следующие сведения:

  • Тест не пройден. 
  • Три проверки оказались неудачными. 
  • Подробно о каждой неудачной проверке.

pytest-bdd 

Плагин, который интегрирует принципы поведенческой разработки (Behavior-Driven Development, BDD) в процесс автоматизации тестирования. BDD — подход к разработке ПО, в котором особое внимание уделяется сотрудничеству и коммуникации между стейкхолдерами. 

Подробно о BDD

Чтобы установить плагин, выполните следующую команду:

pip install pytest-bdd

Пример

Чтобы автоматизировать взаимодействие с простой формой с помощью плагина pytest-bdd, вам нужно создать Feature-файл, в котором будут описаны сценарии, которые вы хотите протестировать. В этом случае Feature-файл должен быть структурирован следующим образом:

Feature: Simple Form Demo
  Scenario: Entering a message
    Given the user is on the Simple Form Demo page
    When the user enters the message "My pytest-bdd message" in the input field
    And clicks the Get  button
    Then the user should see the message "My pytest-bdd message"

Убедитесь, что вы организовали этот Feature-файл в папке с именем features в корневой папке вашего проекта. 

В этом файле test_simple_form_demo.py мы определяем функции шагов с помощью декораторов @given, @when и @then, которые предоставляются плагином pytest-bdd. Каждая функция шага соответствует строке в сценарии Gherkin, что позволяет легко сопоставить действия файла функций с кодом на Python. 

Кроме того, описания шагов используют мощные возможности парсинга с помощью метода parsers.parse() для динамического извлечения значений из сценариев Gherkin. 

В этом фрагменте кода мы начинаем с импорта необходимых модулей, включая By для расположения элементов и webdriver для автоматизации браузера. Декораторы @given, @when и @then используются для определения функций шагов.

Функция scenarios() используется для связи определений шагов с feature-файлом, что позволяет плагину pytest-bdd автоматически распознавать и выполнять заданные сценарии. С помощью pytest.fixture настраивается фикстура с именем driver, предоставляющая драйвер ChromeDriver

Функции шагов соответствуют действиям, описанным в сценариях Gherkin. Они взаимодействуют с элементами на веб-странице с помощью метода find_element() и выполняют такие действия, как отправка клавиш и нажатие кнопок. 

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

pytest-xdist 

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

Чтобы установить этот плагин, выполните следующую команду:

pip install pytest-xdist

После установки плагин pytest-xdist легко интегрируется с существующей конфигурацией pytest. Для параллельного выполнения тестов используется флаг -n, после которого указывается количество параллельных процессов, которые нужно запустить.

pytest -n 2

Пример

В файле test_basic.py у нас есть набор тестов для Selenium. Мы создадим пример набора и покажем, как плагин pytest-xdist может сократить общее время выполнения. 

Кроме этого Python-файла мы создадим еще два файла с тем же содержимым, просто изменим название. Наши три Python-скрипта автоматизации — test_basic_1.py, test_basic_2.py и test_basic_3.py. 

Запустим эти скрипты командой pytest:

В приведенном выше выводе терминала видно, что три теста были выполнены успешно, а время выполнения составило 16,68 секунды. 

Теперь запустим те же тесты, используя возможности pytest-xdist. Приведенная ниже команда запустит тесты в трех отдельных процессах одновременно:

pytest -n 3

В приведенном выше выводе терминала видно, что, как и раньше, три теста были запущены и пройдены. Однако время выполнения составило 7,08 секунды, что на 58% меньше.

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

Кроме того, вместе с плагином pytest-xdist вы можете использовать широкие возможности отчетности pytest, такие как pytest-html. Он позволяет генерировать комплексные репорты, которые дают представление о покрытии тестов, производительности и любых сбоях, возникших во время параллельного выполнения. 

Более подробную информацию можно найти в блоге о том, как запускать параллельные тесты pytest.

pytest-randomly 

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

Чтобы установить этот плагин, выполните следующую команду:

pip install pytest-randomly

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

pytest --randomly-seed=1234

Команда запускает pytest с плагином pytest-randomly, используя заданное значение seed, равное 1234. Это значение обеспечивает согласованность результатов рандомизации при многократном выполнении тестов, что облегчает воспроизводимость при отладке и обмене результатами. 

Таким образом, если вы хотите воспроизвести один и тот же порядок выполнения, вы можете использовать один и то же seed. Если хотите изменить порядок, просто меняйте seed при каждом запуске, чтобы тесты выполнялись в другой последовательности.

Пример

Чтобы продемонстрировать работу плагина pytest-randomly, мы будем использовать тот же код и ту же структуру проекта, которые были представлены в разделе pytest-xdist выше.

Запустим эти тесты: test_basic_1.py, test_basic_2.py и test_basic_3.py с помощью команды pytest. 

В приведенном ниже выводе терминала видно, что все три теста были запущены и прошли, а порядок выполнения был следующим: test_basic_1, test_basic_2 и test_basic_3.

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

Теперь запустим те же тесты с помощью плагина pytest-randomly. Приведенная ниже команда запустит тесты:

pytest --randomly-seed=1234

В приведенном выше выводе терминала видно, что три теста были запущены и пройдены, как и раньше. Однако порядок выполнения был следующим: test_basic_1, test_basic_3 и test_basic_2

Если вы запустите те же тесты снова, изменив seed на 9999, порядок выполнения изменится.

В приведенном выше выводе терминала видно, что, как и раньше, три теста были запущены и пройдены. Однако порядок выполнения был следующим: test_basic_2, test_basic_1 и test_basic_3

pytest-html 

Плагин pytest-html представляет собой мощное решение для создания интерактивных HTML-отчетов, которые улучшают наглядность результатов тестирования.

Чтобы установить этот плагин, выполните следующую команду:

pip install pytest-html

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

Пример

Чтобы продемонстрировать работу pytest-html, мы будем использовать тот же код и ту же структуру проекта, что и в разделе pytest-xdist

Теперь запустим эти тесты test_basic_1.py, test_basic_2.py, test_basic_3.py с помощью следующей команды:

pytest --html=report.html

Если проверить папку проекта, то можно заметить, что файл report.html был создан, а в папку проекта также была добавлена папка assets с файлом style.css.

Если открыть файл report.html в браузере, то можно увидеть:

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

pytest-datafiles 

Плагин упрощает процесс управления тестами, легко интегрируя внешние файлы данных, такие как JSON, YAML или текстовые файлы, в тесты Selenium. 

Чтобы установить этот плагин, выполните следующую команду:

pip install pytest-datafiles

Чтобы продемонстрировать работу плагина pytest-datafiles, создадим пример файла данных под названием test_data.json с некоторыми сообщениями, которые будут использоваться в нашей демонстрации:

[
    {"message": "Test Case 1"},
    {"message": "Test Case 2"},
    {"message": "Test Case 3"}
]

В файле test_with_datafiles.py структура тестового сценария в основном остается такой же, как и в предыдущих разделах, и фокусируется на автоматизации демонстрации простой формы. Однако ключевое изменение происходит в функции test_simple_form_demo

Благодаря интеграции pytest-datafiles мы теперь можем динамически перебирать набор сценариев, определенных во внешнем JSON-файле под названием test_data.json. В этом файле хранятся различные тестовые сценарии, каждый из которых содержит отдельное сообщение. Для каждого сценария мы гарантируем, что поле ввода будет очищено перед вводом нового сообщения, что повышает точность теста. 

Теперь запустим эти тесты с помощью команды pytest:

pytest-cov 

Плагин pytest-cov легко интегрируется с pytest, предоставляя простой способ измерения тестового покрытия в проектах автоматизации в Selenium.

Чтобы установить этот плагин, выполните следующую команду:

pip install pytest-cov

Пример

Создайте структуру проекта, как определено в этом репозитории pytest-cov-sample. Внутри файла calculator.py мы создадим две простые функции для вычисления сложения и вычитания двух чисел.

def sum(a, b):
    return a + b
def diff(a, b):
    return a - b

В файле test_calculator.py мы создадим простой тест для проверки некоторых сумм. Мы намеренно не будем добавлять никаких тестов для функции diff().

from myproject.calculator import sum, diff
def test_sum():
    assert sum(2, 3) == 5
    assert sum(-1, 1) == 0
    assert sum(0, 0) == 0

Файл __init__.py нужен только для того, чтобы указать плагину pytest-cov, где должны быть запущены тесты. Запуск тестов с анализом покрытия очень прост. Просто запустите тесты, как вы обычно делаете это с помощью pytest, но с дополнительной опцией -cov и именем папки с тестами tests:

pytest --cov=myproject tests

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

Для дополнительной информации — статья о том, как сгенерировать отчет о покрытии кода в pytest.

pytest-mock 

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

Чтобы установить этот плагин, выполните следующую команду:

pip install pytest-mock

Пример

В этом файле test_sample.py есть функция test_network_error_handling(driver, mocker), которая тестирует поведение Selenium WebDriver при возникновении сетевой ошибки во время попытки навигации. 

Мы используем mocker для имитации метода driver.get. mocker — это экземпляр класса MockFixture, предоставляемый плагином pytest-mock. Он позволяет создавать и настраивать объекты мокирования. 

Мы настроили мокинг так, чтобы при его вызове выбрасывалось исключение, имитирующее состояние сетевой ошибки. Когда мы попытаемся перейти на веб-страницу с помощью driver.get(«https://www.lambdatest.com/selenium-playground/simple-form-demo»), мокированный метод driver.get вызовет исключение, имитируя сетевую ошибку. Мы перехватываем исключение, печатаем его и утверждаем, что сообщение об ошибке содержит Network Error. 

Теперь запустим эти тесты с помощью команды pytest -s, и видим результаты ниже:

Тесты, которые мы запустили выше, были выполнены на локальной Selenium Grid. Можно также использовать плагины pytest с облачными платформами тестирования.

Lambdatest


Какой была ваша первая зарплата в QA и как вы искали первую работу?

Мега обсуждение в нашем телеграм-канале о поиске первой работы. Обмен опытом и мнения.

Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

Мы в Telegram

Наш официальный канал
Полезные материалы и тесты
Готовимся к собеседованию
Project- и Product-менеджмент

? Популярное

? Telegram-обсуждения

Наши подписчики обсуждают, как искали первую работу в QA. Некоторые ищут ее прямо сейчас.
Наши подписчики рассказывают о том, как не бояться задавать тупые вопросы и чувствовать себя уверенно в новой команде.
Обсуждаем, куда лучше податься - в менеджмент или по технической ветке?
Говорим о конфликтных ситуациях в команде и о том, как их избежать
$1100*
медианная зарплата в QA в июне 2023

*по результатам опроса QA-инженеров в нашем телеграм-канале

Собеседование

19%*
IT-специалистов переехало или приняло решение о переезде из России по состоянию на конец марта 2022

*по результатам опроса в нашем телеграм-канале

live

Обсуждают сейчас