Розробка E2E Smoke Tests для моніторингу production
Smoke tests — мінімальний набір e2e тестів, які перевіряють критичні шляхи програми. Їх завдання — не вичерпне тестування, а швидке виявлення того, що «щось сломалося» після розгортання або через зовнішній інцидент. Запускаються кожні 5–15 хвилин на production.
Різниця від звичайних E2E тестів
Звичайні e2e тести запускаються в CI перед розгортанням і можуть виконуватися 10–30 хвилин. Smoke tests для моніторингу:
- Запускаються постійно на production (синтетичний моніторинг)
- Виконуються за 1–3 хвилини
- Покривають тільки критичні happy paths
- При падінні одразу тригерять alert (PagerDuty, Slack, email)
Вибір інструменту
Playwright — рекомендується для більшості проектів. Надійніший за Selenium, сучасний API, вбудована підтримка мережевих mock, 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, // Послідовно — не перевантажуємо production
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 дня.







