E2E-тестирование приложения: что покрывать сквозными тестами
Сквозной тест проходит приложение так же, как человек: открывает каталог, кладёт товар в корзину, платит и ждёт подтверждение заказа. По составу такие проверки одинаковы у любой команды, а разница — в том, какие пути покупателя в них попали и почему набор со временем перестаёт быть надёжным. Дальше — что закрывать в первую очередь, чего сквозными тестами не проверяют, почему они становятся нестабильными и по каким числам видно, что набор окупился.
Что такое сквозное тестирование и чем оно отличается от остальных проверок
Сквозное тестирование (в документации его обозначают как E2E, end-to-end) — это проверка целого пути пользователя от первого касания экрана до результата в системе учёта. Тест не заглядывает внутрь отдельной функции: он повторяет действия человека и смотрит, получился ли ожидаемый итог. Открыл каталог, нашёл товар, положил в корзину, оплатил, увидел номер заказа, а заказ появился в личном кабинете и ушёл в учётную систему — вот один сквозной сценарий.
Деловой перевод такой: сквозной тест отвечает на вопрос «может ли покупатель купить», а не на вопрос «правильно ли считается скидка». Второй вопрос тоже нужен, но за него отвечают проверки других уровней. Разберём их по порядку, потому что дальше в статье эти уровни встречаются постоянно.
- Модульный тест (его называют юнит-тестом) проверяет одну функцию в отрыве от остальных: например, расчёт итоговой суммы корзины с бонусами.
- Интеграционный тест проверяет связку двух-трёх частей: приложение обращается к серверной части и получает ответ в ожидаемом формате.
- Сквозной тест проходит весь путь через интерфейс, сеть, серверную часть, базу данных и внешние сервисы.
- Ручная проверка закрывает то, что не описано заранее: внешний вид, ощущение от анимации, странное поведение на конкретной модели телефона.
| Уровень проверки | Что проверяет и что ловит | Время прогона | Стоимость поддержки |
|---|---|---|---|
| Модульный | Одну функцию в изоляции: ошибку в расчёте, в формате данных, в граничном значении | Секунды | Низкая |
| Интеграционный | Связку приложения с серверной частью: несовпадение форматов, изменившийся ответ сервера | Десятки секунд | Средняя |
| Сквозной (E2E) | Весь путь покупателя целиком: «оплата не проходит», «корзина теряется при переходе» | Минуты и десятки минут | Высокая |
| Ручная проверка | Что угодно, включая внешний вид: неожиданное, чего никто не описал заранее | Часы | Кода нет, но есть время людей |
Обратите внимание на две правые колонки: сквозной уровень шире остальных по охвату и дороже в сопровождении. Из этого следует главный вывод статьи — сквозных тестов должно быть немного, и каждый из них должен быть про деньги. Общий обзор уровней и подходов мы разбирали в материале о тестировании мобильных приложений, а особенности проверок в клиентской части — в статье о тестировании фронтенда.
Что ломается, когда сквозных тестов нет
Типичная картина: каждый модуль по отдельности работает, а путь целиком — нет. Обновили платёжный модуль, форма оплаты открывается, но кнопка возврата в приложение после подтверждения перестала срабатывать на части устройств. Модульные тесты зелёные, интеграционные зелёные, а покупатель после оплаты видит пустой экран и звонит в поддержку.
Такие ошибки живут именно на стыках, и цена их находки растёт по мере приближения к выпуску:
- Нашли при разработке. Исправление занимает часы одного человека, дальше никого не задевает.
- Нашли при проверке перед выпуском. Сдвигается дата выпуска, команда проходит проверку заново — уже руками и целиком.
- Нашли после публикации. К стоимости исправления добавляется ожидание проверки обновления в магазине приложений: App Store и Google Play проверяют сборку по своим правилам, RuStore и другие сторы — по своим. Пока обновление едет, ошибка работает на всех пользователях.
- Не нашли вовсе. Ошибка приходит обратно оценками в магазине приложений и обращениями в поддержку. Оценку приложения потом поднимают месяцами.
Второе следствие — стоимость ручной проверки. Пока в приложении пять экранов, полный проход перед выпуском занимает у проверяющего половину дня. Когда добавились бонусы, доставка в пункт выдачи, оплата сохранённой картой, заказ на юридическое лицо и три города со своими остатками, полный проход растягивается на дни, и команда начинает проверять не всё, а «то, что трогали». Ошибки на стыках при таком подходе как раз и проскакивают.
Экономический смысл появляется там, где мобильный канал даёт заметную долю продаж. В кейсе Gulliver Family через приложение проходит 80% мобильного трафика, и оно приносит 50% общего дохода ритейлера. Когда половина выручки идёт через один канал, час неработающего оформления заказа — это не техническая неприятность, а вычет из дневной выручки. Как ведут себя показатели самой корзины, мы разбирали в материале о конверсии корзины интернет-магазина.
Пирамида тестирования: сколько сквозных сценариев нужно
Устоявшийся ориентир — пирамида: в основании много быстрых модульных тестов, посередине меньше интеграционных, наверху совсем немного сквозных. Форма пирамиды следует из экономики: чем выше уровень, тем медленнее прогон и тем дороже сопровождение. Сквозной тест задевает интерфейс, сеть, серверную часть и внешние сервисы, поэтому его ломает любое изменение в любом из этих мест — даже переименование кнопки.

