Приёмочное тестирование означает как минимум три разные вещи в зависимости от того, кто его проводит и когда. UAT: бизнес-стейкхолдеры подтверждают требования перед финальным одобрением. ATDD: исполняемые тесты написаны до начала разработки. Функциональное приёмочное тестирование: QA проверяет что спецификация полностью реализована. Типичные сбои: слишком поздно начать, привлечь не тех людей, написать критерии достаточно размыто чтобы потом о них спорить.

Что такое приёмочное тестирование

Этот термин охватывает несколько связанных понятий.

Пользовательское приёмочное тестирование (UAT): реальные пользователи (или бизнес-стейкхолдеры) тестируют программу в staging-окружении чтобы убедиться что она соответствует требованиям перед финальным одобрением. Разработка через приёмочные тесты (ATDD): требования описываются как исполняемые тесты до начала разработки. Тесты проходят когда функция готова. Функциональное приёмочное тестирование: QA проверяет что все требования из спецификации реализованы и работают корректно.

На практике «приёмочное тестирование» означает одно из двух: UAT, проводимое бизнес-пользователями, или функциональное приёмочное тестирование, проводимое QA по формальным требованиям.

Критерии приёмки: основа

Приёмочное тестирование начинается с критериев приёмки: конкретных условий которым функция должна соответствовать чтобы считаться готовой.

Плохие критерии приёмки

Страница входа должна нормально работать.

Хорошие критерии приёмки

- Пользователи могут войти с корректным email и паролем и перенаправляются на dashboard
- При неверном email или пароле появляется сообщение «Invalid email or password»
- После 5 неудачных попыток за 10 минут аккаунт блокируется и появляется сообщение «too many attempts»
- Успешный вход создаёт сессию которая истекает через 24 часа неактивности
- Ссылка «Forgot password» на странице входа отправляет письмо для сброса в течение 2 минут

Хорошие критерии: конкретные, проверяемые, однозначные.

Gherkin: критерии в формате Given/When/Then

Gherkin позволяет писать критерии приёмки в формате Given/When/Then. Его читают нетехнические стейкхолдеры, а инструменты вроде Cucumber могут выполнять его как код:

Feature: User Login

  Scenario: Successful login with valid credentials
    Given I am on the login page
    When I enter "user@example.com" as email
    And I enter "ValidPass1" as password
    And I click the "Sign In" button
    Then I should be redirected to the dashboard
    And I should see "Welcome, Test User" in the header

  Scenario: Login with invalid credentials
    Given I am on the login page
    When I enter "user@example.com" as email
    And I enter "WrongPassword" as password
    And I click the "Sign In" button
    Then I should see "Invalid email or password"
    And I should remain on the login page

  Scenario: Account lockout after failed attempts
    Given I am on the login page
    When I enter "user@example.com" with wrong password 5 times
    Then I should see "Too many failed attempts. Try again in 10 minutes."
    And the Sign In button should be disabled

Процесс UAT: шаг за шагом

1. Определи область тестирования

Какие функции входят в этот цикл UAT? Обычно привязывается к релизу или спринту.

2. Напиши сценарии вместе с бизнес-пользователями

Вовлеки реальных пользователей или product owner-ов в написание сценариев. Они знают как выглядит «правильно» с точки зрения бизнеса.

3. Подготовь окружение

UAT должен проходить в окружении близком к продакшену: те же данные, те же интеграции, та же конфигурация. Ноутбук разработчика не считается UAT-окружением.

Этот пункт пропускают чаще всего. UAT на dev-сервере с упрощёнными данными не считается.

4. Подготовь тестовые данные

Пользователям нужны реалистичные данные, отражающие их реальные сценарии использования. Не просто «test@test.com» с паролем «test123».

5. Выполни тесты

В идеале тесты прогоняют реальные пользователи. Если нет, QA. Но критерии приёмки должны определять бизнес-стейкхолдеры, а не QA.

6. Задокументируй результаты

Каждый тест получает статус: пройден или нет. По каждому провалу составляется баг-репорт с шагами для воспроизведения.

7. Исправь и перепроверь

Баги найденные в UAT уходят к разработчикам. QA перепроверяет после исправления.

8. Финальное одобрение

Бизнес-стейкхолдеры формально согласовывают релиз. Без согласования не выпускать.

QA-тестирование vs UAT

| Аспект | QA-тестирование | UAT |

|--------|----------------|-----|

| Кто проводит | QA-инженеры | Бизнес-пользователи / product owners |

| Цель | Найти баги | Подтвердить выполнение требований |

| Фокус | Техническая корректность | Бизнес-ценность |

