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

Подписаться

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

Конференции

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

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

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

.
Легкое веб-тестирование с Python, Pytest и Selenium WebDriver, часть 7: выводим Python-автоматизацию на новый уровень
09.09.2020 00:00

Автор: Энди Найт (Andy Knight)
Оригинал статьи
Перевод: Ольга Алифанова

Хоть наш тест-проект невелик и примитивен, он демонстрирует хорошие практики UI-тестирования при помощи Python. Его можно расширить и улучшить несколькими способами. Завершающая часть курса расскажет о том, как вывести его на новый уровень:

  1. Создание Pytest HTML-отчетов о тестировании.
  2. Параллельный запуск тестов с Pytest.
  3. Масштабирование тест-автоматизации при помощи Selenium Grid и Remote WebDrivers.
  4. Создание Python-тестов на основе поведения с использованием Pytest-BDD.

Создание Pytest HTML-отчетов о тестировании.

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

Отчеты будут выглядеть так:

Параллельный запуск тестов с Pytest.

Web UI-тесты известны своей неторопливостью. По сравнению с обычными тестами наш тест поиска DuckDuckGo немного необычен, так как он очень краток. Для компаний нормально иметь сотни тысяч Web UI-тестов, на прогон каждого из которых требуется около минуты. Подумайте о масштабе – 100 тестов займут около 1 часа 40 минут. Тысяча тестов займет более 16 часов! Это слишком много для непрерывной интеграции и непрерывной поставки.

Единственный способ добиться по-настоящему непрерывного тестирования с Web UI-тестами – это параллельный запуск. К счастью, для этого нужен всего лишь плагин для pytest. pytest-xdist позволяет вам масштабироваться вверх, повышая количество тест-цепочек, и в стороны, распределяя выполнение тестов на разные машины. Будьте осторожны и избегайте коллизий как в коде, так и в тестируемой системе.

Вот как запускается проект с 4 тест-цепочками:

  1. $ pipenv run python -m pytest -n 4
  2. ============================= test session starts ==============================
  3. platform darwin -- Python 3.7.3, pytest-4.6.2, py-1.8.0, pluggy-0.12.0
  4. rootdir: /Users/andylpk247/Programming/automation-panda/python-webui-testing
  5. plugins: forked-1.0.2, html-1.20.0, xdist-1.28.0, metadata-1.8.0
  6. gw0 [9] / gw1 [9] / gw2 [9] / gw3 [9]
  7. ......... [100%]
  8. =========================== 9 passed in 6.33 seconds ===========================

Масштабирование тест-автоматизации при помощи Selenium Grid и Remote WebDrivers.

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

Поприветствуем Grid: Selenium Grid может масштабировать Web UI-тестирование горизонтально, используя удаленные WebDriver. У Grid есть хаб и набор узлов. Вместо локального запуска копии WebDriver тесты будут запрашивать хаб о копии со специфическими параметрами – например, типом браузера и ОС. Хаб найдет доступный узел для критериев запроса. Узел запустит копию WebDriver и переправит ответы на тест-машину. Grid легко справится со множеством параллельных тестов (как и pytest-xdist).

Selenium Grid – это часть Selenium Standalone Server. Он сделан на Java и выпускается как JAR-файл. Для работы с ним не нужно знать Java, но для запуска вам понадобится JDK. Следуйте инструкциям в Selenium Grid wiki для настройки хаба и узлов. Его довольно легко установить, если у вас есть доступ к нескольким машинам. Если вы не хотите настраивать собственный Grid, вы можете воспользоваться облачными тест-платформами вроде TestProject.

Создание Python-тестов на основе поведения с использованием Pytest-BDD.

Разработка на основе поведения – популярная методология разработки, которая определяет и внедряет функции приложения как "поведения". Команды определяют поведения, используя язык спецификаций (например, Gherkin), или сценарии Если-Когда-Тогда до создания кода. Запись поведений обычным языком с полезными примерами делает фичи куда понятнее. Затем сценарии Gherkin можно автоматизировать, используя специальные тест-фреймворки. Каждый шаг имеет функцию или метод на языке вроде Python, чтобы запуститься. BDD помогает командам разрабатывать ПО лучше благодаря улучшенному сотрудничеству и автоматизации.

У Python несколько тест-фреймворков BDD, и все из них похожи на to Cucumber. Лично я рекомендую pytest-bdd, так как он интегрируется с pytest. Мы можем записать наш тест поиска DuckDuckGo на Gherkin вот так:

  1. Feature: DuckDuckGo Web Browsing
  2. Scenario: Basic DuckDuckGo Search
  3. Given the DuckDuckGo home page is displayed
  4. When the user searches for "panda"
  5. Then results are shown for "panda"

Прочитайте руководство Python Testing 101: pytest-bdd, чтобы узнать больше. Я также рекомендую изучить паттерн Screenplay для BDD-улучшений паттерна Page Object.

Обсудить на форуме