Перевёрнутая пирамида — распространённая ошибка внедрения. Логика кажется убедительной: раз сквозной тест проверяет всё сразу, покроем им всё сразу. Через несколько месяцев набор выглядит так: полный прогон идёт полтора часа, десятая часть тестов падает без изменений в коде, разбор красного прогона занимает у команды час каждое утро. Дальше происходит предсказуемое — прогон отключают «на время», и он больше не включается.
По нашему опыту у интернет-магазина набор сквозных сценариев редко выходит за несколько десятков, и это нормальное состояние, а не признак недоработки. Полнота достигается не количеством сквозных тестов, а распределением проверок по уровням: комбинации данных и граничные значения уходят вниз, на модульный уровень, где прогон занимает секунды.
Практическое правило отбора звучит так: сквозным тестом закрывают путь, а не функцию. «Промокод даёт скидку 10% на категорию» — это модульная проверка. «Покупатель ввёл промокод и оформил заказ по сниженной цене, и в учётную систему ушла именно эта сумма» — сквозная.
Что покрывать сквозными тестами: карта сценариев по приоритетам
Список сценариев собирается не от структуры приложения, а от денег. Каждый кандидат проверяется тремя вопросами:
- Теряет ли компания деньги, если сценарий сломается? Оформление заказа — да. Экран «О компании» — нет.
- Как часто им пользуются? Вход в приложение проходят все, отмену заказа — единицы.
- Сколько систем задействовано? Чем больше стыков, тем меньше шансов, что путь проверят другие уровни тестов.
Ответы дают три группы приоритета. Первая — обязательный минимум, с которого начинают; вторая расширяет охват после того, как первая стабильно работает; третья зависит от того, как устроен конкретный бизнес.
Приоритет 1: без этих сценариев магазин не продаёт
- Регистрация и вход — по номеру телефона с кодом из СМС, по почте, через сохранённую сессию после перезапуска приложения.
- Поиск и открытие карточки товара — поиск по названию и по артикулу, переход из категории, отображение цены и наличия.
- Корзина — добавление, изменение количества, удаление, сохранение содержимого после перезапуска.
- Оформление заказа с оплатой — картой и через систему быстрых платежей, с возвратом в приложение после подтверждения.
- Промокод и бонусы — применение, пересчёт итоговой суммы, передача этой суммы дальше в заказ.
- Заказ после оформления — появился в личном кабинете, виден его статус, ушёл в учётную систему.
- Восстановление доступа — путь, который человек проходит в состоянии раздражения, и любая ошибка здесь заканчивается уходом.
Приоритет 2: расширение после того, как первая группа стабильна
- Выбор способа доставки и адреса — курьер, пункт выдачи на карте, самовывоз из конкретного магазина.
- Оплата сохранённой картой и повтор заказа — сценарий вернувшегося покупателя, у которого другой путь и другие экраны.
- Отмена заказа и возврат — вместе с проверкой, что возврат отражается в учёте.
- Переход из push-уведомления на нужный экран по ссылке внутри приложения. Как устроена сама доставка сообщений — в описании услуги push-уведомлений и в статье о push-уведомлениях в приложении.
- Смена города или магазина — остатки, цены и сроки доставки меняются вслед за выбором.
- Путь нового пользователя целиком — от установки до первого оплаченного заказа, без единого повторного входа.
Приоритет 3: зависит от модели бизнеса
- Заказ на юридическое лицо — реквизиты, счёт, отсрочка платежа. Для оптового направления это первый приоритет, а не третий; подробности — в услуге B2B-приложений для юридических лиц.
- Сканирование штрихкода в торговом зале — сценарий магазина, где приложение работает рядом с полкой.
- Программа лояльности со статусами — переход между уровнями и пересчёт правил начисления.
- Отзывы, оценки и обращения в поддержку — пути, которые редко ломают выручку напрямую, но заметны в оценках приложения.
| Сценарий | Что происходит, если он сломан | Задействовано систем | Приоритет |
|---|---|---|---|
| Вход по коду из СМС | Не заходит никто, включая вернувшихся покупателей | Приложение, серверная часть, служба рассылки | 1 |
| Корзина и оформление с оплатой | Продажи в канале останавливаются полностью | Приложение, серверная часть, платёжный шлюз, учётная система | 1 |
| Промокод и бонусы | Заказ уходит с неверной суммой, расхождение всплывает в учёте | Приложение, серверная часть, система лояльности | 1 |
| Статус заказа в личном кабинете | Растёт нагрузка на поддержку, покупатель не знает, где заказ | Приложение, серверная часть, учётная система | 1 |
| Пункт выдачи на карте | Часть заказов не оформляется, но остаётся курьерская доставка | Приложение, серверная часть, служба доставки | 2 |
| Переход из push-уведомления | Рассылки перестают приводить к покупкам | Приложение, служба отправки сообщений | 2 |
| Заказ на юридическое лицо | Останавливается оптовое направление, розница работает | Приложение, серверная часть, учётная система, документооборот | 3 (для оптовых — 1) |
Если ресурса хватает ровно на один сквозной тест, это должен быть путь «нашёл товар — положил в корзину — оплатил — увидел номер заказа». Он задевает больше стыков, чем любой другой, и ломается заметнее всех остальных.

