QAForgeAI QA Workspace

QAForge

Примеры генерации QAForge

Посмотрите, как требования превращаются в тест-кейсы, чек-листы и другие QA-артефакты.

QAForge не заменяет QA-инженеров. Он помогает уменьшить рутинное форматирование и ускоряет подготовку тестовых артефактов, а смысл, полнота и риски остаются на ручной проверке специалиста.

ГраницыWeb / Финансы

Сумма перевода: классы эквивалентности и границы

Техника: Equivalence Partitioning + Boundary Value Analysis

Вместо пары проверок valid/invalid пример показывает классы эквивалентности, границы и точные ожидаемые результаты.

  • amount < 100
  • amount = 100
  • 100 < amount < 500000
Открыть пример
Таблицы решенийWeb / Checkout

Промокод: таблица решений вместо десятков хаотичных проверок

Техника: Decision Table Testing

Таблица решений убирает хаотичные проверки и показывает, какие комбинации условий дают разные действия.

  • промокод существует
  • промокод активен
  • промокод не истёк
Открыть пример
СостоянияWeb / Auth

OTP-код: проверка состояний и переходов

Техника: State Transition Testing

Проверки строятся вокруг состояний кода и разрешённых переходов, а не вокруг одной успешной авторизации.

  • no_code
  • code_sent
  • code_verified
Открыть пример
Чек-листыWeb / Mobile

Редактирование профиля: чек-лист вместо одного большого тест-кейса

Техника: Checklist-Based Testing

Чек-лист показывает широкое покрытие области без длинного сценария на десятки шагов.

  • functional checks
  • validation checks
  • permissions checks
Открыть пример
APIREST API

REST API: сценарии валидации запроса

Техника: API validation + boundary checks

API-пример фиксирует контракт: поля, типы, границы, авторизацию, статусы и тело ошибки.

  • product_id required string
  • quantity integer 1..99
  • delivery_date optional ISO date, not in the past
Открыть пример
ПлатежиWeb / SaaS billing

Оплата подписки: lifecycle, webhook и refund

Техника: Risk-oriented lifecycle testing

Платёжный пример показывает lifecycle, idempotency и согласованность бизнес-состояний.

  • checkout created but not paid
  • payment_succeeded without activation
  • duplicate webhook
Открыть пример
Примеры демонстрационные. В реальной работе результат нужно проверять с учётом требований, продукта, рисков и договорённостей команды.

Границы

Границы · Web / Финансы

Сумма перевода: классы эквивалентности и границы

Классы эквивалентности и BVA

Требование

Форма перевода принимает целую сумму в RUB от 100 до 500000 включительно. Перевод создаётся только для допустимого целого значения.

Что покрываем

  • amount < 100
  • amount = 100
  • 100 < amount < 500000
  • amount = 500000
  • amount > 500000
  • non-numeric value
  • decimal value
  • empty value

Граничные значения

99100101499999500000500001

Фрагмент результата

1. Сумма 99 RUB отклоняется как значение ниже минимума

Ожидаемый результат: Система отклоняет значение 99, показывает сообщение о минимальной сумме 100 ₽, перевод не создаётся.

2. Сумма 100 RUB принимается как нижняя граница

Ожидаемый результат: Кнопка отправки активна, перевод создаётся на 100 ₽, в подтверждении указана ровно эта сумма.

3. Сумма 500000 RUB принимается как верхняя граница

Ожидаемый результат: Перевод создаётся на 500000 ₽, предупреждение о превышении лимита не отображается.

4. Сумма 500001 RUB отклоняется как превышение лимита

Ожидаемый результат: Система показывает сообщение о максимальной сумме 500000 ₽, перевод не создаётся и баланс не меняется.

5. Дробное значение 100.50 RUB отклоняется

Ожидаемый результат: Поле сообщает, что сумма должна быть целым числом в RUB, запрос на перевод не отправляется.

Почему это важно

Такой набор показывает риск на соседних значениях 99/100/101 и 499999/500000/500001. Это лучше, чем просто написать “проверить валидную и невалидную сумму”, потому что дефекты часто возникают именно на границах.

Таблицы решений

Таблицы решений · Web / Checkout

Промокод: таблица решений вместо десятков хаотичных проверок

Decision Table Testing

Требование

