Автор: Ник Караманиолас (Nick Karamaniolas) Оригинал статьи Перевод: Ольга Алифанова
Решение проблем и автоматизация задач в нескольких проектах: наша общая QA-библиотека
Если вашей команде тоже приходится справляться со сложностями множества проектов по разработке ПО, вы знаете, что тут нужен не только опыт – тут требуются инновационные решения.
Моя команда создает несколько различных продуктов. Чтобы убедиться, что мы систематически достигаем высококачественных результатах во всех этих проектах, мы разработали общую библиотеку, которая объединяет связанную с тестами функциональность всех проектов и способствует повторной применимости. Компоненты этой библиотеки делают для нас многое, и сегодня я расскажу, как один из них помогает нам отчитываться о результатах тестов и понимать, почему тест упал.
Звезда нашей QA-библиотеки: наш личный обработчик аттачей Allure
Allure, легкий инструмент генерации отчетов о тестировании, - это сердце нашей отчетности. Он выдает детализированные интерактивные HTML-отчеты о прогоне тестов. Он поддерживает множество языков и тест-фреймворков, и поэтому достаточно гибок для применения в различных окружениях разработки. Allure помогает командам визуализировать результаты тестов, давая внятный и полный обзор процесса запуска тестов, позволяет лучше понимать итоги прогона и быстро выявить проблемы (узнать об Allure больше можно здесь).
Allure и из коробки прекрасное решение, но без специальных доработок к прогонам нельзя автоматически прикреплять такие артефакты, как скриншоты и файлы логов. Поэтому мы разработали обработчик аттачей Allure. Он поддерживает такие тест-фреймворки, как Selenium и Playwright, и помогает добиться полноты документации и отчетности об артефактах тестов, что ускоряет дебаг и улучшает понятность результатов тестирования. Этот мощный инструмент помогает с дебагом и отчетностью, бесшовно интегрируя скриншоты, логи и файлы трассировки Playwright в отчеты Allure.