Чего сквозными тестами не проверяют
Половина неудачных внедрений начинается с завышенных ожиданий: набор сквозных тестов воспринимают как замену всей проверке качества. Это не так — у него узкая специализация. Ниже перечислено то, что закрывается другими способами, и где эти способы сильнее сквозного подхода.
| Задача | Чем закрывается | Почему не сквозным тестом |
|---|---|---|
| Внешний вид, вёрстка, отступы | Сравнение снимков экрана, ручная проверка, аудит UX/UI | Сквозной тест видит наличие элемента, а не то, что он съехал за край |
| Плавность и скорость интерфейса | Профилирование и замеры на устройствах | Тест дожидается результата и не замечает, что покупатель ждал бы шесть секунд |
| Поведение под нагрузкой | Нагрузочное тестирование | Один сценарий в один поток ничего не говорит о тысяче одновременных покупателей |
| Защищённость платежей и данных | Отдельные проверки безопасности, аудит кода | Тест проходит путь правильного пользователя, а не путь нарушителя |
| Все комбинации данных и граничные значения | Модульные тесты | Перебор комбинаций через интерфейс превращает прогон в многочасовой |
| Совместимость с парком устройств | Матрица устройств и версий системы | Прогон идёт на нескольких конфигурациях, а не на всех, что есть у покупателей |
| Ценность идеи и выбор варианта интерфейса | A/B-тестирование | Сквозной тест проверяет работоспособность, а не то, что покупателю удобнее |
Отдельно про скорость: сквозные тесты и производительность — соседние, но разные темы. Тест дождётся ответа и покажет зелёный результат, даже если ответ пришёл через пять секунд. Где именно теряется плавность, мы разбирали в материале про производительность Flutter-приложения, а поведение системы в час пиковой нагрузки — в статье о высоконагруженных системах. Тему защиты платёжных данных отдельно разбирает материал о безопасности платежей в мобильном приложении.
Разбор одного сценария: оформление заказа с оплатой
Возьмём главный сценарий приоритета 1 и разберём его по шагам. Важная деталь, которая отличает рабочий тест от формального: на каждом шаге проверяется совпадение данных, а не факт открытия экрана. Проверка «экран корзины открылся» пропустит ситуацию, где в корзине оказался не тот товар.
| Шаг | Действие | Что проверяется |
|---|---|---|
| 0 | Подготовка: тестовый пользователь, тестовый товар с известным остатком, пустая корзина | Прогон начинается из одинакового состояния |
| 1 | Вход по тестовому номеру с фиксированным кодом | Открылся главный экран, имя пользователя совпало |
| 2 | Поиск товара по артикулу | В выдаче ровно тот артикул, цена совпадает с заданной |
| 3 | Открытие карточки и добавление в корзину | Счётчик корзины стал равен единице |
| 4 | Переход в корзину, изменение количества до двух | Сумма равна удвоенной цене товара |
| 5 | Применение промокода | Итог пересчитан по правилу промокода, а не по округлению |
| 6 | Выбор доставки и адреса | К итогу добавилась стоимость доставки для выбранного способа |
| 7 | Оплата тестовой картой в тестовом режиме шлюза | Приложение вернулось на экран подтверждения, а не осталось в браузере |
| 8 | Экран «Заказ оформлен» | Номер заказа не пустой, сумма совпадает с итогом шага 6 |
| 9 | Личный кабинет | Заказ с этим номером виден в списке, статус — «Новый» |
| 10 | Проверка в учётной системе | Заказ создан, состав и сумма совпали, остаток уменьшился на два |
| 11 | Уборка: отмена заказа, возврат остатка, очистка корзины | Следующий прогон начинается из того же состояния, что и этот |
Шаг 10 — тот, ради которого сценарий и называется сквозным. Без него тест проверяет приложение, а не продажу: заказ может красиво отобразиться на экране и не доехать до учёта. Как устроен сам обмен данными, мы разбирали в статье об автоматизации учёта товара в рознице, а формат обращений между приложением и серверной частью — в материале о проектировании REST API. Настройку самого обмена закрывает услуга интеграции с учётной системой, а связку с системой продаж — интеграция приложения с CRM.
Шаг 11 в наборах пропускают чаще всего, и именно он потом даёт «тест проходит только с первого раза». Если прогон оставляет после себя товар в корзине и неотменённый заказ, второй прогон начинается из другого состояния и падает на шаге 3.

