QAForgeAI QA Workspace

QAForge

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

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

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

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

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

Техника: Классы эквивалентности и анализ граничных значений

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

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

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

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

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

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

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

Техника: Переходы состояний

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

  • код не запрошен
  • код отправлен
  • код подтверждён
Открыть пример
Чек-листыWeb / Мобильные устройства

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

Техника: Тестирование по чек-листам

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

  • функциональные проверки
  • проверки валидации
  • проверки прав доступа
Открыть пример
APIREST API

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

Техника: Валидация API и граничные проверки

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

  • product_id — обязательная строка
  • quantity — целое число от 1 до 99
  • delivery_date — необязательная дата ISO, не в прошлом
Открыть пример
ПлатежиWeb / Оплата SaaS

Оплата подписки: жизненный цикл, вебхуки и возврат

Техника: Риск-ориентированное тестирование жизненного цикла

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

  • оплата создана, но не выполнена
  • успешный платёж без активации
  • повторный вебхук
Открыть пример
Примеры приведены для иллюстрации. В реальной работе результат нужно проверять с учётом требований, продукта, рисков и договорённостей команды.

Границы

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

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

Классы эквивалентности и анализ граничных значений

Требование

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

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

  • amount < 100
  • amount = 100
  • 100 < amount < 500000
  • amount = 500000
  • amount > 500000
  • нечисловое значение
  • дробное значение
  • пустое значение

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

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 / Оформление заказа

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

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

Требование

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

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

  • промокод существует
  • промокод активен
  • промокод не истёк
  • сумма корзины >= 3000 ₽
  • пользователь ещё не использовал промокод
ПравилоУсловияДействиеОжидаемый результат
1существует: да; активен: да; срок действия не истёк: да; сумма корзины ≥ 3000 ₽: да; использован ранее: нетПрименить скидкуСкидка применена один раз, итоговая сумма пересчитана.
2существует: нетОтклонитьПоказано “Промокод не найден”, сумма корзины не меняется.
3существует: да; активен: нетОтклонитьПоказано “Промокод недоступен”, скидка не применяется.
4существует: да; активен: да; срок действия не истёк: нетОтклонитьПоказано “Срок действия промокода истёк”.
5сумма корзины ≥ 3000 ₽: нетОтклонитьПоказано “Минимальная сумма заказа 3000 ₽”, итог не меняется.
6использован ранее: даОтклонитьПоказано “Промокод уже использован этим аккаунтом”.

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

1. Правило 1: все условия выполнены

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

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

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

3. Правило 5: сумма корзины 2999 ₽

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

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

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

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

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

Состояния

СостоянияWeb / Вход

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

Переходы состояний

Требование

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

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

  • код не запрошен
  • код отправлен
  • код подтверждён
  • срок кода истёк
  • код заблокирован

Состояния

  • код не запрошен
  • код отправлен
  • код подтверждён
  • срок кода истёк
  • код заблокирован

Жизненный цикл и переходы

  • Код не запрошен → запрос кода → код отправлен
  • Код отправлен → ввод верного кода → код подтверждён
  • Код отправлен → прошло 5 минут → срок кода истёк
  • Код отправлен → 3 неверные попытки → код заблокирован
  • Срок кода истёк или код заблокирован → запрос нового кода → код отправлен

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

1. Запрос OTP переводит код из незапрошенного в отправленный

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

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

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

3. Истёкший код нельзя подтвердить

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

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

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

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

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

Чек-листы

Чек-листыWeb / Мобильные устройства

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

Тестирование по чек-листам

Требование

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

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

  • функциональные проверки
  • проверки валидации
  • проверки прав доступа
  • проверки сохранения данных
  • проверки между устройствами/сессиями
  • негативные проверки

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

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

Валидация

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

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

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

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

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

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

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

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

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

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

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

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

API

APIREST API

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

Валидация API и граничные проверки

Требование

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

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

  • product_id — обязательная строка
  • quantity — целое число от 1 до 99
  • delivery_date — необязательная дата ISO, не в прошлом
  • токен авторизации обязателен
  • 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. Отсутствует токен авторизации

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

5. delivery_date в прошлом

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

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

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

Платежи

ПлатежиWeb / Оплата SaaS

Оплата подписки: жизненный цикл, вебхуки и возврат

Риск-ориентированное тестирование жизненного цикла

Требование

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

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

  • оплата создана, но не выполнена
  • успешный платёж без активации
  • повторный вебхук
  • отменённый платёж
  • возврат после активации
  • платный доступ остался после возврата

Жизненный цикл и переходы

  • оплата создана
  • платёж успешен
  • подписка активна
  • возврат выполнен
  • подписка сброшена

Риски

  • запрос оплаты создан, но не оплачен
  • успешный платёж не активировал подписку
  • повторный вебхук создал вторую подписку
  • отмена платежа изменила тариф
  • после возврата остался платный доступ

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

1. Создание оплаты не активирует тариф

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

2. Успешный платёж активирует подписку один раз

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

3. Отмена платежа не меняет текущий доступ

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

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

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

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

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

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

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

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

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