Куб из сфер — знак студии

12 лет в заказной разработке

Автотесты для системы, которая уже работает

Узнавать о поломке от теста, а не от клиента. Мы держим 173 сквозных теста на собственном маркетплейсе, 2053 проверки на операционной платформе и 30 сценариев, которые гоняют мобильное приложение на живом устройстве.

Смотреть работы
Автотесты//Автотесты//Автотесты//Автотесты//Автотесты//Автотесты//Автотесты//Автотесты//Автотесты//Автотесты//Автотесты//Автотесты//Автотесты//Автотесты//
Узнаёте?

Сюда обычно приходят после одной из таких недель

  • «Перед релизом кто-то руками прокликивает одни и те же двадцать экранов. И всё равно проскакивает.»

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

  • «Оплата не работала две недели. Узнали от клиента, который не смог нам заплатить.»

    За путём, по которому идут деньги, никто не следил. Разрыв между «сломалось» и «узнали» — это и есть потерянная выручка.

  • «Тесты у нас есть. Половина красные, никто не помнит почему, пайплайн настроен продолжать в любом случае.»

    Сьют, которому не верят, хуже, чем его отсутствие: он тратит минуты на каждый пуш и не даёт ни грамма уверенности.

  • «Код оплаты трогать никто не хочет. Работает — и ладно.»

    Самый дорогой симптом. Когда команда перестаёт менять часть продукта, продукт в этом месте перестаёт развиваться.

Пакет

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

от 150 000 ₽
Фиксированная за объём ниже, а не почасовая ставка: число не поедет, пока мы работаем. Мобильные пути считаются сверху — эмуляторы в CI дороже безголового браузера.
Две недели
От первого созвона до сьюта, который крутится в вашем пайплайне, а не на нашем ноутбуке.

Что вы получаете

  • Двенадцать–пятнадцать критичных путей, выбранных вместе — те, что стоят денег, когда падают
  • Сьют в вашем репозитории: Playwright для веба, Patrol для Flutter. Ваш, и остаётся у вас, даже если мы разойдёмся
  • Подключение к пайплайну: каждый пуш и каждый пул-реквест, с результатом прямо в нём
  • Видео и трассировка на каждое падение — разработчик видит, что произошло, а не воспроизводит заново
  • Тестовые данные, которые создаются сами: прогон не зависит от базы, которую кто-то однажды наполнил
  • Короткая инструкция, как написать следующий тест самим, написанная по вашему же сьюту
  • Две недели правок после передачи — входят в цену

Что не входит

  • Полная регрессия всех экранов — это работа другого размера, и мы скажем это до того, как вы купите эту
  • Нагрузочное тестирование
  • Ручная проверка каждого релиза
  • Починка багов, которые найдут тесты. Покажем их и оценим отдельно
  • Спасение большого сьюта, который забросил кто-то другой
173
сквозных теста на нашем собственном маркетплейсе
30
сценариев Patrol гоняют приложение на устройстве
2053
проверки в операционной платформе, которую мы ведём
Что попадает под тест

Какие пути покрываем и на каких средах

Сьют стоит ровно столько, сколько стоит его худший непокрытый путь. Поэтому объём — это не «приложение», а именованный список сценариев, каждый на той среде, где им реально пользуются. Ниже типичная форма пакета; настоящий список рождается за первые два дня.

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

Пустые клетки — не пробелы, а решение. Сьют, который обещает всё на всех средах, обычно не гоняли ни на одной.

Почему начинаем с денег, а не с главного экрана

Первые тесты пишутся на пути, где ошибка стоит денег: оплата, пополнение, выплата, возврат. Это не «самые важные функции», а самые дорогие поломки. Всё остальное можно починить в понедельник, а неработающую оплату — нельзя.

Как это выглядит на маркетплейсе с эскроу

Мобильное приложение тестируется иначе