Чем это пишется. Для приложений на Flutter путь целиком проходят встроенные интеграционные тесты — тот же код работает и на iOS, и на Android, что для единой кодовой базы означает один набор сценариев вместо двух. В нативной разработке те же задачи закрывают Espresso на Android и XCTest на iOS, но набор придётся вести дважды. Как устроена сама единая кодовая база для приложения и сайта — в описании кроссплатформенной разработки на Flutter и в услуге Flutter для e-commerce.
Стенд, тестовые данные и внешние сервисы
Половина работы над сквозным набором приходится не на сами тесты, а на условия, в которых они запускаются. Пять решений, которые принимаются до написания первого сценария:
- Отдельный стенд. Прогоны идут не на боевой системе: тест создаёт заказы, меняет остатки и отменяет то, что создал. Стенд повторяет боевую сборку по составу сервисов, а каталог на нём — уменьшенная копия настоящего.
- Свои данные. У набора собственные пользователи, собственные товары и собственные промокоды. Общие данные с ручной проверкой приводят к тому, что тест падает, потому что кто-то менял тот же товар руками.
- Тестовый режим оплаты. Платёжные шлюзы дают тестовые реквизиты и набор карт с заданным поведением: успешная оплата, отказ банка, недостаток средств. Настоящие деньги в прогоне не участвуют, а сценарий отказа проверяется так же, как успешный.
- Предсказуемый вход. Код из СМС — частая причина, по которой набор не удаётся запустить автоматически. Решение стандартное: отдельный тестовый номер с фиксированным кодом, который работает только на стенде.
- Граница заглушек. Внешние сервисы можно заменить заглушкой — упрощённым ответом вместо настоящего вызова. Заглушка убирает нестабильность, но вместе с ней убирает и смысл проверки: заглушенный платёж не докажет, что оплата работает.
По последнему пункту работает простое правило: то, ради чего сценарий назван сквозным, заглушкой не заменяется. Для оформления заказа это платёжный шлюз и учётная система — они остаются настоящими, только в тестовом режиме. Всё остальное, что мешает и не относится к сути проверки (внешняя служба рекомендаций, сервис отзывов, сторонняя аналитика), заглушается без потерь.

