E2E тестирование

Stencil, как современный фреймворк для создания веб-компонентов, поддерживает различные способы тестирования приложений. Одним из самых мощных методов является E2E тестирование (End-to-End Testing), которое позволяет проверять взаимодействие компонентов с реальными пользователями в реальной среде. В рамках этого тестирования эмулируются настоящие пользовательские сценарии, и оно используется для проверки работы всех частей системы, от UI до backend-логики.

Stencil интегрируется с популярными инструментами для E2E тестирования, такими как Puppeteer и Playwright, что делает его удобным для разработчиков, стремящихся к стабильным и высококачественным приложениям.

Настройка среды для E2E тестирования

Для начала работы с E2E тестированием в Stencil нужно установить соответствующие зависимости.

  1. Установите необходимые библиотеки:
npm install --save-dev @stencil/core puppeteer
  1. Создайте в корне проекта директорию для тестов, например e2e, и настройте конфигурацию для тестирования. Стандартный файл конфигурации Stencil для E2E тестирования называется stencil.config.ts.

Пример базовой настройки:

import { Config } from '@stencil/core';

export const config: Config = {
  e2e: {
    spec: 'e2e/**/*.spec.ts',
    devServer: {
      root: 'www',
      watchGlob: '**/**',
    },
    browserHeadless: true, // Запускать тесты в headless-режиме
  },
};

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

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

Stencil использует стандартные средства тестирования, такие как Jest для unit-тестов, но для E2E тестирования подключаются другие библиотеки. Обычно для написания тестов применяется API, предоставляемое Puppeteer или Playwright. Пример кода E2E теста для компонента с использованием Puppeteer:

describe('my-component', () => {
  it('should render the component and interact with it', async () => {
    const page = await browser.newPage();
    await page.goto('http://localhost:3333');

    const button = await page.$('button');
    await button.click();

    const result = await page.$eval('.result', el => el.textContent);
    expect(result).toBe('Expected text after button click');
  });
});

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

Запуск E2E тестов

Запускать тесты можно с помощью команды:

npm run test:e2e

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

Структура E2E тестов

Тесты в Stencil обычно пишутся с использованием специфичных для фреймворка методов и команд, таких как:

  • beforeAll, beforeEach, afterAll, afterEach — стандартные хуки для подготовки и очистки тестовой среды.
  • it — описание конкретного теста.
  • expect — утверждения, которые проверяют состояние компонентов.

Пример:

describe('my-button', () => {
  let page;
  beforeAll(async () => {
    page = await browser.newPage();
    await page.goto('http://localhost:3333');
  });

  it('should have the correct text content', async () => {
    const button = await page.$('my-button');
    const text = await button.evaluate(el => el.shadowRoot.querySelector('button').textContent);
    expect(text).toBe('Click me');
  });

  afterAll(async () => {
    await page.close();
  });
});

В этом примере создаётся страница, проверяется содержимое кнопки и закрывается страница после выполнения теста.

Работа с Shadow DOM

Stencil активно использует Shadow DOM для инкапсуляции стилей и логики компонентов, что делает тестирование этих компонентов особенным. Для взаимодействия с элементами внутри Shadow DOM необходимо использовать метод shadowRoot, который предоставляет доступ к элементам, инкапсулированным внутри компонента.

Пример:

it('should have a shadow DOM with a button', async () => {
  const myButton = await page.$('my-button');
  const shadowRoot = await myButton.shadowRoot();
  const button = await shadowRoot.$('button');
  const buttonText = await button.evaluate(el => el.textContent);
  expect(buttonText).toBe('Click me');
});

Этот тест проверяет, что компонент my-button рендерит кнопку внутри своего Shadow DOM с текстом «Click me».

Отладка E2E тестов

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

  1. Просмотр страницы в браузере — можно настроить тесты так, чтобы они запускались в обычном браузере вместо headless-режима, что даёт возможность наблюдать за каждым шагом выполнения.
  2. Консольные логи — вывод сообщений из тестов или браузера может помочь найти причину сбоя.
  3. Журнал ошибок — инструменты вроде Puppeteer или Playwright позволяют захватывать подробные логи работы браузера.

Пример включения видимости браузера для отладки:

const browser = await puppeteer.launch({ headless: false });

Использование тестовых данных

Для сложных сценариев тестирования можно использовать поддельные данные (mock data). Это позволяет тестировать компоненты в различных состояниях и проверять их работу с разными наборами данных.

Пример:

it('should display user data correctly', async () => {
  const page = await browser.newPage();
  await page.goto('http://localhost:3333');

  const userData = { name: 'John Doe', age: 30 };
  await page.evaluate((data) => {
    window.localStorage.setItem('user', JSON.stringify(data));
  }, userData);

  const userName = await page.$eval('.user-name', el => el.textContent);
  expect(userName).toBe('John Doe');
});

В этом примере тестируется компонент, который использует данные пользователя, сохранённые в localStorage.

Поддержка мобильных устройств

Stencil позволяет тестировать компоненты не только на десктопных браузерах, но и на мобильных устройствах. Для этого можно использовать эмуляторы мобильных браузеров, предоставляемые такими инструментами, как Puppeteer и Playwright.

Пример:

it('should display mobile layout correctly', async () => {
  const page = await browser.newPage();
  await page.emulate({ viewport: { width: 375, height: 667 }, userAgent: 'Mozilla/5.0' });
  await page.goto('http://localhost:3333');

  const mobileView = await page.$('.mobile-view');
  expect(mobileView).toBeTruthy();
});

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

Интеграция с CI/CD

Для обеспечения стабильности и качества проекта E2E тесты можно интегрировать с процессами CI/CD. Это позволяет автоматически запускать тесты при каждом коммите или перед релизом приложения. В популярных CI-системах, таких как GitHub Actions или CircleCI, можно настроить выполнение тестов на каждом этапе сборки или деплоя.

Пример настройки для GitHub Actions:

name: E2E Testing

on:
  push:
    branches:
      - main

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Install dependencies
        run: npm install
      - name: Run E2E tests
        run: npm run test:e2e

Этот конфигурационный файл автоматически запускает E2E тесты каждый раз, когда происходит push в основную ветку репозитория.

Заключение

E2E тестирование в Stencil является мощным инструментом для проверки целостности компонентов и взаимодействия между ними в реальных условиях. Используя Puppeteer, Playwright и другие инструменты, можно легко тестировать интерфейсы и логику приложения, а также интегрировать тесты в процессы CI/CD для поддержания высокого качества проекта на всех этапах разработки.