Lesson 9 of 26

Урок 09 — Smoke Testing

Название: Smoke Testing — первая проверка стабильности сборки
Описание: Разбираем, что такое Smoke Testing, зачем он нужен, как его проводить и как правильно автоматизировать дымовые тесты с помощью Playwright.
Почему это важно для QA: Smoke Testing — это первая линия защиты. Он позволяет быстро определить, пригодна ли сборка для дальнейшего тестирования, и не тратить время команды на нестабильные версии продукта.


1. Откуда пришёл термин

Термин «Smoke Testing» пришёл из электроники. Когда инженеры собирали новую плату, они включали питание и смотрели — не пойдёт ли дым? Если дым пошёл — всё плохо, схема сгорела. Если нет — можно тестировать дальше.

В программировании это то же самое: включили приложение — «идёт ли дым?» (то есть падает ли оно сразу?).


2. Что такое Smoke Testing

Smoke Testing — это поверхностная проверка основных функций приложения с целью убедиться, что сборка достаточно стабильна для полноценного тестирования.

Smoke Test не проверяет детали — он проверяет, что ключевые функции вообще работают. Если Smoke Test провален — сборка возвращается разработчикам без дальнейшего тестирования.

Ключевые свойства

СвойствоЗначение
ОхватШирокий (весь продукт)
ГлубинаПоверхностная
СкоростьБыстро (15–30 минут)
ДокументацияЗадокументирован
АвтоматизацияЧасто автоматизируется
ЦельПроверить стабильность сборки

3. Что входит в Smoke Testing

Smoke Test покрывает критические пути (critical paths) приложения:

  • Приложение запускается без ошибок
  • Главная страница открывается
  • Авторизация работает (вход / выход)
  • Ключевые навигационные элементы присутствуют
  • Основные бизнес-функции доступны (создание заказа, поиск товара, оплата)
  • Отсутствуют критические JS-ошибки в консоли

Пример Smoke Test Suite для интернет-магазина

[SMOKE] Главная страница открывается (200 OK)
[SMOKE] Пользователь может авторизоваться
[SMOKE] Каталог товаров отображается
[SMOKE] Поиск возвращает результаты
[SMOKE] Страница товара открывается
[SMOKE] Товар добавляется в корзину
[SMOKE] Страница корзины отображается
[SMOKE] Пользователь может выйти из аккаунта

Это 8 тестов — и они покрывают весь критический путь пользователя.


4. Smoke vs Sanity — ещё раз чётко

             SMOKE                 SANITY
─────────────────────────────────────────────
Вопрос:  «Приложение живо?»   «Фикс работает?»
Охват:    Всё приложение       Одна функция
Глубина:  Поверхностно         Глубоко
Когда:    Новая сборка          После фикса
Пример:   Вход работает?        Промокод считает скидку?

5. Smoke Testing в Playwright

Автоматизация Smoke тестов — одна из лучших инвестиций в команде. Запускается при каждом деплое, занимает несколько минут, даёт быстрый ответ.

Структура проекта

tests/
  smoke/
    homepage.smoke.spec.ts
    auth.smoke.spec.ts
    catalog.smoke.spec.ts
    cart.smoke.spec.ts

Пример: auth.smoke.spec.ts

typescripttypescript
import { test, expect } from '@playwright/test';
import { LoginPage } from '../pages/LoginPage';
import { DashboardPage } from '../pages/DashboardPage';

const VALID_USER = {
  email: "testuser@example.com",
  password: "TestPass123",
};

