Разработка E2E Smoke Tests для мониторинга продакшена
Smoke tests — минимальный набор e2e тестов, которые проверяют критические пути приложения. Их задача — не исчерпывающее тестирование, а быстрое обнаружение того, что «что-то сломалось» после деплоя или в результате внешнего инцидента. Запускаются каждые 5–15 минут на продакшене.
Отличие от обычных e2e тестов
Обычные e2e тесты запускаются в CI перед деплоем и могут выполняться 10–30 минут. Smoke tests для мониторинга:
- Запускаются постоянно на продакшене (synthetic monitoring)
- Выполняются за 1–3 минуты
- Покрывают только critical happy paths
- При падении сразу триггерят алерт (PagerDuty, Slack, email)
Выбор инструмента
Playwright — рекомендуется для большинства проектов. Надёжнее Selenium, современный API, встроенная поддержка сетевых моков, trace viewer для отладки.
Cypress — хорош для React/Vue приложений, но сложнее запускать в headless окружениях без дополнительной конфигурации.
k6 browser — если уже используется k6 для нагрузочного тестирования, browser module позволяет добавить e2e проверки в тот же инструмент.
Примеры smoke tests на Playwright
// tests/smoke/critical-paths.spec.ts
import { test, expect } from '@playwright/test';
test.describe('Smoke: Critical paths', () => {
test('Homepage loads and key elements visible', async ({ page }) => {
await page.goto('/');
await expect(page.getByRole('navigation')).toBeVisible();
await expect(page.getByRole('main')).toBeVisible();
// Не тестируем весь контент — только структуру
});
test('Login flow works end-to-end', async ({ page }) => {
await page.goto('/login');
await page.fill('[name="email"]', process.env.SMOKE_TEST_EMAIL!);
await page.fill('[name="password"]', process.env.SMOKE_TEST_PASSWORD!);
await page.click('[type="submit"]');
await expect(page).toHaveURL('/dashboard', { timeout: 10000 });
await expect(page.getByTestId('user-menu')).toBeVisible();
});
test('API health endpoint responds 200', async ({ request }) => {
const response = await request.get('/api/health');
expect(response.status()).toBe(200);
const body = await response.json();
expect(body.status).toBe('ok');
});
test('Checkout page loads with correct elements', async ({ page }) => {
// Логинимся через API для скорости, не через UI
const authResponse = await page.request.post('/api/auth/login', {
data: { email: process.env.SMOKE_TEST_EMAIL, password: process.env.SMOKE_TEST_PASSWORD }
});
const { token } = await authResponse.json();
await page.addInitScript(t => {
localStorage.setItem('auth_token', t);
}, token);
await page.goto('/checkout');
await expect(page.getByTestId('checkout-form')).toBeVisible();
});
});
Конфигурация для production
// playwright.config.smoke.ts
import { defineConfig } from '@playwright/test';
export default defineConfig({
testDir: './tests/smoke',
timeout: 30000,
retries: 2, // Повторяем при сетевых ошибках
workers: 1, // Последовательно — не нагружаем продакшен
use: {
baseURL: process.env.SMOKE_BASE_URL || 'https://app.example.com',
extraHTTPHeaders: {
'X-Smoke-Test': 'true', // Помечаем трафик для аналитики/логов
},
},
reporter: [
['list'],
['json', { outputFile: 'smoke-results.json' }],
],
});
Запуск по расписанию через GitHub Actions
# .github/workflows/smoke-monitor.yml
name: Smoke Tests Monitor
on:
schedule:
- cron: '*/15 * * * *' # Каждые 15 минут
workflow_dispatch:
jobs:
smoke:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: 20, cache: npm }
- run: npm ci
- run: npx playwright install chromium --with-deps
- name: Run smoke tests
run: npx playwright test --config=playwright.config.smoke.ts
env:
SMOKE_BASE_URL: https://app.example.com
SMOKE_TEST_EMAIL: ${{ secrets.SMOKE_TEST_EMAIL }}
SMOKE_TEST_PASSWORD: ${{ secrets.SMOKE_TEST_PASSWORD }}
- name: Notify on failure
if: failure()
uses: slackapi/slack-github-action@v1
with:
payload: |
{"text": "Smoke tests FAILED on production! <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|View Run>"}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
Учётные данные для тестирования
Отдельный smoke-test пользователь в системе с:
- Специфичным флагом в БД (
is_synthetic: true) для фильтрации из аналитики - Минимальными правами (только для чтения там, где возможно)
- Невозможностью совершить реальные платёжные операции
- Ротацией пароля через CI secrets
Метрики мониторинга
Помимо прохождения тестов, собираем: время выполнения каждого теста (отклонение > 50% — признак деградации производительности), процент успешных запусков за последние 24 часа, среднее время ответа API health endpoint.
Сроки
Написание 5–10 smoke тестов для критических путей приложения — 2–3 дня. Настройка GitHub Actions с расписанием и Slack-уведомлениями — 0,5 дня. Создание изолированных тестовых учётных данных — 0,5 дня.