Обычный отчет Allure без вложений
Какие проблемы Allure мы хотели решить?
До того, как мы сделали обработчик аттачей Allure, командам не хватало внятной, полезной и емкой отчетности о тестах Selenium и Playwright. Каждый проект существовал изолированно, и в результате мы дублировали усилия по сохранению и передаче тест-артефактов, а наши подходы не соответствовали друг другу.
В результате увеличивалось время и затраты на разработку, что усложняло стандартизацию практик тестирования в организации. Отсутствие унифицированного метода захвата и передачи тест-артефактов часто приводило к недостаточной для дебага информации, что ухудшало нашу способность быстро выявлять и исправлять проблемы.
Создавать или покупать? Исследуем инструментарий тестирования
Прежде чем написать первую строчку кода решения или тратить деньги на сторонний инструмент, мы изучили альтернативы и подходы, которые потенциально могли бы нам помочь. Вот несколько значимых из них:
1. pytest-html. Этот плагин pytest генерирует привлекательные HTML-отчеты. Он полезен, но его возможности по прикреплению артефактов ограничены, особенно когда дело касается визуальных элементов и детализированных логов. Простота плагина и удобство его использования очень привлекательны, но он не дает той глубины, которая требуется нашим многогранным тест-окружениям.
2. Специализированные решения. Мы думали о разработке специализированного инструмента отчетности, подогнанного под наши специфические нужды. Такой подход дал бы нам полный контроль над функциональностью и интеграциями. Однако это также потребовало бы значительных усилий по разработке и постоянной поддержке, что отъедало бы ресурсы от ключевых задач. Создание решения с нуля, отвечающего нашим требования к функциональности и надежности, потребовало бы значительного времени и опыта.
В конце концов мы решили разработать обработчик аттачей Allure. К этому нас подтолкнула нужда в едином гибком решении, которое бесшовно интегрировалось бы с существующими фреймворками команд и давало возможность генерировать всеобъемлющие отчеты. Наше решение включает несколько готовых библиотек, что упрощает разработку и обеспечивает устойчивую функциональность.
- Selenium и Playwright. Мы используем эти устоявшиеся тест-фреймворки для поддержки как браузерной автоматизации, так и полноценного сбора артефактов.
- Отчеты Allure. Базируясь на мощном фреймворке отчетности Allure, мы обеспечиваем визуальную привлекательность наших отчетов и их детализацию, отвечающую нуждам различных заинтересованных лиц.
- Существующие плагины pytest. Мы используем плагины pytest для интеграции с нашими наборами тестов, что позволяет пользоваться знакомыми инструментами и сгладить кривую обучения команды.
Комбинируя эти хорошо известные библиотеки со своими доработками, мы создали решение, отвечающие нашим нуждам и в то же самое время выигрывающее от надежности широко применяемых инструментов и поддержки их сообществ!
Вкратце о нашем решении
Нашей основной целью при создании инструмента был захват детализированных артефактов тестирования и их прикрепление к отчетам Allure, чтобы улучшить наши отчеты при помощи критически важных данных, которые могут пригодиться в случае падения теста.
Ключевые возможности:
- Скриншоты и файлы логов для Selenium. Обработчик автоматизирует прикрепление скриншотов состояния браузера, источников DOM, куки-файлов и логов консоли, что позволяет в любой момент получить полное представление о тест-окружении.
- Файлы трассировки для Playwright. Для проектов, использующих Playwright, обработчик прикрепляет к отчетам файлы трассировки, которые крайне важны для детального анализа результатов запуска тестов. Эти файлы включают скриншоты, логи сети и многое другое, детально описывая условия и результаты тестов.
- Кроссплатформенная совместимость. Мы заложили в обработчик оперативную гибкость, и он поддерживает и фреймворк Selenium, и Playwright, давая возможность командам пользоваться функциональностью вне зависимости от набора технологий под капотом.
Эта интеграция не только упрощает дебаг, но и значительно улучшает эффективность нашей отчетности. Это позволяет инженерам, менеджерам, владельцам продукта (и да, даже нам, тестировщикам) глубже разобраться в результатах автоматизированных тестов.
Внутри обработчика аттачей Allure: подробный технический обзор
Погрузимся в работу обработчика с Selenium и Playwright, объясняя, как все устроено под капотом.
Интеграция с Selenium
Для тестов на основе Selenuim обработчик применяет многоплановый подход захвата тест-артефактов.
- Умеренное использование инициализации WebDriver. Свойство webdriver инициализирует копию Selenium WebDriver только при первичном доступе, что снижает потребление ресурсов тестами, которые в этом не нуждаются.
- Прикрепление логов и скриншотов. Методы вроде attach_selenium_screenshot и attach_selenium_logs захватывают и прикрепляют различные артефакты Selenium (скриншоты, исходный код страницы, куки, файлы логов консоли и сети) к отчету Allure для детального анализа тестов.
- Обработка сетевого лога. Метод _process_selenium_network_logs фильтрует и форматирует исходные файлы логов производительности из Selenium, включая конкретные события XMLHttpRequest (XHR), а затем прикрепляет их к отчету Allure.
Использование Selenium Webdriver и прикрепление полезной информации к отчетам Allure:
@property def webdriver(self): """ По требованию загружает и возвращает копию Selenium WebDriver при необходимости. Это свойство обеспечивает инициализацию WebDriver только при первом доступе. Этот подход полезен в сценариях, когда WebDriver требуется не для всех тестов, что снижает ненужные издержки на инициализацию. Копия WebDriver берется из фикстуры Pytest «driver», которая задается в настройке теста. Возвращает: WebDriver: Копия Selenium WebDriver, полученная из фикстуры """ if not hasattr(self, "_webdriver"): self._webdriver = self.request.getfixturevalue("driver") return self._webdriver @staticmethod def _process_selenium_network_logs(selenium_network_logs: list) -> str: """ Обрабатывает файлы сетевых логов Selenium, извлекает и форматирует сетевые запросы и события ответов. Этот метод фильтрует исходные файлы логов производительности, полученные из Selenium WebDriver, оставляя только события XMLHttpRequest (XHR), а конкретно "Network.requestWillBeSent" и "Network.responseReceived". Аргументы: selenium_network_logs (list): Список исходных файлов логов, полученных из лога производительности Selenium WebDriver. Возвращает: str: Строку в формате JSON с отфильтрованными сетевыми событиями. """ logs_list = [ json.loads(log["message"])["message"] for log in selenium_network_logs if json.loads(log["message"])["message"]["method"] in ["Network.requestWillBeSent", "Network.responseReceived"] and json.loads(log["message"])["message"]["params"]["type"] == "XHR" ] return json.dumps(logs_list, indent=2, sort_keys=True) def attach_selenium_screenshot(self): """ Прикрепляет скриншот текущего состояния Selenium WebDriver к отчету Allure. Скриншот прикрепляется в формате PNG с заранее заданным именем. """ allure.attach( self.webdriver.get_screenshot_as_png(),
name="Screenshot", attachment_type=allure.attachment_type.PNG, ) def attach_selenium_logs(self): """ Прикрепляет различные файлы логов из Selenium WebDriver к отчету Allure. Включает исходный код страницы (DOM), куки, логи консоли браузера и обработанные файлы сетевых логов. Каждый лог прикрепляется с определенным именем и в определенном формате. """ allure.attach( self.webdriver.page_source,
name="DOM",
attachment_type=allure.attachment_type.JSON)
allure.attach(
str(self.webdriver.get_cookies()),
name="Cookies",
attachment_type=allure.attachment_type.JSON)
allure.attach(
str(self.webdriver.get_log("browser")),
name="Browser console",
attachment_type=allure.attachment_type.JSON)
allure.attach(
self._process_selenium_network_logs(
self.webdriver.get_log("performance")),
name="Network logs",
attachment_type=allure.attachment_type.JSON)
Интеграция с Playwright
При работе с Playwright обработчик аттачей Allure расширяет его возможности, добавляя полноценные файлы трассировки, крайне важные для анализа результатов прогона.
- Условное прикрепление файлов трассировки: метод attach_playwright_tracefile прикрепляет файлы трассировки Playwright к отчету Allure при выполнении определенных условий, основываясь на падении теста и флаге trace_on_failure.
- Генерация и прикрепление файлов трассировки: метод _generate_and_attach_tracefile генерирует файл трассировки Playwright, прикрепляет его к отчету Allure и удаляет файл, убедившись, что он создан в пределах заданного времени ожидания.
- Аргументы и операции: методы используют Playwright BrowserContext для управления трассировками, с возможностью условного прикрепления на основании результатов теста. Они содержат конкретные сообщения и имена файлов для отчета.
Использование Playwright BrowserContext для генерации богатого информацией файла трассировки:
def attach_playwright_tracefile(self, context, trace_on_failure=True): """ При выполнении условий прикрепляет файлы трассировки Playwright к отчету Allure на основании статуса падения теста. Если `trace_on_failure` - истина, а текущий тест отмечен как упавший, генерируется и прикрепляется файл трассировки. В противном случае, если `trace_on_failure` - ложь, файл трассировки генерируется и прикрепляется всегда. Аргументы: context (BrowserContext): Копия Playwright BrowserContext. trace_on_failure (bool, опционально): Определяет, надо ли прикреплять файл трассировки только в случае падения теста. По умолчанию истина. """ if trace_on_failure: # Проверяет, упал ли текущий тест if hasattr(self.request.node, "pytestmark") and any( mark.name == "failed_test" for mark in self.request.node.pytestmark ): message = "Step failed: A trace zip file was produced. Head over to https://trace.playwright.dev/ and simply drag & drop the file there" self._generate_and_attach_tracefile(context, message) else: message = "A trace zip file was produced. Head over to https://trace.playwright.dev/ and simply drag & drop the file there" self._generate_and_attach_tracefile(context, message) def _generate_and_attach_tracefile( self, context, message="traces generated." ): """ Генерирует файл трассировки Playwright trace file, прикрепляет его к отчету Allure, а затем удаляет файл. Перед вызовом этого метода надо начать трассировку, используя `context.tracing.start(...)` в начале теста или в ходе фазы настройки. Это обеспечивает захват всего процесса выполнения теста. После завершения действий теста этот метод можно вызвать для остановки трассировки, сохранения файла, его прикрепления к отчету Allure и очистки путем удаления файла. Аргументы: context (BrowserContext): Копия Playwright BrowserContext, которая используется для остановки трассировки и генерации файла. message (str, опционально): Сообщение для прикрепления к отчету Allure вместе с файлом трассировки. По умолчанию "traces generated.". """ allure.attach( message, name="Test failure!", attachment_type=allure.attachment_type.TEXT, ) with allure.step(message): timestamp_now = time.strftime("%Y%m%d-%H%M%S") trace_filename = f"{current_dir_path}/trace_{timestamp_now}.zip" context.tracing.stop(path=trace_filename) failed_scenario_name = self.request.node.originalname max_wait_time = 10 # максимальное время ожидания генерации файла после tracing.stop (в секундах) start_time = time.time() while ( not os.path.isfile(trace_filename) and (time.time() - start_time) < max_wait_time ): if not os.path.isfile(trace_filename): raise FileNotFoundError( f"The trace file was not created within the maximum wait time of {max_wait_time} seconds." ) allure.attach.file( trace_filename, "trace_{failed_scenario_name}.zip", extension="zip", ) os.remove(trace_filename)
Пошаговое руководство по запуску обработчика аттачей Allure
Благодаря бесшовной интеграции с окружениями Selenium и Playwright использовать обработчик аттачей Allure в наших фреймворках и проектах очень легко.
Ниже – пошаговые руководства, описывающие, как мы используем обработчик в наших проектах.
Запуск обработчика с Selenium
Настройка
- Убедиться, что commons_lib (имя нашей общей библиотеки) включена в зависимости проекта.
- Настроить Selenium WebDriver нужным для тест-окружения образом.
- Создать экземпляр AllureAttachmentsHandler в начале теста или в методе настройки.
- Использовать методы обработчика для прикрепления нужных артефактов на разных стадиях теста.
Реализация
Пример использования
Using the Allure Attachments Handler within our testing framework and projects is straightforward, from selenium import webdriver from commons_lib.allure_attachments_handler import AllureAttachmentsHandler driver = webdriver.Chrome() allure_handler = AllureAttachmentsHandler(driver) def test_login_functionality(): try: driver.get("https://example.com/login") driver.find_element(By.ID, "username").send_keys("myusername") driver.find_element(By.ID, "password").send_keys("mypassword") driver.find_element(By.ID, "loginButton").click() assert "Dashboard" in driver.title, "Login failed or did not redirect to the Dashboard." except Exception as e: allure_handler.attach_selenium_screenshot() allure_handler.attach_selenium_logs() raise e finally: driver.quit(
Для проектов на основе Selenium извлекаются и прикрепляются к отчетам логи консоли браузера, скриншот приложения, куки и данные сети.

Запуск обработчика с Playwright
Настройка
- Убедиться, что commons_lib (имя нашей общей библиотеки) включена в зависимости проекта.
- Настроить окружение Playwright и задать необходимый контекст браузера.
- Начать трассировку до выполнения иных действий в тесте, чтобы записались все взаимодействия.
- При выполнении определенных условий прикрепить файл трассировки по завершении теста в зависимости от его результатов.
Реализация
Пример использования
import pytest from playwright.sync_api import sync_playwright from commons_lib.allure_attachments_handler import AllureAttachmentsHandler @pytest.fixture def browser(): with sync_playwright() as p: browser = p.chromium.launch() yield browser browser.close() def test_page_interactions(browser): page = browser.new_page() page.goto("https://example.com") page.click("#some-button") # Проверка условий if not page.query_selector("#expected-element"): allure_handler = AllureAttachmentsHandler(page.context) allure_handler.attach_playwright_tracefile() page.close()
В проектах Playwright при падении теста прикрепляется файл трассировки. Этот файл очень помогает нам при дебаге и исправлении падений тестов.

Преимущества использования обработчика аттачей Allure
Появление обработчика аттачей Allure значительно улучшило эффективность и понятность наших отчетов.
- Улучшение дебага. Систематически сохраняя детализированные артефакты вроде скриншотов, логов и файлов трассировки, разработчики могут быстро выявить первопричины падений, не воспроизводя сценарии вручную.
- Повышение прозрачности тестов. Отчеты Allure, обогащенные подробными артефактами, дают более ясную картину тестов и результатов – команде и заинтересованным лицам проще понять, что пошло не так и почему.
- Эффективное использование ресурсов. Возможность обработчика прикреплять файлы при выполнении определенных условий позволяет эффективно использовать ресурсы, прикрепляя артефакты только в случае падения теста, что упрощает управление хранилищем и эффективное распределение мощностей.
- Стандартизированная отчетность. Стандартизированный подход к прикреплению тест-артефактов серьезно повышает однородность отчетов в разных проектах и командах. Это упрощает межкомандное сотрудничество и передачу знаний.
Взгляд вперед и назад
Единое решение для тест-артефактов
Обработчик аттачей Allure кардинально изменил наши процессы тест-автоматизации, дав нам унифицированное автоматизированное решение по захвату и передаче тест-артефактов в проектах Selenium и Playwright. Этот инструмент эффективно справился с проблемами рассогласованного захвата артефактов, затрат ручного труда и неполной информацией для дебага. Теперь у нас улучшился дебаг, повысилась прозрачность тестов, а отчетность стандартизирована во всей компании.
Повышенная прозрачность и принятие информированных решений
Эффективная отчетность и логирование жизненно важны для успешности тест-автоматизации. Четкие детализированные отчеты дают заинтересованным лицам всю необходимую информацию и возможность вникнуть в результаты тестов. Это упрощает принятие информированных решений и своевременное вмешательство в случае возникновения проблем. Всеобъемлющее логирование дает детализированный контекст, необходимый для диагностики и эффективного разрешения проблем., что снижает затраты времени на дебаг и в результате повышает надежность ПО. Эти практики помогают убедиться, что все вовлеченные хорошо понимают процесс тестирования и могут быстро и эффективно среагировать на потенциальные проблемы.
Умеренная разумная инвестиция приводит к значительной выгоде
Результативно обслуживая как фреймворк Selenium, так и Playwright, обработчик аттачей Allure служит примером того, как стратегическая работа с инструментами приводит к значительным улучшениям процесса разработки. Она гарантирует, что всеобъемлющее логирование и диагностическая информация постоянно сохраняются и отражаются в отчетах, поддерживая устойчивость тестирования и развивая культуру непрерывного улучшения. Этот инструмент не только модернизировал дебаг, но и улучшил общие практики обеспечения качества в наших проектах, подчеркнув критическую роль эффективной отчетности и логирования в высококачественной разработке ПО. Обсудить в форуме |