test.describe("[SMOKE] Авторизация", () => {
  test("пользователь может войти в аккаунт", async ({ page }) => {
    const loginPage = new LoginPage(page);
    const dashboardPage = new DashboardPage(page);

    await test.step("открыть страницу входа", async () => {
      await loginPage.goto();
      await expect(loginPage.emailInput).toBeVisible();
    });

    await test.step("ввести данные и войти", async () => {
      await loginPage.login(VALID_USER.email, VALID_USER.password);
    });

    await test.step("убедиться в успешном входе", async () => {
      await expect(page).toHaveURL("/dashboard");
      await expect(dashboardPage.welcomeMessage).toBeVisible();
    });
  });

  test("пользователь может выйти из аккаунта", async ({ page }) => {
    const loginPage = new LoginPage(page);
    const dashboardPage = new DashboardPage(page);

    await loginPage.goto();
    await loginPage.login(VALID_USER.email, VALID_USER.password);

    await test.step("нажать кнопку выхода", async () => {
      await dashboardPage.logout();
    });

    await test.step("убедиться, что редирект на страницу входа", async () => {
      await expect(page).toHaveURL("/login");
    });
  });
});

Пример: homepage.smoke.spec.ts

typescripttypescript
import { test, expect } from '@playwright/test';

test.describe("[SMOKE] Главная страница", () => {
  test("главная страница открывается без ошибок", async ({ page }) => {
    const consoleErrors: string[] = [];

    page.on("console", (msg) => {
      if (msg.type() === "error") {
        consoleErrors.push(msg.text());
      }
    });

    await page.goto("/");

    await test.step("страница загружается", async () => {
      await expect(page).toHaveTitle(/Мой магазин/);
    });

    await test.step("нет критических JS-ошибок", async () => {
      expect(
        consoleErrors,
        "На странице есть JS-ошибки: " + consoleErrors.join(", ")
      ).toHaveLength(0);
    });

    await test.step("главное меню навигации видно", async () => {
      await expect(page.getByRole("navigation")).toBeVisible();
    });
  });
});

Запуск только smoke тестов

bashbash
# Запуск по тегу
npx playwright test --grep @smoke

# Запуск по папке
npx playwright test tests/smoke/

# Запуск в CI с отчётом
npx playwright test tests/smoke/ --reporter=html

Конфигурация тегов в playwright.config.ts

typescripttypescript
// В playwright.config.ts можно создать отдельный проект для smoke
export default defineConfig({
  projects: [
    {
      name: "smoke",
      testMatch: "**/smoke/**/*.spec.ts",
      use: { baseURL: process.env.BASE_URL },
    },
    {
      name: "full",
      testMatch: "**/*.spec.ts",
    },
  ],
});

6. Smoke Testing в CI/CD

Smoke тесты идеально встраиваются в пайплайн:

yamlyaml
# .github/workflows/ci.yml (пример для GitHub Actions)
jobs:
  smoke-tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npx playwright install --with-deps
      - run: npx playwright test tests/smoke/
        env:
          BASE_URL: ${{ secrets.STAGING_URL }}

  full-tests:
    needs: smoke-tests   # запускаются ТОЛЬКО если smoke прошли
    runs-on: ubuntu-latest
    steps:
      - run: npx playwright test

Логика: если Smoke тесты упали — полный прогон даже не стартует. Это экономит ресурсы и время.


7. Критерии хороших Smoke тестов

Быстрые — весь smoke suite не дольше 5–15 минут
Независимые — каждый тест не зависит от другого
Стабильные — не мигают (no flaky tests)
Покрывают happy path — только основные успешные сценарии
Автоматизированы — запускаются автоматически при деплое


8. Частые ошибки

Слишком много тестов в smoke suite
→ Если smoke занимает 2 часа — это уже Regression. Smoke должен быть быстрым.

Тестирование деталей в smoke
→ Smoke проверяет «работает ли?», а не «работает ли идеально?»

Не автоматизируют smoke тесты
→ Ручной smoke замедляет команду. Автоматизируй — это окупится после первого спасённого релиза.


Итог

SMOKE TESTING
├── Цель: убедиться, что сборка стабильна для тестирования
├── Охват: широкий (всё приложение, поверхностно)
├── Когда: после каждого деплоя / новой сборки
├── Время: 5–30 минут
├── Если провален: сборка возвращается разработчикам
├── Если прошёл: начинаем полное тестирование
└── Лучшая практика: автоматизировать и встроить в CI/CD