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
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
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 тестов
# Запуск по тегу
npx playwright test --grep @smoke
# Запуск по папке
npx playwright test tests/smoke/
# Запуск в CI с отчётом
npx playwright test tests/smoke/ --reporter=htmlКонфигурация тегов в playwright.config.ts
// В 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 тесты идеально встраиваются в пайплайн:
# .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