Сквозной тест веба — задача решённая. Гонять настоящее Flutter-приложение на настоящем устройстве, через системное окно разрешений, платёжную шторку и пуш, пришедший на заблокированный экран, — нет, и именно там живут интересные падения. Мы делаем это на Patrol: наше приложение несёт 30 таких сценариев, а бэкенд под ним — 173 теста в 24 сьютах, так что один и тот же путь проверяется с двух сторон.

Мобильная разработка

Флаки — это про устройство тестов, а не про дисциплину

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

И чего мы не делаем

  • Не гонимся за процентом покрытия: это число, которым удобно отчитываться и невозможно пользоваться
  • Не пишем тесты на экраны, которые вы собираетесь переделывать в этом квартале
  • Не подменяем ручное тестирование там, где нужен человеческий глаз
  • Не берём проект, если продукт меняет форму каждую неделю: сначала пусть устоится
Как идут две недели

Каждые несколько дней вы видите работающий результат

Никакого «мы поработаем и покажем в конце». В конце каждого шага есть то, что можно открыть и посмотреть самому.

  1. Дни 1–2

    Разбираем продукт и выбираем пути

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

    Вы видитеСогласованный список из 12–15 путей с описанием, что считается провалом.

  2. Дни 3–7

    Пишем сьют

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

    Вы видитеСьют в вашем репозитории, запускается одной командой локально.

  3. Дни 8–10

    Встраиваем в пайплайн

    Запуск на каждый пуш и пул-реквест, результат виден прямо в нём, на каждое падение — видео и трассировка.

    Вы видитеЗелёный прогон в вашем CI и красный на специально сломанной ветке — чтобы вы увидели оба.

  4. Дни 11–14

    Чистим флаки и передаём

    Гоняем сьют многократно, вылавливаем нестабильные тесты, пишем короткую инструкцию по вашему же коду и проводим созвон с тем, кто будет этим владеть.

    Вы видитеИнструкция, запись созвона и две недели правок после передачи.

Встраивается в то, чем вы уже пользуетесь
  • Playwright
  • Patrol
  • GitHub Actions
  • GitLab CI
  • Bitbucket
  • Jenkins
  • Docker
Что остаётся у вас

Три вещи, которые останутся, даже если мы разойдёмся

Это настоящие снимки с прогона по нашему же сайту, а не картинки из шаблона презентации.

Отчёт Playwright со списком пройденных сценариев

Отчёт о прогоне

Список сценариев с результатом и временем. Открывается в браузере, лежит в артефактах сборки, не требует ни аккаунта, ни подписки.

Прогон сьюта swiftandscale.com

Трассировка упавшего теста с ответом сервера

Разбор падения

Когда тест краснеет, разработчик получает не строчку «упало», а шаги, ответ сервера и запись экрана в момент падения.

Настоящее падение: ссылка вела на несуществующую страницу

Файл сквозного теста с описанием сценариев

Сам сьют в вашем репозитории

Файлы тестов названы по путям, которые они защищают. Читаются как список обещаний продукта и меняются вашей командой без нас.

tests/public-site.spec.ts из этого репозитория

Кому это

Одним окупится за месяц, другим не нужно вовсе

Берите, если

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

Не берите, если

  • Продукта ещё нет или он меняет форму каждую неделю
  • Нужна нагрузка, безопасность или соответствие требованиям — это другие профессии
  • Хочется «покрытие 80%» как цифру в отчёте
  • Нужен человек в штат на постоянку, а не сьют

Если продукта ещё нет, начинать с тестов рано — начните с разработки, тесты приедут вместе с ней.

Что спрашивают про автоматизацию тестирования

Шесть вопросов, которые задают почти на каждом первом созвоне.

Часто да, и мы скажем об этом прямо. Штатный человек оправдан, когда тестирование — постоянная работа: релизы несколько раз в неделю, ручные проверки рядом с автоматическими, знание продукта, которое накапливается годами. Чего наём не делает — не начинается в понедельник: поиск опытного инженера занимает месяцы, а первый набор тестов всё равно кому-то писать. Обычный порядок такой: сначала готовый сьют, потом человек, который приходит уже на код, показывающий, как здесь принято.