Промокод применяется только если он существует, активен, не истёк, сумма корзины не меньше 3000 ₽ и пользователь не использовал его раньше.

Что покрываем

  • промокод существует
  • промокод активен
  • промокод не истёк
  • сумма корзины >= 3000 ₽
  • пользователь ещё не использовал промокод
Rule
Условия
Действие
Ожидаемый результат
R1
exists=Y, active=Y, not_expired=Y, cart>=3000=Y, used_before=N
Применить скидку
Скидка применена один раз, итоговая сумма пересчитана.
R2
exists=N
Отклонить
Показано “Промокод не найден”, сумма корзины не меняется.
R3
exists=Y, active=N
Отклонить
Показано “Промокод недоступен”, скидка не применяется.
R4
exists=Y, active=Y, not_expired=N
Отклонить
Показано “Срок действия промокода истёк”.
R5
cart<3000
Отклонить
Показано “Минимальная сумма заказа 3000 ₽”, итог не меняется.
R6
used_before=Y
Отклонить
Показано “Промокод уже использован этим аккаунтом”.

Фрагмент результата

1. R1: все условия выполнены

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

2. R4: промокод истёк при остальных выполненных условиях

Ожидаемый результат: Система показывает сообщение об истечении срока, скидка не применяется, корзина остаётся без изменений.

3. R5: сумма корзины 2999 ₽

Ожидаемый результат: Промокод отклоняется с сообщением о минимальной сумме 3000 ₽, скидка не появляется в итогах.

4. R6: пользователь уже использовал промокод

Ожидаемый результат: Промокод отклоняется для текущего пользователя, но сам код остаётся активным для других пользователей.

Почему это важно

Репрезентативные правила уменьшают дубли и бессмысленные кейсы. QA видит, какое условие меняет действие системы, а не получает десять похожих проверок без логики покрытия.

Состояния

Состояния · Web / Auth

OTP-код: проверка состояний и переходов

State Transition Testing

Требование

Пользователь входит по одноразовому OTP-коду. Код истекает через 5 минут. После 3 неверных попыток код блокируется. Новый код сбрасывает счётчик попыток.

Что покрываем

  • no_code
  • code_sent
  • code_verified
  • code_expired
  • code_blocked

Состояния

  • no_code
  • code_sent
  • code_verified
  • code_expired
  • code_blocked

Lifecycle / переходы

  • no_code -> request_code -> code_sent
  • code_sent -> valid_code -> code_verified
  • code_sent -> 5 minutes passed -> code_expired
  • code_sent -> 3 wrong attempts -> code_blocked
  • code_expired/code_blocked -> request_new_code -> code_sent

Фрагмент результата

1. Переход no_code -> code_sent при запросе OTP

Ожидаемый результат: Создаётся новый OTP, состояние становится code_sent, счётчик неверных попыток равен 0, старый код недоступен.

2. Третья неверная попытка переводит код в code_blocked

Ожидаемый результат: После третьей неверной попытки код переходит в состояние blocked, дальнейшая проверка этого кода невозможна.

3. Истёкший код не может перейти в code_verified

Ожидаемый результат: Через 5 минут система отклоняет даже правильный код, показывает сообщение об истечении и предлагает запросить новый.

4. Новый код после блокировки сбрасывает попытки

Ожидаемый результат: Новый OTP получает состояние code_sent, счётчик попыток равен 0, заблокированный код остаётся недействительным.

Почему это важно

Lifecycle-подход помогает не пропустить ошибки с истечением, блокировкой, повторным запросом и использованием старых кодов.

Чек-листы

Чек-листы · Web / Mobile

Редактирование профиля: чек-лист вместо одного большого тест-кейса

Checklist-Based Testing

Требование

Пользователь может редактировать имя, аватар, телефон и настройки уведомлений в профиле.

Что покрываем

  • functional checks
  • validation checks
  • permissions checks
  • persistence checks
  • cross-device/session checks
  • negative checks

Функциональные проверки

  • Имя сохраняется и отображается в профиле, шапке и списке участников.
  • Аватар обновляется после успешной загрузки и не меняется при ошибке.
  • Настройки уведомлений применяются отдельно для email и push.

Валидация

  • Пустое имя отклоняется с сообщением о required field.
  • Телефон в неподдерживаемом формате не сохраняется.
  • Файл аватара больше лимита отклоняется без потери старого аватара.