| Когда | В процессе разработки | Перед релизом |

| Критерии | Тест-кейсы | Критерии приёмки |

| Согласование | QA lead | Бизнес-стейкхолдер |

Оба необходимы. QA ловит баги до UAT чтобы бизнес-пользователи не занимались базовым поиском дефектов.

Типичные сбои в приёмочном тестировании

Слишком поздно начали

UAT запланирован за 2 дня до релиза без буфера на исправления. Каждый найденный баг превращается в кризис.

Не те участники

Если UAT проводят разработчики, смысл теряется. Они знают как устроен код и не будут тестировать его как пользователь.

Размытые критерии приёмки

«Checkout должен быть удобным» приводит к спорам о том что такое «удобный» когда находят баги.

Неправильное окружение

UAT на dev-сервере с данными не отражающими реальные объёмы и интеграции пропустит реальные баги.

Нет регрессии после исправлений

Баг найден в UAT, исправлен, задеплоен. Никто не проверяет не сломало ли исправление что-то ещё.

Автоматизированное приёмочное тестирование

Приёмочные тесты можно автоматизировать с Playwright:

// acceptance/login.spec.ts
import { test, expect } from '@playwright/test';

test.describe('Login: Acceptance Criteria', () => {
  test('AC1: Valid credentials redirect to dashboard', async ({ page }) => {
    await page.goto('/login');
    await page.fill('[data-testid="email"]', 'user@test.com');
    await page.fill('[data-testid="password"]', 'ValidPass1');
    await page.click('[data-testid="submit"]');

    await expect(page).toHaveURL('/dashboard');
    await expect(page.getByTestId('welcome')).toContainText('Welcome');
  });

  test('AC2: Invalid credentials show error message', async ({ page }) => {
    await page.goto('/login');
    await page.fill('[data-testid="email"]', 'user@test.com');
    await page.fill('[data-testid="password"]', 'WrongPassword');
    await page.click('[data-testid="submit"]');

    await expect(page.getByTestId('error-message')).toHaveText('Invalid email or password');
    await expect(page).toHaveURL('/login');
  });

  test('AC3: Session expires after 24h inactivity', async ({ page }) => {
    // Обычно тестируется через mock времени или манипуляцию API
    await page.goto('/login');
    await page.fill('[data-testid="email"]', 'user@test.com');
    await page.fill('[data-testid="password"]', 'ValidPass1');
    await page.click('[data-testid="submit"]');

    // Симулируем истечение сессии через API
    await page.request.post('/api/auth/expire-session');
    await page.reload();

    await expect(page).toHaveURL('/login');
  });
});

Чеклист приёмочного тестирования

Перед началом UAT:

  • [ ] Критерии приёмки написаны и проверены бизнесом
  • [ ] Функция задеплоена в UAT-окружение (не в dev или staging)
  • [ ] Тестовые данные подготовлены (реалистичные, не упрощённые)
  • [ ] Бизнес-пользователи ознакомлены с тем что тестировать
  • [ ] Установлен процесс для фиксации багов
  • [ ] В расписании есть время на исправления и перепроверку
  • [ ] Определён тот, кто даёт финальное одобрение

В процессе UAT:

  • [ ] Тесты выполнены по критериям приёмки
  • [ ] Все провалы задокументированы с шагами воспроизведения
  • [ ] Для сложных проблем есть скриншоты или записи экрана
  • [ ] Каждому выявленному дефекту присвоена серьёзность

После UAT:

  • [ ] Все баги P1/P2 исправлены и перепроверены
  • [ ] Финальное одобрение бизнеса получено письменно
  • [ ] В release notes отмечены известные P3/P4 проблемы

Итог

Приёмочное тестирование подтверждает что программа доставляет ту бизнес-ценность, ради которой строилась. Ключевые моменты:

  • Критерии приёмки пишут бизнес-стейкхолдеры, не QA
  • UAT проводят реальные пользователи; функциональное приёмочное тестирование проводит QA по требованиям
  • Gherkin (Given/When/Then) делает критерии читаемыми для технических и нетехнических участников
  • Запускается в окружении близком к продакшену с реалистичными данными
  • Требует формального одобрения перед релизом
  • Поддаётся автоматизации с Playwright, что особенно ценно для регрессии при будущих изменениях

Разница между одобрением QA и одобрением бизнеса принципиальна: QA говорит что код работает; бизнес говорит что функция решает их задачу.

→ See also: Верификация vs валидация в тестировании ПО: в чём разница? | Как написать тест-план: шаблон и реальные примеры | Тестирование на основе рисков: как расставить приоритеты, когда нельзя протестировать всё