Наш пакет — от 150 000 ₽ за 12–15 критичных путей и две недели работы, цена фиксированная за объём. Дешевле бывает, но обычно за счёт того, что тесты проверяют существование кнопки, а не поведение продукта: такой сьют будет зелёным в то утро, когда у вас сломалась оплата. Дороже — это либо полная регрессия, либо своя QA-команда; и то и другое бывает правильным решением, но это осознанный выбор, а не сюрприз в счёте.

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

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

Flutter-приложение мы гоняем на Patrol — он умеет то, чего не умеют тесты внутри приложения: нажать системное окно разрешений, закрыть платёжную шторку, поймать пуш на заблокированном экране. Наше собственное приложение несёт 30 таких сценариев. Нативные iOS и Android — разговор, а не автоматическое «да»: скажите стек, и мы прямо ответим, наш это профиль или нет.

Желательно, но не обязательно. Если стенда нет, тесты создают свои данные и убирают за собой, а платежи идут через тестовый режим провайдера. Гонять сьют по боевой базе мы не станем и вам не советуем: один неудачный сценарий — и вы объясняете клиенту, откуда у него взялся заказ.

Вы — и это часть замысла. Сьют лежит в вашем репозитории, написан обычным кодом без нашей платформы, к нему идёт инструкция по вашему же сценарию. Две недели после передачи правим бесплатно. Дальше можно позвать нас точечно, но зависимости от себя мы не строим: она выгодна только подрядчику.

Избранные работы

Оба продукта ниже тестируются ровно так, как описано выше

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

Двусторонний маркетплейс · Экономика авторов

Маркетплейсы, где деньги лежат посередине

Маркетплейс с двумя сторонами, платежом, удержанным между ними, и ИИ-студией, которая берёт деньги за каждую генерацию. Сложное здесь не каталог, а решение — в коде, — в какой именно момент деньги и файлы меняют владельца.

173 сквозных теста в 24 сьютах бэкенда и ещё 30 сценариев, которые гоняют настоящее Flutter-приложение: пополнение картой и через терминал, обновление токена, блокировка после неудачных входов, две ветки арбитража. Три сьюта состоят только из негативных случаев.

4 месяца
от старта до работающего продукта
173
сквозных теста в 24 сьютах
21
модель данных под этим
Внутри живое демоЧитать разбор
Creator feed in the marketplace app, with an order button
Система для позаказного производства · Медицинское производство

Системы для производства, где каждый заказ единственный в своём роде

У позаказного производства нет каталога и нет кнопки «повторить». Каждое изделие делается для одного человека по меркам, которые компьютер снимает со скана, и система обязана удержать эту нить от первого приёма через изготовление, доставку и переделку через полтора года.

2053 проверки в трёх репозиториях: 1060 на бэкенде в трёх сьютах, 717 на веб-клиенте, 276 на зрении, офлайн-очереди и правилах риска. Каждый заказ здесь уезжает физическим изделием по меркам одного человека, поэтому проверять надо числа, а не клики.

8 месяцев
и продолжается — самая большая система, которую мы ведём
13
семейств потоков, от приёма до переделки
2053
автопроверки в трёх репозиториях
Внутри живое демоЧитать разбор
Order board in the operations platform, with production stages

Что почитать перед тем, как заказывать тесты

Все статьи
Автотесты

Сколько стоит автоматизация тестирования и что за эти деньги получаешь

Оценки на автотесты отличаются в десять раз, потому что «автоматизация тестирования» — это четыре разные работы с одним названием. Разбираемся, какую именно вам продают.

5 мин чтения
Системы для производства

Что коробка не тянет на производстве под заказ: четыре места, где всё упирается

Коробочная система дешевле любой разработки — ровно до момента, пока ваш техпроцесс совпадает с представлением её авторов о производстве. Разбираем четыре места, где это совпадение обычно заканчивается.

3 мин чтения

Поговорим про то, что вам нужно: автотесты

Расскажите, что нужно сделать

Ответим в течение одного рабочего дня — диапазоном цены и допущениями, из которых он посчитан, а не приглашением на созвон.