Playwright и Allure как хорошая практика для разработки веб-приложения
Привет, меня зовут Иван. Я фронтенд-разработчик из Clevertec в команде, которая создаёт веб-версию приложения для крупного банка. В этой статье я расскажу, почему мы используем Playwright в сочетании с Allure для автоматизации тестирования и оптимизации работы команды.
Разработчики вынуждены вечно искать баланс: как выпускать фичи быстро, качественно и желательно небольшой командой. Наш рабочий рецепт — это фронты + E2E-тесты.
Результаты такие: сейчас в сутки мы прогоняем порядка 1000 автотестов. Чтобы справиться с таким объёмом вручную, пришлось бы завести в команду 15 тестировщиков. Но у нас их двое. И качество приложения от этого не страдает.
Почему мы выбрали Playwright?
E2E-тесты проверяют, как весь стек приложения работает вместе в реальной среде. Они имитируют действия конечного пользователя: нажатие кнопок, заполнение форм, навигацию по страницам и проверку содержимого.
Playwright предоставляет API для автоматизации действий в браузере. Он предлагает удобный способ создания и запуска E2E-тестов, благодаря поддержке браузеров Chromium, Firefox и WebKit, а также поддержке нескольких языков программирования: JavaScript, TypeScript, Python и других.
А ещё это простой и эффективный способ тестирования веб-приложений, которые построены на платформе React — это наш случай.
Вот несколько ключевых моментов, которые я бы подчеркнул исходя из своей практики:
Выбор элементов. Playwright предоставляет удобные методы для выбора элементов на странице: CSS-селекторы, XPath или встроенные методы Playwright. Это упрощает процесс тестирования React-компонентов.
Интерактивные действия. Можно эмулировать различные пользовательские действия: клики, ввод текста и наведение курсора. Это особенно полезно при тестировании интерактивных элементов — кнопок и форм.
Ожидания и асинхронные операции. Мощные механизмы ожидания waitFor синхронизируют выполнение тестов с динамическими изменениями страницы. Это особенно важно для тестирования React-приложений из-за их асинхронной природы.
Тестирование маршрутизации. Позволяет эмулировать переходы по маршрутам и проверять корректность отображения соответствующих компонентов при изменении URL для тестирования навигации.
Проверка состояния React-компонентов, включая их свойства, состояния и внутренний контент, помогает убедиться, что компоненты отображаются правильно и соответствуют ожиданиям.
Интеграция с тестовыми фреймворками Jest, Mocha или Jasmine позволяет писать и запускать тесты React-приложений в привычной среде разработки.
Эти возможности помогают обеспечить стабильность и надежность нашего веб-приложения.
Стартовые настройки Playwright и интеграция с Allure
Установка Playwright: npm install @playwright/test
playwright.config:
Импортируем нужные модули и функции из библиотек:
import { devices, defineConfig } from '@playwright/test';
import { getConfig } from 'testall-playwright';
import { testPlanFilter } from 'allure-playwright/dist/testplan';
Определяем конфигурацию тестов с помощью defineConfig. Внутри используем getConfig для получения конфигурации:
export default defineConfig(
getConfig({
fullyParallel: true,
forbidOnly: !!process.env.CI,
retries: process.env.CI ? 2 : 0,
workers: 7,
reporter: [
['html', { open: 'never' }],
['list'],
[
'allure-playwright',
{
environmentInfo: {
E2E_NODE_VERSION: process.version,
E2E_OS: process.platform
},
suiteTitle: false,
detail: false
}
]
],
use: {
headless: true,
trace: 'retain-on-failure',
video: 'retain-on-failure',
screenshot: 'only-on-failure',
ignoreHTTPSErrors: true
},
Поля настройки тестов по коду выше:
fullyParallel: Включить ли полное параллельное выполнение тестов.
forbidOnly: Запрещает использование only в тестах, если переменная окружения CI установлена.
retries: Количество повторных попыток выполнения тестов в случае неудачи.
workers: Количество параллельных рабочих процессов для выполнения тестов.
reporter: Настройки для отчетов о тестах, включая форматы отчетов и их настройки.
use: Настройки для запуска тестов, такие как headless-режим, запись видео, сохранение скриншотов и т.д.
Определяем проекты для тестирования, каждый со своими настройками:
name: Название проекта.
timeout: Максимальное время выполнения проекта.
expect: Ожидаемые результаты.
testDir: Директория с тестами.
snapshotDir: Директория для хранения снимков экрана.
use: Дополнительные настройки, такие как базовый URL, время ожидания навигации и действий.
projects: [
{
name: ProjectName,
timeout: 180 * 1000,
expect: {
timeout: 15 * 1000,
toHaveScreenshot: { maxDiffPixels: 200 }
},
testDir: './web/tests/mock',
snapshotDir: './web/resources/snapshots/desktop',
// testIgnore: '**/mobile/**',
use: {
baseURL: process.env.BASE_URL,
navigationTimeout: 60 * 1000,
actionTimeout: 45 * 1000,
...devices['Desktop Chrome']
}
}
],
Используем testPlanFilter для настройки фильтрации тестов по плану выполнения:
grep: testPlanFilter()
})
);
Функция testPlanFilter используется для фильтрации тестов в зависимости от их атрибутов или метаданных. Она предназначена для использования с библиотекой allure-playwright, которая интегрирует отчёты в стиле Allure с фреймворком Playwright.
Так же для интеграции с Allure выполните команду: npm install @playwright/test allure-playwright
Пример написания тестов с внутренними настройками
Для создания набора тестов в нашем проекте мы используем следующую модель кода, которая включает настройку метаданных для отчета Allure и определение тестовых случаев:
// Определение набора тестов для функции 'название обычно совпадает с suite'
test.describe('название обычно совпадает с suite', () => {
// Перед каждым тестом выполняем следующие шаги настройки
test.beforeEach(async () => {
// Установка метаданных для отчета Allure
allure.owner(Тестировщик);
allure.feature(берется из Allure поле feature);
allure.epic(берется из Allure поле epic);
allure.suite(берется из Allure поле suite);
// Дополнительные метки Allure для теста
allure.labels(
{ name: 'Developer', value: 'Разработчик' },
{ name: 'layer', value: 'UI Tests' } // Уровень: UI Тесты
);
allure.tag('UI');
// Определение тестов, которые будут запускаться
при каждом отдельном тестовом случае
});
// Определение отдельного тестового случая с конкретным идентификатором Allure
test('Название теста @allure.id=номер', async () => {
// Примеры проверки шагов функционала:
// Проверка функциональности кнопки
// Проверка наличия панели
// Проверка отображения списка
});
Объяснение кода
test.describe: Определяет набор тестов. Название обычно совпадает с названием функции или модуля, который тестируется.
test.beforeEach: Выполняет указанные шаги перед каждым тестом. Здесь устанавливаются метаданные для отчета Allure.
allure.owner: Указывает тестировщика написавшего тест.
allure.feature: Указывает функциональную область, к которой относится тест.
allure.epic: Указывает задачу, связанную с тестом.
allure.suite: Определяет группу тестов.
allure.labels: Добавляет дополнительные метки для классификации тестов.
allure.tag: Добавляет теги для тестов.
test: Определяет отдельный тестовый случай.
Название теста включает уникальный идентификатор для Allure (@allure.id=номер).
Визуализируем результаты тестов с Allure
В работе совместно с Playwright мы используем Allure — фреймворк для создания красивых и информативных отчетов о результатах тестирования. Отчеты содержат информацию о прохождении тестов, скриншоты ошибок, логи, параметры тестов и многое другое. Благодаря интерактивному веб-интерфейсу их удобно просматривать и анализировать.
В нашем проекте команда тестирования создает пошаговую инструкцию в Allure, которая разбита на папки и разделы. Разработчики следуют этим инструкциям, создавая соответствующие тесты.
Прогон в Playwright настроен таким образом, что все написанные тесты автоматически запускаются в определенное время суток. По завершении выполнения тестов формируется отчет в Allure с подробной информацией о пройденных и упавших тестах, а также о выполнении тестовых шагов, включая скриншоты и логи ошибок.
Команда разработчиков и тестирования использует эти отчеты для анализа результатов тестирования. При обнаружении проблем принимаем меры: исправляем дефекты в коде, оптимизируем функциональность или добавляем новые тесты для покрытия новых сценариев использования.
Преимущества использования Allure:
Информативные отчеты, которые легко читать и понимать.
Интерактивный веб-интерфейс с возможностью фильтрации и сортировки данных.
Поддержка разных языков программирования, включая Java, JavaScript, Python и другие.
Интеграция с различными фреймворками тестирования: JUnit, TestNG, pytest и другими.
Многофункциональность: доступно добавление скриншотов ошибок, логов, параметров тестов и другой полезной информации в отчеты.
Итоги: бонусы подхода для команды и заказчика
Автоматизированное тестирование — это способ не тратить ресурсы команды на рутинные задачи и очень быстро обнаруживать ошибки, при этом перераспределяя силы тестировщиков на на более стратегически важные задачи: проектирование тестовых сценариев или анализ результатов. Это важно, потому что мы работаем по спринтам и дважды в неделю отчитываемся о результатах перед заказчиком.
В целом с таким подходом мы быстрее выпускаем новые фичи и постоянно улучшаем качество продукта. А быстрый, предсказуемый и качественный результат — это отличная опция для заказчика.
Если после прочтения статьи у вас остались вопросы, отвечу на них в комментариях.