Отдельный вопрос — где прогонять. Набор, который запускается по кнопке на компьютере разработчика, живёт до первого аврала. Рабочий вариант — автоматический запуск при каждом изменении кода, с отчётом, снимком экрана и записью происходившего в момент падения. Без записи разбор красного прогона превращается в попытку воспроизвести падение вручную, а это самая затратная часть сопровождения.
Нестабильные тесты: почему наборы забрасывают
Сквозные наборы редко умирают от того, что их не написали. Они умирают от нестабильности: тест падает без изменений в коде, команда привыкает к красному результату и перестаёт его разбирать. Восемь причин, которые встречаются чаще остальных:
- Ожидание по таймеру вместо ожидания события. «Подождать три секунды и нажать» работает на быстрой машине и падает на загруженной. Правильное ожидание — до появления элемента или до завершения запроса, с предельным сроком.
- Поиск элемента по видимой надписи. Маркетолог поменял «Оформить заказ» на «К оплате» — упало двадцать тестов. Устойчивый признак элемента задаётся в коде разработчиком и не зависит от текста на кнопке.
- Общие данные между сценариями. Два теста используют одного пользователя, запускаются одновременно и мешают друг другу.
- Зависимость от порядка запуска. Сценарий проходит только после другого сценария, который создал ему нужное состояние. При параллельном прогоне такой набор рассыпается.
- Живой внешний сервис в сценарии, который не про него. Сторонняя служба отвечает медленно раз в сто прогонов — и этого достаточно, чтобы набор считали ненадёжным.
- Один тест проверяет пятнадцать вещей. Упал на девятой — по отчёту непонятно, что сломалось. Сценарий должен проверять один путь, а не всё приложение.
- Красный прогон никто не разбирает в тот же день. За неделю накапливается десяток падений, и разобрать их разом уже невозможно.
- Прогон запускается вручную. Пока запуск зависит от человека, он пропускается ровно в те дни, когда нужен больше всего.

Организационное правило, которое снимает большую часть перечисленного: нестабильный тест либо чинится в тот же день, либо выносится из основного прогона — с заведённой задачей на исправление и сроком. Набор, в котором «пара тестов всегда красные», перестаёт быть инструментом принятия решений: команда уже не может отличить обычное падение от настоящей ошибки.
Второе правило касается порядка работ. Устойчивые признаки элементов проставляются в коде до того, как написан первый сценарий. Если этот шаг пропустить, набор пишется через поиск по надписям, а потом переписывается целиком — и в смете это выглядит как двойная оплата одной работы.
Метрики: как понять, что набор окупается
Сквозные тесты — статья расходов, которая продолжается всё время жизни продукта, поэтому её результат стоит измерять. Шесть показателей, которых достаточно для решения «продолжаем или меняем подход»:
| Показатель | Как считать | На что смотреть |
|---|---|---|
| Покрытие критичных сценариев | Сколько путей из группы приоритета 1 закрыто автоматически | Первая цель — закрыть эту группу целиком, дальше расширять |
| Время полного прогона | От запуска до отчёта | Прогон, который не укладывается в рабочий цикл команды, перестают ждать |
| Доля нестабильных прогонов | Падения без изменений в коде, делённые на все прогоны | Растущая доля — сигнал остановить расширение набора и заняться устойчивостью |
| Время ручной проверки перед выпуском | Часы проверяющих на один выпуск | Сравнение с показателем до внедрения — прямая экономия в часах |
| Ошибки, найденные после выпуска | Обращения в поддержку, оценки в магазине приложений, сбои в мониторинге | Показатель, ради которого всё делается |
| Частота выпусков | Сколько обновлений вышло за месяц | Растёт, когда команда перестаёт бояться регрессии |