Права и сессии

  • Пользователь не может редактировать профиль другого аккаунта.
  • Изменения видны после logout/login и обновления страницы.
  • Вторая активная сессия получает обновлённые данные после refresh.

Фрагмент результата

1. Изменение имени сохраняется во всех местах отображения

Ожидаемый результат: Новое имя видно в профиле, меню аккаунта и карточке автора без ручной очистки кеша.

2. Ошибка загрузки аватара не удаляет текущий аватар

Ожидаемый результат: При неподдерживаемом формате файла отображается понятная ошибка, прежний аватар остаётся активным.

3. Редактирование чужого профиля запрещено

Ожидаемый результат: Запрос завершается 403 или безопасным отказом, данные другого пользователя не меняются.

Почему это важно

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

API

API · REST API

REST API: сценарии валидации запроса

API Validation Scenarios

Требование

POST /orders создаёт заказ. Поля: product_id обязательная строка, quantity целое число 1..99, delivery_date опциональная ISO-дата не в прошлом, auth token обязателен.

Что покрываем

  • product_id required string
  • quantity integer 1..99
  • delivery_date optional ISO date, not in the past
  • auth token required
  • 201, 400, 401, 422

Граничные значения

quantity=0quantity=1quantity=2quantity=98quantity=99quantity=100

Фрагмент результата

1. Валидный запрос с quantity=1

Ожидаемый результат: API возвращает 201, тело содержит order_id и status=created, заказ связан с авторизованным пользователем.

2. quantity=0 отклоняется по нижней границе

Ожидаемый результат: API возвращает 422 с кодом ошибки quantity_out_of_range, заказ не создаётся.

3. product_id отсутствует

Ожидаемый результат: API возвращает 400 с ошибкой required_field: product_id, побочных эффектов нет.

4. Отсутствует auth token

Ожидаемый результат: API возвращает 401, тело ошибки не раскрывает внутренние детали авторизации, заказ не создаётся.

5. delivery_date в прошлом

Ожидаемый результат: API возвращает 422 с кодом delivery_date_in_past, остальные валидные поля не сохраняются как черновик заказа.

Почему это важно

API-тесты должны проверять не только “ошибка отображается”, а точный HTTP-статус, код ошибки, отсутствие side effects и границы допустимых значений.

Платежи

Платежи · Web / SaaS billing

Оплата подписки: lifecycle, webhook и refund

Risk-oriented lifecycle checks

Требование

SaaS-подписка оплачивается через внешнего платёжного провайдера. Доступ активируется только после подтверждения платежа, а после успешного возврата платный доступ завершается.

Что покрываем

  • checkout created but not paid
  • payment_succeeded without activation
  • duplicate webhook
  • canceled payment
  • refund after activation
  • stale paid plan after refund

Lifecycle / переходы

  • checkout_created
  • payment_succeeded
  • subscription_active
  • refund_succeeded
  • subscription_reset

Риски

  • checkout создан, но не оплачен
  • успешный платёж не активировал подписку
  • дублирующий webhook создал вторую подписку
  • отмена платежа изменила тариф
  • после refund остался stale paid plan

Фрагмент результата

1. checkout_created не активирует тариф

Ожидаемый результат: В БД создан payment intent со status=pending, текущий тариф пользователя не меняется, лимиты не увеличиваются.

2. payment_succeeded активирует подписку один раз

Ожидаемый результат: Подписка получает status=active и выбранный plan, usage counters соответствуют новому тарифу, повторная обработка того же события не меняет период повторно.

3. payment_canceled не меняет текущий доступ

Ожидаемый результат: Payment intent получает status=canceled, subscription остаётся прежней, платные лимиты не выдаются.

4. refund_succeeded завершает платный доступ

Ожидаемый результат: Подписка переводится на Free-поведение, current_period_end становится текущим временем, история платежа и возврата сохраняется.

5. Повторный webhook с тем же provider_event_id безопасен

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

Почему это важно

В платёжных сценариях важно проверять не только экран оплаты, но и состояние подписки, usage-лимиты, повторные события и поведение после refund.

Попробуйте QAForge на своей задаче

Одна AI-генерация доступна без регистрации. Войдите, чтобы сохранять историю и продолжить работу.