Как мы впервые проверяли Заправки 2ГИС на бою
Часть реальной переписки в треде к сообщению о нашей первой успешной бесконтактной заправке
Машина кружит по заправочной станции на окраине Питера. Подъезжает к колонке, доливает пару литров, отъезжает в парковочный карман, стоит минуту — и всё повторяется снова.
Разомлевший на жаре (на улице июньские 34 градуса!) заправщик у соседней колонки лениво смотрит на происходящее. Кажется, его не удивляет, что два человека в салоне с ноутбуками постоянно что-то кричат третьему — и тот как будто делает всё по команде. Есть ещё один, четвёртый — он бегает и снимает это на телефон.
Но после третьего круга не выдерживает оператор на кассе. «Двенадцатая колонка, оплачивать будете?» — доносится из динамика.
Наше приложение — первый в истории 2ГИС продукт, в котором платёжный пайплайн полностью реализован нами самими внутри. Ещё за пару месяцев до этого у нас не было почти ничего, кроме идеи и команды. А полчаса назад казалось, что всё, что может пойти не так, пойдёт не так на этом первом полевом тесте.
«А какой смысл код с багами писать?»
За час до этого закрываем ноутбуки и стартуем из офиса в центре города. Скрипт отрабатывает нормально: даёт выбрать заправочную станцию из списка, затем выбрать колонку — узнать, какое топливо на ней, и инициировать пролив бензина либо по литражу, либо по сумме. Но сработает ли всё на реальной колонке — пока не знает никто. Это нам и предстоит проверить.
Выезжаем из офиса в поля. Слева — Лёша Федощенко, технический руководитель проекта. Скрин работы скрипта с его ноута вы видели выше
У нас только голый бэкенд, Postman вместо фронта, немного отваги — и час до заправочной станции где-то под Пулково.
То, как мы решили писать свой собственный бэкенд — отдельная история. Вообще российский рынок АЗС напоминает мем про 14 стандартов.
Мем про 14 стандартов
Сегодня на любой заправке есть автоматика, благодаря которой оператор с кассы и отдаёт дистанционную команду на подачу топлива на определённую колонку и пистолет. Но самих АСУ для заправок около четырёх десятков. Причем в рамках одной сети может использоваться несколько разных систем, включая самописные.
Интегрироваться с каждой — не вариант, поэтому со временем появились несколько компаний, которые дают универсальный доступ к разным АСУ. Такие компании-интеграторы мы называем топливными операторами (ТО) — собственно, их API используются в приложениях для бесконтактной заправки автомобиля.
Топливных операторов тоже несколько. А у нас большая аудитория карт и навигатора по всей стране, так что есть вероятность, что под капотом продукта в итоге будем стучаться к разным ТО. Желание быстро расширять решение плюс возможность иметь полный лог действий на своей стороне в итоге перевесили. И хотя свой бэкэнд — ещё одна точка отказа, мы верим в наши прямые руки ;)
Поэтому весной 2021-го мы начали глубже погружаться в тему АЗС, общаться с топливными операторами и узнавать, как, невовремя сняв пистолет, можно накрыть весь процесс заправки. Сформировав видение архитектуры, к маю написали первые методы на бэке и iOS. Затем добавили слой бизнес-логики, а в июне стали продумывать UI. После интеграции оплат мы должны были протестировать всё на бою — это одна из особенностей системы SberPay, которую мы втащили наравне с Apple Pay.
По пути захватываем из дома автора бэкенда. Ден фанат удалёнки и до карантина успел объехать десяток стран, работая дистанционно
Ден — скалист. И спокоен как глыба. Это спокойствие нам скоро пригодится. Через несколько минут после того, как все собрались в салоне, машина начинает странно тарахтеть, а потом — глохнуть на светофорах. После окажется, что полетела коробка передач и мы вообще чудом проехали следующие 20 км. Раз мы застреваем прямо на перекрёстке. При этом за неделю до этого тачка выдержала путешествие из Питера в Новосибирск и обратно, а тут — забарахлила по полуденным пробкам.
Чтобы как-то отвлечься, начинаем шутить — мол, как испытания начнёшь, так они и пройдут. Приходим к тому, что есть вероятность потратить час на путь до места, а не заведётся уже не тачка, а бэкенд. На что Ден невозмутимо отвечает: «Так ну, а зачем мне писать код с ошибками?».
На подъезде к заправке все же начинаем высматривать колонку посвободнее — чтобы не мешать обычным автовладельцам
Мы специально приехали днём, чтобы поменьше стоять в очередях. С одной стороны, чтобы быстрее проверить все сценарии, с другой — немного опасались негатива от обычных людей: вдруг что-то пойдёт не так и мы будем слишком долго занимать колонку. Тем более никто на месте не предупреждён, что команда разработки будет тестировать новый продукт — мы прибыли инкогнито.
Ура, заработало!
Встаём в парковочный карман, не глуша мотор. Осматриваемся. С колонки номер 12 отъезжает автомобиль. Не знаем, как так получилось, но в следующие десять минут к ней не подъезжал никто, хотя к другим точкам были очереди. Кажется, нам начинает везти.
Наша колонка в кадр почти не попала — крайняя справа, между линией автомобилей и закусочной
Подъезжаем и инициируем «сценарий крипта» — так для тестов мы назвали вариант с заправкой на определённую сумму. В этот момент опрашиваем станцию на предмет того, работает ли она, доступна ли колонка, есть ли в ней сейчас нужное топливо и по какой цене. Всю свою внутреннюю логику мы инкапсулируем в рамках одного метода.
Сам список заправок, колонок и марок топлива кэшируется на нашей стороне: мы заводим отдельные cron-джобы под каждого провайдера, парсим данные, затем матчим с карточками АЗС в 2ГИС — и обновляем раз в сутки. А вот за ценами ходим раз в 5 минут плюс дополнительно опрашиваем конкретную станцию перед заправкой (цена на бензин в сети может поменяться в любой момент).
Для старта задаём пролив 95-го на 200 рублей. Деньги удерживаются на счету, а списываются уже после заправки. Сценарий отрабатывает чётко.
Это лучше один раз увидеть.
Ден не шутил про код без багов. Мы проверяем еще несколько базовых сценариев: отсечка заправки по литражу, выбор другого вида топлива, отмену заказа. Даже пытаемся «отнять» чужую колонку — смотрим, что можем зафиксировать снятый пистолет, когда авто подъезжает к одному из свободных мест.
Вот так один из тестов выглядит в консолиА так — в реальном мире
Ещё мы очень радуемся тому, насколько быстрее проходит бесконтактная заправка по сравнению с классическим сценарием «зайти на кассу и постоять в очереди». Через минуту в эту очередь нам всё-таки придётся встать.
Чек, которого не должно было быть
В тот момент оплата в приложении была реализована своеобразно. Поскольку интерфейса еще не было, Лёша получал сгенерированную ссылку на оплату через SberPay в Postman«е, затем пересылал её себе через Slack на телефон и оплачивал через СберБанк Онлайн. Деньги списывались с тестовой карты.
Вот так это выглядело на практике. В Слаке якорем профиль часто отмечают те, кто работает из нового питерского центра разработки
Тем не менее, все работало отлично, пока мы не решили на радостях потестить пограничные сценарии. В одном из случаев колонка должна была сообщить, что занята, но не сделала этого. Таким образом, бензин мы пролили, а вот оплатить через приложение не смогли. Пришлось сходить ногами на кассу. Но это разовый случай — ответ на стороне API, которое мы дёргали, быстро пофиксили.
Твоё лицо, когда отдал 150 рублей за одну из тестовых заправок, но проблема не на стороне твоего кода
Что было дальше
Через день мы добавили Apple Pay. А ещё через пару дней команда iOS-разработки выкатила официальную тестовую сборку приложения. Настала очередь нашей тестировщицы Даши войти в эту историю. Она живёт рядом с новосибирским Академгородком, регулярно пользуется машиной и, как и мы, фанатеет от идеи с бесконтактной заправкой.
За неделю до этого или как шокировать заправщика
Конечно, Даша появилась в проекте раньше, ещё в середине июня. Изучила всю документацию, бриф, ТЗ, параллельно пофиксив в них неминуемые разногласия. И получила из этого набор тест-кейсов на конечного пользователя.
Jenkins позволяет нам собирать и совсем тестовые, не сторовские версии приложения. Так что Даша тоже начинала с версии, где была оплата только Сбером, но первые пару заправок сделала из дома, сидя за компьютером.
Вот её лайфхак: узнала у друзей, кто сейчас в пути → дала им адреса ближайших заправок от уже подключенных провайдеров → мы оплатили топливо и параллельно протестировали пару моментов. Говорят, заправщики на АЗС были удивлены — человек и в кассу не шёл, и вроде как приложением не пользовался. Мистика…
QA-лайфхак №1: тебе не нужно ехать на заправку, если у тебя есть Jenkins и друзья-автовладельцы
А вот после добавления оплаты через Apple мы получили официальную тестовую сборку через Test Flight, и Даша поехала тестировать сценарии на практике. Каждый приезд также вызывал интерес у местных заправщиков: какая-то девушка методично приезжает, заливает по 2 литра и при этом командует, когда вставлять и доставать пистолет. При этом пользуется неизвестным науке продуктом.
«На финальном выезде вокруг меня был чуть ли не консилиум. Сразу три заправщика собрались, интересовались нашим приложением», — рассказала она.
За 12 попыток Даша проверила все кейсы: от ограничения по сумме и объёму (минимальный заказ 2 литра) до ситуации, когда мобильный интернет работает плохо и ответ об оплате задерживается.
QA-лайфхак №2: тебе не нужно искать место с плохим интернетом, если ты можешь испортить сигнал на самом устройстве
Чтобы не искать дебри с плохой связью, Даша вызвала настройки девелопера в Xcode и выбрала «очень плохой интернет». А параллельно собрала первые баги: например, в тёмной теме не очень читалась область с чеком, не все экраны были одинаково заметны, а ещё местами не хватало подписей.
Всё это мы пофиксили. И весь август и сентябрь тестировали бесконтактные заправки среди сотрудников. Ждите фичу на бою ;)
P.S. Заправки — первый самостоятельный продукт центра разработки 2ГИС в Питере. Подробнее о том, что ещё мы делаем, можно узнать 20–21 сентября на Saint Highload, а в остальное время — на этом сайте.