Последняя строка — самая деловая из шести. Смысл автоматической проверки не в отчёте с зелёными галочками, а в том, что обновление выходит тогда, когда оно готово, а не тогда, когда закончилась ручная проверка. В кейсе Street Beat за пять месяцев после запуска команда закрыла 700+ задач и выпустила 7 релизов — такой темп держится только при автоматической проверке повторяющихся путей. Остальные показатели продукта и разработки разбирают материалы о 15 метриках разработки и об аналитике мобильного приложения.
Чек-лист внедрения: с чего начать
Порядок ниже рассчитан на команду, у которой сквозных тестов пока нет. Пункты идут именно в этой последовательности: каждый следующий опирается на предыдущий.
- Выпишите 5–7 путей, где ломается выручка. Не функций, а путей — от входа до результата в учёте.
- Проверьте, есть ли у элементов интерфейса устойчивые признаки. Если их нет, проставьте до написания сценариев.
- Поднимите стенд с отдельной базой и уменьшенной копией каталога.
- Договоритесь о тестовых данных — пользователи, товары, промокоды, тестовый номер с фиксированным кодом.
- Включите тестовый режим платёжного шлюза и получите набор карт с заданным поведением.
- Напишите первый сценарий — «нашёл, положил в корзину, оплатил, увидел заказ в учёте».
- Поставьте прогон на автоматический запуск при каждом изменении кода, а полный набор — по расписанию раз в сутки.
- Настройте отчёт со снимком экрана и записью происходившего в момент падения.
- Введите правило разбора красных прогонов в тот же день и назначьте ответственного за набор.
- Расширяйте до второй группы приоритета только после того, как первая проходит стабильно.
- Пересматривайте список раз в квартал — сценарии, которые перестали быть про деньги, удаляйте, а не поддерживайте по инерции.
Пункт 11 в наборах игнорируют чаще всего. Набор растёт год за годом, время прогона растёт вместе с ним, а половина сценариев проверяет функции, которыми давно никто не пользуется. Удаление устаревшего теста — такая же нормальная работа, как написание нового.
Кто это делает и из чего складывается смета
Сквозной набор ведут три роли. QA-инженер по автоматизации пишет и сопровождает сценарии. Разработчик проставляет в коде устойчивые признаки элементов и правит то, что тесты нашли. DevOps-инженер настраивает стенд и автоматический запуск при каждом изменении кода. На небольшом проекте эти роли совмещаются, но пропустить нельзя ни одну: набор без стенда не запускается, а без признаков элементов — не пишется.
Смета складывается из четырёх частей, и первая обычно недооценивается:
- Подготовка — стенд, тестовые данные, тестовый режим оплаты, признаки элементов в коде. Разовая работа, но заметная по объёму.
- Написание сценариев — считается по количеству путей и числу задействованных систем, а не по количеству экранов.
- Настройка автоматического запуска и отчётов — тоже разовая часть.
- Сопровождение — регулярная ежемесячная работа: каждое изменение интерфейса и каждый новый модуль требуют правки сценариев.
Как это устроено у нас. FITTIN — модульная Flutter-платформа: приложение и сайт интернет-магазина собираются из готовых модулей (каталог, поиск, корзина, оплата, лояльность, push, интеграции с 1С и маркетплейсами), а уникальные сценарии дописываются на исходном коде. Для сквозных проверок это означает конкретную вещь: базовые пути каталога, корзины и оплаты уже реализованы и проверены внутри модулей, поэтому под проект пишутся сценарии на брендовые отличия и на интеграции конкретного клиента, а не весь путь покупателя с нуля. QA-инженер входит в закреплённую за проектом команду вместе с аналитиком, дизайнером, Flutter- и бэкенд-разработчиками и руководителем проекта — проверка идёт параллельно разработке, а не отдельным этапом после неё.
Модель оплаты состоит из трёх частей. Первая — единоразовая интеграция платформы под ваш бренд, до 30 рабочих дней. Вторая — ежемесячные лицензионные платежи, в которые уже включены затраты на техническую поддержку команды FITTIN: мониторинг, обновления модулей и обновления безопасности, поэтому собственная команда разработки для базового сопровождения не требуется. Третья — новый функционал и доработки отдельно, по Time & Materials, с оценкой задачи в часах перед стартом. Расширение сквозного набора под уникальные сценарии относится к третьей части. Действующие пакеты и суммы — на странице тарифов, порядок бюджета под задачу считает калькулятор стоимости.
Что можно взять по частям: тестирование и QA мобильных приложений — на постановку процесса целиком; аутстаффинг QA-инженеров, Flutter-разработчиков и DevOps-инженеров — на усиление своей команды; аудит мобильного приложения, аудит кода и комплексный аудит интернет-магазина — на обследование существующего продукта; техническую поддержку приложений — на постоянное сопровождение, в том числе продуктов, сделанных другими подрядчиками. Требования к проверкам полезно зафиксировать письменно до старта работ — этим занимается разработка технического задания.
Серверная часть у нас делается на Python: разработка на Django для крупных каталогов и админок, разработка на FastAPI — для программных интерфейсов с высокой долей одновременных обращений. Устройство самой платформы описано в статье о модульной платформе для e-commerce, а состав работ по проекту целиком — в услуге комплексной разработки интернет-магазина. Готовые решения для торговли — мобильные приложения для e-commerce и сайты интернет-магазинов.
Кейсы: где сквозные проверки были частью задачи
Ниже — проекты, в которых состав сценариев задавался не пожеланиями команды, а устройством бизнеса: числом каналов, объёмом каталога или тем, что покупатель делает в момент покупки. Метрики взяты со страниц кейсов.
«Сатурн»: четыре магазина приложений и нестандартные сценарии покупки
Сеть строительных магазинов в 20+ городах, более 30 000 товаров. Помимо обычного пути покупателя — колеровка краски, распил материалов, доставка с манипулятором и оформление на юридическое лицо, и каждый из этих путей нужно проходить целиком. Публикация прошла одновременно в четырёх магазинах приложений, результат первого месяца — 7 594 установки и конверсия 12,4%. Одна кодовая база здесь означает и один набор сценариев на все четыре канала.
Gulliver Family: половина дохода идёт через приложение
Мультибрендовый магазин детских товаров: 4 бренда, 5 направлений. Через приложение проходит 80% мобильного трафика, и оно приносит 50% общего дохода ритейлера. Когда канал даёт половину выручки, набор проверок перестаёт быть внутренним техническим стандартом: сломанное оформление заказа считается уже в деньгах дня, а не в задачах команды.
Finn Flare: две страны, две валюты, один набор сценариев
Перезапуск существующего приложения на Flutter для России и Казахстана с мультивалютностью. Сквозной путь здесь удваивается: тот же заказ проходится в другой стране, с другой валютой и другими способами оплаты. Показатели перезапуска — бюджет в 2,5 раза меньше, скорость разработки в 1,5 раза выше, выпуск занял около 30 рабочих дней.
Ещё два среза. В кейсе «Европа Маркет» (149 839 пользователей) покупатель пользуется приложением, стоя у полки: сканирует штрихкод, ищет товар, смотрит скидку по карте лояльности — такой сценарий проверяется целиком, потому что человек ждёт ответ здесь и сейчас. В кейсе DAISYKNIT приложение переезжало с коробочного решения на Flutter с сохранностью клиентской базы 100%: при переезде сквозные пути проходятся дважды — на старых данных и на перенесённых. Как ведёт себя онлайн-ритейл по сезонам и каналам, регулярно разбирает Data Insight. Остальные проекты — в разделе кейсов.

