И как не утонуть между БКИ, Госуслугами и тремя платформами одновременно
Один QA, три платформы, шесть внешних сервисов, легаси-код и огромное количество неопределённости — в требованиях и поведении интеграций, а также в том, что вообще считать корректным результатом. Расскажу, как выстроить тестирование сложного финансового процесса, чтобы до релиза «добиралось» не более 5—7 багов, и все они были известны заранее.
?Контекст: что вообще происходит
Речь идёт об ипотечном процессе в экосистеме Сбербанк/Домклик. Приложение работает на iOS, Android и в вебе. Стек — Java и Kotlin на бэкенде, Swift, Java и Kotlin на фронтенде. Задача QA — обеспечить стабильную работу одного из самых критичных клиентских сценариев: подачи заявки на ипотеку.
Процесс выглядит так:
Лендинг └─▶ Анкета с данными клиента └─▶ Подтверждение операции по СМС └─▶ Рассмотрение заявки └─▶ Одобрение / Отказ / Отправка на доработку └─▶ Загрузка документов по недвижимости └─▶ Проведение сделки и выдача кредита
На первый взгляд, линейный процесс, на практике же это многослойная система с внешними зависимостями, асинхронными операциями, данными из трёх источников и поведением, которое может отличаться на каждой платформе. К этому добавляется структурная неопределённость: требования приходят неполными, поведение части интеграций нигде не задокументировано, а граница между «так и должно быть» и «это баг» нередко устанавливается в ходе обсуждений уже после того, как проблема обнаружена.
К этому добавляется корпоративная реальность Сбера: каждый этап процесса — это не просто техническая интеграция, а отдельная команда со своим бэклогом, приоритетами и пониманием того, как должна работать система. Команда ипотечного продукта, команда профиля клиента, команда авторизации, смежные команды Домклик — у каждой своя зона ответственности, и граница между ними проходит там, где чаще всего возникают баги.
? Архитектура интеграций: откуда берутся данные
Прежде чем говорить о тестировании, важно понять, с чем именно мы работаем. В ипотечном процессе задействованы следующие внешние системы:
Этап |
Интеграция |
Что может пойти не так |
Анкета |
Профиль клиента |
Данные устарели, не синхронизированы между платформами |
СМС-подтверждение |
Внутренний сервис подтверждения операции |
Разные состояния, истёкший токен, дубль запроса |
Подтверждение дохода |
Госуслуги (ЕСИА) |
Данные пользователя на Госуслугах расходятся с профилем |
Рассмотрение |
БКИ, ИНН, паспорт |
Таймауты, некорректный маппинг ответа, частичные данные |
Одобрение |
Внутренний скоринг |
Сумма из БД отображается некорректно после пересчёта |
Документы / Сделка |
Домклик (веб/мобильное приложение) |
Переход между мобильным приложением и вебом, потеря контекста |
Каждая из этих интеграций — потенциальная точка отказа. В отличие от изолированного unit-теста, здесь нельзя замокать «всё сразу» и считать задачу выполненной. Критически важно проверять поведение системы именно на стыках. Дополнительную сложность создаёт тот факт, что у каждой интеграции есть свой владелец. Когда падает ЕСИА или БКИ возвращает неожиданный ответ, выяснить, чья это зона ответственности, становится нетривиальной задачей. В крупной корпорации фраза «это не наш сервис» — полноценный ответ, с которым нужно уметь работать.
?️Техники тест-дизайна: почему здесь нельзя обойтись чек-листом
Финансовый процесс — один из тех случаев, когда применение техник тест-дизайна не является формальностью, а напрямую определяет покрытие.
Классы эквивалентности и граничные значения
Анкета содержит числовые поля: сумма кредита, первоначальный взнос, срок. Для каждого из них необходимо проверять не только «хороший» путь, но и:
Минимально и максимально допустимые значения
Значения на единицу меньше или больше допустимого диапазона
Нулевые и отрицательные значения (особенно при ручном вводе)
Поведение калькулятора при изменении одного параметра относительно других
Именно здесь обнаружили один из ключевых багов: после подтверждения дохода через Госуслуги пересчёт суммы одобрения не подтягивался корректно. Приложение продолжало отображать значение из предыдущего расчёта. Баг воспроизводился только при определённой последовательности действий: сначала расчёт без Госуслуг, затем авторизация и повторный расчёт в той же сессии.
Таблицы принятия решений
Решение о результате рассмотрения заявки зависит от комбинации факторов: данных БКИ, типа дохода, гражданства, наличия созаёмщика. Таблица принятия решений позволяет явно описать все значимые комбинации и убедиться, что ни один граничный случай не упущен.
Попарное тестирование (Pairwise)
Три платформы (iOS, Android и веб) × несколько типов устройств × несколько сценариев авторизации × несколько состояний профиля — это комбинаторный взрыв. Pairwise‑подход позволяет сократить матрицу тестовых сценариев до управляемого размера без потери покрытия на уровне попарных взаимодействий.
Тестирование состояний (State Transition)
Процесс заявки — это конечный автомат. Каждый статус (черновик, на рассмотрении, одобрено, отказ, архив) допускает определённые переходы и запрещает другие. Тестирование некорретных переходов (например, попытка повторной подачи заявки в статусе «на рассмотрении») часто выявляет баги, которые пропускаются при позитивном тестировании.
? Самые показательные баги: разбор по категориям
1. Потеря данных анкеты при сворачивании приложения
Сценарий: пользователь частично заполнил анкету, свернул приложение (например, чтобы уточнить паспортные данные в другом приложении), вернулся — часть полей сброшена.
Корневая причина: отсутствие сохранения промежуточного состояния формы. Поведение при background/foreground‑переходе различалось на iOS и Android: на одной платформе данные сохранялись, на другой — нет.
Почему это критично: ипотечная анкета — это не форма с тремя полями. Пользователь тратит время, а часть данных требует обращения к документам. Потеря данных означает потерю пользователя.
Как обнаружили: целенаправленное тестирование жизненного цикла приложения: переходы в фон, входящие звонки, переключение между приложениями, нехватка памяти на устройстве.
2. Расхождение данных между профилем и Госуслугами
Сценарий: данные клиента в профиле Сбера (например, адрес регистрации или серия паспорта) не совпадают с данными, полученными через ЕСИА.
Проблема: система не имела чёткой логики разрешения конфликта данных. В одних случаях данные из Госуслуг перезаписывали профиль без предупреждения, в других — игнорировались. В ряде случаев в заявку попадала смесь из обоих источников.
Как обнаружили: перехват трафика через Proxyman с анализом тела запроса на каждом шаге. Сравнение данных в трёх точках: профиль клиента, ответ ЕСИА, тело заявки, отправленной на рассмотрение.
3. Некорректное отображение суммы одобрения из базы данных
Сценарий: после получения одобрения в приложении отображалась сумма, не совпадающая с реально одобренной. Расхождение возникало в случаях, когда в процессе рассмотрения параметры заявки пересчитывались на стороне бэкенда (например, скоринг скорректировал максимальную сумму).
Корневая причина: интерфейс получал данные из кеша, который не инвалидировался при обновлении записи в базе данных.
Как обнаружили: сравнение значений через внутреннюю админку с тем, что отображается в приложении в момент смены статуса заявки.
4. Параллельные изменения в iOS, Android и в вебе
Сценарий: фича, затрагивающая расчёт ипотечного калькулятора, релизилась поэтапно. В вебе изменение уже было, на Android — нет, а на iOS — частично. В результате одна и та же заявка, открытая на разных устройствах, показывала разные суммы.
Почему это системная проблема: при кросс‑платформенной разработке версионирование API и синхронность фича‑флагов требуют явного тестового покрытия. Нельзя считать задачу закрытой, протестировав одну платформу.
Решение на уровне процесса: обязательная кросс‑платформенная регрессия для любых изменений, затрагивающих общий бэкенд или общую логику расчётов.
?️ Инструментарий и инфраструктура
Proxyman — главный инструмент анализа интеграций
Перехват HTTPS‑трафика на реальных устройствах позволяет видеть то, что не видно через интерфейс: что именно уходит в запросе, что возвращает внешний сервис, где происходит сопоставление данных. Для тестирования интеграций с Госуслугами и БКИ это незаменимый инструмент, особенно когда нужно воспроизвести конкретный ответ от внешней системы без её реального вызова.
Zephyr + Allure — управление тест‑артефактами
Zephyr используется для ведения тестовых сценариев и отслеживания выполнения регрессии. Allure применяется для генерации отчётов по прогонам автотестов. Эта связка даёт полную картину: что было запланировано, что запущено автоматически, что упало, что проверено вручную.
Внутренние админки — источник истины
Для финансового процесса интерфейс никогда не является конечной точкой верификации. Данные в заявке, статусы, суммы, журналы переходов — всё это необходимо проверять непосредственно в административных системах. Именно через них выявляются расхождения между тем, что видит пользователь, и тем, что реально хранится в системе.
Коммуникации в корпоративном контексте: где теряется качество
Технические проблемы в большом продукте редко бывают исключительно техническими. Чаще всего за ними стоит коммуникационный разрыв: между командами, между ролями внутри команды, между формальным описанием задачи и тем, что реально имелось в виду.
Между командами
В рамках одного процесса QA взаимодействует минимум с тремя‑четырьмя смежными командами: владельцами профиля клиента, командой авторизации, интеграционными командами на стороне Домклик. У каждой команды свой ритм релизов, своя тестовая среда и свои дежурные.
Практика, которая работает: устанавливать прямые контакты с QA и разработчиками смежных команд ещё до того, как что‑то сломалось. Когда баг на стыке систем уже в работе — знакомиться не лучшее время. Если смежная команда планирует изменения в API или поведении сервиса, то об этом нужно знать заблаговременно, а не из Сhangelog после развёртывания.
Отдельный навык — уметь чётко сформулировать, где именно находится граница проблемы. «У нас что‑то сломалось с Госуслугами» — это не баг‑репорт для смежной команды, а приглашение к долгому выяснению. «После авторизации через ЕСИА в теле запроса поле registrationAddress приходит на рассмотрение пустым, хотя в ответе ЕСИА оно присутствует» — это уже разговор.
Внутри команды: QA ↔ разработчик ↔ аналитик
Треугольник QA — разработчик — аналитик в финансовом продукте работает только при одном условии: у каждого есть чёткое понимание зоны ответственности другого. Аналитик описывает бизнес‑логику, но редко указывает граничные случаи и поведение при ошибках, поскольку это зона ответственности QA. Если QA пассивно ждёт «полного» ТЗ, то получает его постфактум в виде багов на проде.
Разработчик реализует то, что написано в задаче. Если в задаче не описывается поведение при конфликте данных из ЕСИА и профиля, то разработчик сделает так, как ему показалось логичным. QA должен поднимать эти вопросы до начала разработки, а не после.
На практике это выглядит так: при появлении задачи в бэклоге QA изучает её первым. Не для того чтобы написать тестовые сценарии, а чтобы задать неудобные вопросы, пока ещё не поздно. Вопросы в Refinement вроде «Что происходит, если пользователь авторизовался через ЕСИА, но его паспортные данные там отличаются от профиля?» на этом этапе стоят в разы дешевле, чем после релиза.
⚙️Автоматизация: что покрыто и почему?
Регресс бэкенда и мобильный регресс — наиболее стабильная и повторяемая часть тестирования. Автоматизация регрессионного прогона на реальных устройствах (iOS + Android/back) обеспечивает стабильное время выполнения и исключает человеческий фактор из рутинных проверок. Это особенно важно при кросс‑платформенном тестировании, где объём комбинаций для ручной проверки неприемлем.
Работа с легаси: специфика, которую нельзя игнорировать
Кодовая база частично является легаси и продолжает им оставаться в ряде модулей. Это накладывает специфику на тестирование.
Неочевидные зависимости: изменение одного компонента может неожиданно сломать другой, не связанный с ним напрямую. Регрессия должна быть шире, чем зона изменений.
Отсутствие документации на часть поведения: исторически сложившаяся логика иногда не отражена в спецификациях. Единственный способ понять, как должно работать, — анализ трафика, тестирование в промышленном окружении и общение с разработчиками.
Технический долг как источник регрессионных багов: баги, которые кажутся новыми, нередко оказываются проявлениями давно существующих проблем, проявившихся в новом контексте. Для легаси‑флоу история багов — часть знаний QA.
Легаси увеличивает коммуникационные издержки: когда поведение системы не задокументировано, каждое выяснение «как это работает» требует поиска человека с нужным контекстом. В крупной корпорации этот человек может находиться в другой команде, другом часовом поясе или уже не работать в компании. Формирование и поддержание внутренней базы знаний по процессу — не бюрократия, а страховка.
Метрики процесса
Точных количественных метрик по конверсии или Crash Rate я не привожу, поскольку сбор таких данных выходит за рамки QA‑процесса. Однако есть операционные показатели, которые характеризуют стабильность процесса:
5—7 багов стабильно фиксируются в тестовой среде перед каждым релизом, и все они известны команде до момента выпуска. Отсутствие неожиданностей на проде — это и есть главный KPI.
Время регрессии стабильно от спринта к спринту. Это означает, что автоматизация работает предсказуемо и не деградирует по мере роста кодовой базы.
Нет критических инцидентов в проде по процессу подачи заявки. Финансовые данные клиентов не повреждаются, заявки не теряются.
Выводы
Тестирование ипотечного процесса — это не «нажать кнопки и проверить, что всё позеленилось». Это глубокое понимание архитектуры интеграций, умение читать трафик и знание того, что данные из трёх разных источников должны корректно объединяться в одной точке без потерь и искажений.
Вот несколько принципов, которые работают в этом контексте:
Интерфейс — не источник истины. Всегда проверяй данные через бэкенд и административные системы.
Каждая интеграция — отдельная точка отказа. Тестируй не только Happy Path, но и поведение при частичном ответе, таймауте и конфликте данных.
Кросс‑платформа — это не «запусти на втором устройстве». Это отдельная матрица тестовых сценариев с учётом версионирования и поэтапного развёртывания.
Легаси требует более широкой регрессии. Зона изменений и зона риска в легаси‑коде не совпадают.
Стабильный процесс важнее идеального покрытия. Предсказуемое качество, которое можно измерить и повторить, ценнее разовых проверок на полноту.
Коммуникация — часть тестирования. Вопрос, заданный на Refinement, обходится дешевле, чем баг в проде. Прямой контакт со смежной командой эффективнее переписки через менеджеров во время инцидента.
Ипотека — это решение, которое клиент принимает один раз в несколько лет, а иногда и раз в жизни. Цена ошибки в этом процессе несопоставимо выше, чем в большинстве других продуктов. Именно это делает процесс одним из наиболее требовательных к качеству тестирования в мобильной разработке.