Итог: сквозное тестирование на одной странице
Сквозной набор — не про полноту проверки, а про то, чтобы деньги в приложении не переставали ходить. Короткий порядок действий:
- Сценарии отбираются по деньгам, а не по структуре приложения. Три вопроса: теряется ли выручка, часто ли этим пользуются, сколько систем задействовано.
- Начинайте с одного пути — «нашёл, положил в корзину, оплатил, увидел заказ в учёте». Он задевает больше стыков, чем любой другой.
- Держите пирамиду. Комбинации данных и граничные значения — на модульном уровне, сквозной уровень остаётся узким.
- Не заглушайте то, ради чего сценарий сквозной. Платёжный шлюз и учётная система остаются настоящими, но в тестовом режиме.
- Устойчивость важнее охвата. Нестабильный тест чинится в тот же день или выносится из основного прогона с задачей на исправление.
- Запуск — автоматический, при каждом изменении кода, с записью происходившего в момент падения.
- Раз в квартал чистите набор — устаревший сценарий удаляют, а не поддерживают по инерции.
Что делать дальше:
- Поставить процесс проверок целиком — тестирование и QA мобильных приложений; понять состояние существующего продукта — аудит мобильного приложения или аудит кода.
- Проверить смежные слои — нагрузочное тестирование на поведение под нагрузкой, аудит UX/UI на удобство сценариев, A/B-тестирование на выбор варианта интерфейса.
- Усилить команду — QA-инженеры, Flutter-разработчики, DevOps-инженеры; передать сопровождение — техническая поддержка приложений.
- Зафиксировать требования до старта работ — разработка технического задания; посчитать порядок бюджета — калькулятор стоимости; описать задачу — контакты.
Вопросы и ответы
Чем сквозной тест отличается от интеграционного?
Границей проверки. Интеграционный тест берёт две-три части системы и убеждается, что они договорились между собой: приложение отправило запрос, серверная часть ответила в ожидаемом формате. Сквозной идёт по всему пути пользователя через интерфейс — нажимает те же кнопки, что и покупатель, и в конце проверяет результат там, где он должен появиться: в личном кабинете и в учётной системе. Из-за этого сквозной тест находит ошибки на стыках, которые интеграционный не видит, но работает в разы дольше и требует больше сопровождения.
Сколько сквозных тестов нужно интернет-магазину?
Считать стоит не тесты, а пути. Обязательный минимум — семь путей приоритета 1: вход, поиск и карточка товара, корзина, оформление с оплатой, промокод и бонусы, заказ в личном кабинете и в учёте, восстановление доступа. Дальше добавляется вторая группа: доставка и пункт выдачи, повтор заказа, отмена и возврат, переход из push-уведомления, смена города. По нашему опыту набор у интернет-магазина редко выходит за несколько десятков сценариев — дальше растёт время прогона, а прирост найденных ошибок останавливается.
Можно ли автотестами заменить ручную проверку?
Полностью — нет, и такой цели не ставят. Автоматика сильна в повторении: она без устали проходит одни и те же пути перед каждым выпуском и снимает с людей рутину регрессии. Человек сильнее в другом — замечает то, что никто не описал заранее: съехавшую вёрстку на узком экране, неудобный порядок шагов, странное поведение после входящего звонка. Рабочее распределение выглядит так: повторяющиеся денежные пути закрывает автоматика, новую функциональность и внешний вид проверяет человек.
Сколько времени занимает написание одного сценария?
Зависит от того, сколько систем сценарий задевает. Короткий путь вроде входа пишется быстро, оформление заказа с оплатой и проверкой в учётной системе — заметно дольше, причём большая часть работы приходится не на сам тест, а на подготовку: стенд, тестовые данные, тестовый режим шлюза, устойчивые признаки элементов в коде. Именно поэтому первый сценарий всегда самый затратный, а пятый и десятый пишутся кратно быстрее — подготовка к тому моменту уже сделана. Оценка задачи в часах даётся до начала работ.
Тесты падают через раз — это нормально?
Нет, и это состояние опаснее, чем отсутствие тестов: команда привыкает к красному результату и перестаёт отличать обычное падение от настоящей ошибки. Типичные причины — ожидание по таймеру вместо ожидания события, поиск элемента по надписи на кнопке, общие данные между сценариями и живой внешний сервис там, где сценарий не про него. Лечится это правилом: нестабильный тест чинится в тот же день либо выносится из основного прогона с заведённой задачей и сроком. Разобраться в причинах на существующем проекте помогает аудит кода и истории прогонов.
Нужны ли сквозные тесты, если приложение собрано из готовых модулей платформы?
Нужны, но объём работы меньше. Базовые пути каталога, корзины и оплаты уже реализованы и проверены внутри модулей платформы, поэтому под проект пишутся сценарии на то, что отличает конкретный магазин: интеграцию с его учётной системой, его правила лояльности и промокодов, его способы доставки и оплаты, кастомные доработки под бренд. Именно эти места и ломаются чаще всего, потому что они уникальны для проекта и нигде больше не проверялись.
Как проверять оплату, не тратя настоящие деньги?
Платёжные шлюзы дают тестовый режим: отдельные реквизиты магазина и набор карт с заданным поведением — успешная оплата, отказ банка, недостаток средств, истёкший срок карты. Прогон идёт по тем же экранам, что и настоящая покупка, но деньги не списываются. Сценарии отказа проверяются наравне с успешным: приложение должно вернуть покупателя на понятный экран с объяснением, а не оставить его в браузере. Отдельно стоит убедиться, что тестовый режим включён только на стенде и не может оказаться в сборке для магазина приложений.
Что делать, если в приложении нет устойчивых признаков у элементов?
Проставить их до написания сценариев — это задача разработчиков, и она занимает меньше времени, чем последующее переписывание набора. Без таких признаков тесты приходится писать через поиск по видимым надписям, а любое изменение текста на кнопке роняет их пачками. Порядок работ такой: сначала разработчики размечают элементы на экранах приоритета 1, затем QA-инженер пишет по ним сценарии. Если продукт делал другой подрядчик и разметки нет, объём этой подготовки оценивается по итогам обследования кода.
Материал носит информационно-аналитический характер, отражает оценку команды FITTIN на дату публикации.