Все новые сервисы Яндекса, а также апдейты к существующим приложениям и сайтам нужно тестировать: на айфонах, андроидах, десктопах, умных колонках, телевизорах. Раньше часть тестировщиков работали на личных телефонах и компьютерах, а часть — использовали для тестов корпоративные девайсы. Процесс не был гибким и с трудом масштабировался. Поэтому мы сделали свою клауд-ферму устройств. Сначала ей пользовались только отдельные команды тестирования, но со временем ферма стала особенно популярна и среди разработчиков. В итоге мы собрали почти 800 разных девайсов, которые теперь доступны 24/7.
Меня зовут Кирилл Коргов, я отвечаю за то, чтобы ферма устройств работала и развивалась. Кстати, называть её просто фермой было бы скучно, поэтому где-то на заре проекта мы по-доброму назвали её близким по смыслу словом «Колхоз». Если интересно, с чего Колхоз начинался, как пандемия привела к неожиданному росту его популярности и что общего у макбуков с лотками для офисной бумаги, прошу под кат.
Объясню, как оно работало у нас до Колхоза и с чем случались проблемы.
Тестирование в Яндексе бывает двух типов. Первый — когда сами разработчики что-то тестируют в процессе своей работы. Для этого, помимо устройств команды, у нас есть Гиперкуб, мы уже писали о нём на Хабре. Если кратко — в офисах Яндекса стоят специальные шкафы с разными девайсами, которые сотрудники могут брать для тестов. Запомните про них — они ещё поучаствуют в истории Колхоза.
Второй тип — тестирование через внутренний сервис Crowd. Это служба удалённых тестировщиков Яндекса, которые проводят тесты по запросу разработчиков. Исполнители получают готовый сценарий — что и на чём нужно проверить. Например: посмотреть, как отображается новый блок в приложении. Создаём задание, указываем требуемые версии телефонов и ОС, нужное количество тестов и выкладываем на внутренний сервис. Тестировщики, свободные в этот момент, берут задачу и присылают нам результаты.
Изначально, мы создавали ферму именно для крауд-тестирования, поэтому расскажу о нём подробнее.
Удалённые тестировщики сервиса Crowd работают из разных регионов, без привязки к рабочему дню, поэтому тесты не останавливаются даже ночью или в выходные. Ещё крауд-тестирование позволяет получить результат гораздо быстрее, чем инхаус: сто тестировщиков проведут сто тестов за пару часов, а команда из нескольких человек потратит на это дни.
Но нам не пришлось бы создавать ферму устройств, если бы всё было так идеально. Главной болью крауд-тестирования стало разнообразие девайсов — вернее, его отсутствие. У каждого удалённого тестировщика имелся свой телефон, не самый мощный ноутбук/ПК и всё. На них он и проводил тесты. Из этого вытекали проблемы:
В особых случаях мы выдавали тестировщикам устройства Яндекса, но это была редкая и долгая практика. Как я уже говорил, исполнители работают из разных регионов, и тут этот плюс превращается в минус. Пока мы отправим устройство для теста, пока тестировщик его получит, выполнит задачу, пройдёт неделя, а то и больше. При этом во время транспортировки устройство не приносит пользу.
По всем этим причинам нам и пришла в голову идея фермы удалённых устройств для тестирования в сервисе Crowd. И тут я перехожу к истории создания Колхоза — длинной, но увлекательной.
В начале 2018 года мы поняли, что хорошо бы иметь какую-то ферму, чтобы всё тестирование проходило удалённо и под нашим контролем. Сначала даже не думали о собственной разработке, а просто смотрели, какие решения уже существуют.
Подошло только одно — Open STF, ферма для Android-смартфонов. Для iOS подобную функциональность предлагали облачные провайдеры, но такие фермы стоили очень дорого и были развёрнуты на удалённых серверах — а мы не всегда можем отправлять за пределы компании приложения в статусе beta.
Решили для начала попробовать Open STF. Принцип работы фермы:
Open STF — международная платформа, интерфейс только на английском
Тут мы поняли, что у нас, оказывается, много специфических требований к ферме для крауд-тестирования. Например, остро не хватало возможности автоматизированно следить за состоянием устройств и ограничивать к ним доступ. Телефон мог сломаться, а мы даже не знали об этом, и он продолжал числиться в нашей базе. Или несколько тестировщиков одновременно приходили на один и тот же смартфон и мешали друг другу.
Open STF не была заточена под задачи нашего сервиса Crowd. Это был софт, на котором к одному девайсу параллельно могли подключаться несколько тестировщиков. К тому же устройства часто падали, а добавление новых смартфонов одновременно с выполнением заданий на ферме вызывало проблемы.
Мы подключили через Open STF несколько десятков Android-смартфонов и пользовались ими, когда у удалённых тестировщиков не было нужной модели телефона или версии ОС для задачи. Но главные проблемы мы этим не закрыли — по-прежнему не хватало устройств на iOS, а о масштабировании не было речи.
В Open STF отсутствовала возможность забронировать девайс — просто открываешь и пользуешься, иногда вместе с другими тестировщиками
Идея была простой — сделать собственное решение наподобие Open STF, но для iOS и с нужной нам функциональностью для крауд-тестирования. Представляли, что для начала хватит компьютера Mac (потому что только с ними можно по-настоящему подружить девайсы на iOS), к которому мы подключим 10–15 устройств, разместив их в серверной. Тестировщикам станут круглосуточно доступны айфоны с редкими версиями — мы частично закроем проблему, а дальше будем расширяться.
Как это часто бывает, на деле всё оказалось сложнее.
Летом 2018 года начали разработку фермы: организовали распределённую команду между офисами Яндекса в Минске и Санкт-Петербурге. Минская команда собрала первые прототипы — софт для подключения к iOS-устройствам, а также интерфейс управления. Мы в Питере делали софт для ограничения доступа, бэкенд и бизнес-логику.
Примерно за три месяца наша команда научилась получать картинку с устройства и имитировать управление им в удалённом режиме. На телефоны устанавливали наше iOS-приложение, связывали его с системой, развёрнутой на компьютере — и все действия, которые мы совершали через сторонний веб-интерфейс, телефон воспринимал как реальные действия пользователя.
Первые тестовые стенды — два компьютера и два подключённых к ним телефона — были готовы в Минске к концу осени 2018-го. И тут выяснилось серьёзное ограничение, которое мы до сих пор не победили: на одном Mac может нормально работать только одно iOS-устройство. При подключении удалённого доступа к двум и более девайсам кадры двух устройств путались. Попробовали перейти на получение картинки через снятие скриншота прямо на устройстве — FPS оказался на уровне 1–5 кадров в секунду. Естественно, при таком быстродействии невозможно что-то тестировать.
Постоянную инсталляцию развернули уже в Питере в начале 2019-го — там площадь позволяла разместить нужное оборудование в коммутационной комнате. Вместо запланированного одного компьютера поставили пять Mac mini. Подключили к ним десять iOS-устройств (по два на каждый Mac), которые работали по очереди. В одну сессию был активен только один связанный с компьютером девайс, второй в это время становился недоступен. Это позволило нам поддерживать FPS от 12 до 15 кадров в секунду без буферизации — можно сказать, устройства почти моментально реагировали на нажатия в интерфейсе.
Систему бронирования и изоляции сессии заложили сразу, так что одной проблемой стало меньше (как эта система работает, расскажу чуть дальше). Но было непонятно, как масштабировать ферму — десять iOS-устройств на тысячи исполнителей было мало. К тому же первое решение оказалось очень требовательным к компьютерам тестировщиков — съедало много RAM и сетевого трафика. Эти ограничения нам ещё предстояло победить.
Самая первая и самая скромная версия Колхоза
Пока мы ломали голову над тем, как совладать с ограничениями Apple и подключить к одному компьютеру несколько устройств, помощь пришла с другой стороны.
На складах у хелпдеска Яндекса в тот момент образовалось какое-то количество старых макбуков. Они уже не подходили по параметрам для работы разработчиков, но вполне годились нам на роль агента для управления iOS-устройствами. Спасибо коллегам из хелпа — великодушно поделились с нами железом.
Дело пошло быстрее. Весной 2019-го ферма сразу выросла на двадцать макбуков. Дальше ребята из хелпдеска отдавали в Колхоз рабочие компьютеры Apple, если они больше никому были не нужны. Нам оставалось только докупать телефоны и планшеты на iOS и подключать их к агентам. Чем мы и занялись.
В первую очередь приобретали устройства, которых в сервисе Crowd не было совсем (но имелись запросы на них) или которых часто не хватало. В последнем случае тесты в Колхозе на этих девайсах проходили с большими сроками, и это нарушало дедлайн у проектов Яндекса. После того как закрыли критические дыры, перешли на докупку просто популярных устройств, чтобы постепенно всё больше тестов переводить на ферму.
Одновременно с ростом фермы мы вдруг осознали, что все наши устройства — телефоны, планшеты — в первую очередь пользовательские, а не промышленные, как серверное оборудование. Почему-то они не хотели сами жить и стабильно работать 24/7, а требовали внимания. Нормой стала ситуация, когда девайсы постоянно ломаются, зависают, выключаются или перезагружаются.
Решили, что нам нужен специальный человек, который будет технически поддерживать ферму — взяли в команду системного администратора. Плюс создали чат в телеграме, где пользователи задавали вопросы напрямую разработчикам фермы: как подключиться, сбросить настройки, что делать, если устройство зависло, и так далее. Постепенно мы обзаведёмся и полноценной службой поддержки, но это будет только через год, когда ферма разрастётся до такой степени, что станет невозможно отвечать всем своими силами.
Поначалу макбуки, как и десктопы, стояли на ребре или на верхней полке, рядом с каждым лежал телефон. Место распределялось неэффективно, но решение для этого мы нашли позже
Наша ферма для iOS росла и крепла, а софт для Android наши исполнители по-прежнему тестировали через Open STF. И страдали всё от тех же проблем: не было автоматического контроля за состоянием устройств и отсутствовало бронирование девайса только для себя. От этого, как уже говорил, хромали удобство (удалённые тестировщики на одном устройстве мешали друг другу) и конфиденциальность (любой мог увидеть данные, которые вводит исполнитель).
Попробовали влиять инструкциями — запретили заходить на девайс с пометкой «Занято». Появилась другая загвоздка — выяснилось, что тестировщики часто забывали выходить из сессии, и пометка «Занято» висела, даже когда устройством никто не пользовался.
Осенью 2019 года мы начали искать решение: как дотащить базовую функциональность нашей фермы до Open STF. Делать полностью свой софт под Android нам не хотелось — рабочая технология уже существовала, и не факт, что мы сделали бы лучше. Вариант форкнуть стороннее решение и развивать свою ветку тоже пока отмели, потому что опасались сложностей с обновлением до новых версий.
Решили начать с единого интерфейса, чтобы тестирование на iOS и Android проходило в одном месте, на сайте нашей фермы. Напомню, через Open STF тесты проходили в их веб-приложении.
Самым простым вариантом было сделать iframe — чтобы в окне на нашем сайте стал доступен интерфейс сторонней фермы. Эту идею сразу отмели и начали делать нормально. За несколько дней мы адаптировали интерфейс Колхоза для отображения и управления Android-устройством. Но технологии по-прежнему были завязаны на Open STF, просто пользователи об этом не знали.
Критическим оставался вопрос с изоляцией сессии. И тут мы додумались поставить между нашими устройствами и сторонним софтом reverse proxy в виде nginx, куда встроили специальную авторизацию на каждый запрос.
Как работала проверка:
Всё. Теперь пользователь мог открыть только то устройство, к которому у него правда был доступ в данный момент времени. Так мы донесли удобство и конфиденциальность тестирования и до Open STF.
На этом этапе у нас уже было около 60 девайсов на Android и 30 на iOS. На выделенных нам полках в общей коммутационной начал разрастаться хаос с кучей проводов. А с появлением бронирования фермой заинтересовались штатные сотрудники Яндекса — они понесли нам на подключение и обслуживание ещё и свои рабочие устройства, чтобы мы централизованно их поддерживали. Эти телефоны и планшеты становились доступны всем — и это было круто, потому что наш парк устройств рос без всяких вложений. Но на своих полках мы перестали помещаться.
С переносом к себе в интерфейс Android-фермы мы убили сразу двух зайцев. Получили единую модель данных, которая умеет работать с разными технологиями, и расширили базу устройств за счёт девайсов сотрудников. И в это же время нам выделили первую собственную комнатку!
Собираем стеллажи в новой серверной
Немного расскажу, как мы обживались в новой серверной.
Переезжали постепенно — нельзя было просто всё отключить и разом перенести, ведь тестирование работало круглосуточно. Поэтому мы частично отключали какие-то устройства и переносили их в новое помещение. Потом, когда освобождались другие, шла следующая партия. В процессе мы научились жить в условиях, когда ферма распределена на несколько комнат.
Специально для нас помещение оборудовали: установили бесперебойники, систему охлаждения, стеллажи под устройства. Но главной проблемой оставалось грамотное использование места, которое всё равно было в дефиците.
Особенно сложно выходило с iOS-фермой. Какое-то время макбуки стояли у нас на ребре, а рядом с каждым лежал телефон. Потом пробовали использовать полки с разделителями — вставляли телефоны, как книжки. Но всё это получалось неэффективно, потому что полка большая, а телефоны маленькие: даже если ставили в ряд десять девайсов, много места всё равно оставалось свободным.
Так умещали андроиды. Половина полки пустовала
И только в январе 2020 года мы нашли решение — лотки для бумаг! Оказалось, что туда идеально встаёт макбук с экраном в 13 дюймов — миллиметр в миллиметр. Не помню, как мы это выяснили, но лотки стали находкой года. Теперь они выполняют на нашей ферме функцию серверного шкафа. Чтобы подключать провода, мы вырезаем в лотках отверстия под зарядку для ноутбука и USB для телефонов.
Ноу-хау стали использовать универсально. Для iOS-фермы: ставим приоткрытый макбук в лоток и на него кладём телефон. Для Android-фермы: устанавливаем стопки лотков возле агента, в каждый помещаем несколько телефонов или телефон и планшет — в зависимости от диагонали. Важно, что лотки можно ставить один на другой — тогда на каждую полку входит одна или две стопки по шесть лотков.
Если раньше на одну полку мы могли сложить только 10 устройств, подключённых к одному компьютеру, то теперь там помещалось до 24 девайсов. Оптимизацию места провели успешно — можно было закупать больше устройств, расширять ферму и не переживать, что всё повалится с полок.
С лотками стало возможно использовать пространство на полках «в высоту»
Макбуки разместились просто идеально — по пять штук там, где раньше влезало только два
Когда мы начали работу над фермой устройств на Android и iOS, у нас уже был удалённый доступ к десктопам для тестировщиков. Работали через TeamViewer, но он поддерживал не полное логирование действий, и расшарить лицензию мы могли на ограниченное количество человек — это плохо при масштабировании. К тому же лицензии выдавали вручную, на персональный логин тестировщика — это отнимало много времени.
В начале 2019 года мы бросили все силы на iOS-ферму, а десктопы до поры не трогали. Но как только разгребли все главные проблемы со смартфонами, у нас дошли руки и до этого направления.
Серьёзный недочёт старой версии десктоп-фермы был в том, что к TeamViewer могли подключаться все тестировщики этого направления — из общего списка исполнителей, которые знали пароли для доступа к разным устройствам. При этом TeamViewer работал на своих серверах, и не было возможности внедрить строгую внутреннюю авторизацию: чтобы один конкретный человек получал доступ к нужному устройству в определённое время.
К любому ПК два-три человека могли подключиться одновременно и начать мешать друг другу
В январе 2020 года у нас заканчивалась лицензия в TeamViewer — мы решили, что это отличный момент, чтобы перетащить десктопы к себе в интерфейс, как Android-устройства.
Сначала попробовали управлять устройствами через VNC. Это решило вопрос с безопасностью. Всё работало по той же схеме, что и смартфоны — тестировщик получал одноразовую ссылку на сессию работы с конкретным устройством. Но потом мы выяснили, что при управлении через веб-клиент VNC с Mac приходит всего три кадра в секунду вместо желаемых пятнадцати — картинка тормозит из-за большого разрешения экрана и отсутствия в веб-клиенте поддержки проприетарных кодеков, которые обеспечивают хорошее быстродействие в десктопных VNC-клиентах на macOS.
Поначалу после переезда в новую серверную наши стеллажи стояли полупустые — простор и порядок. Но скоро нам снова некуда будет складывать устройства
Разработали свою технологию с приемлемым качеством. Получилось нативное приложение на C++ (так как важна скорость). Оно делает захват экрана через системное API в macOS и по маске сравнивает очередной кадр с предыдущим — чтобы для экономии трафика посылать в сеть только те кусочки кадра, которые отличаются. Эти кусочки приложение кодирует с помощью TurboJPEG и отправляет картинками, а не буферизированным видеопотоком, что позволяет видеть моментальную реакцию на действия пользователя.
Технологию делали в первую очередь для macOS, но получилось кроссплатформенное решение, которое сейчас используем для Linux и частично для Windows. Стандартное бронирование и авторизацию для тестировщиков, конечно, сразу вшили.
Мы добрались до весны 2020-го. Примечательно, что ещё до карантина к нам пришли коллеги из поисковой выдачи Яндекса и попросили организовать на ферме доступ к внутренней сети компании — чтобы на наших устройствах открывались сервисы и приложения на стадии разработки.
Внутреннюю сеть сотрудники могли самостоятельно настроить на устройствах из Гиперкуба, но её не было в Колхозе. А так как у нас уже накопилось больше девайсов, чем в каждом отдельно взятом кубике, то сотрудники хотели пользоваться этим разнообразием. Особенно просили те, кто часто работал удалённо или уставал ходить по офису к Гиперкубу. Мы взялись за дело.
Не удавалось взять и подключить даже часть телефонов к внутренней сети. По требованиям безопасности нужно отслеживать, какие действия пользователи совершают в сети Яндекса. На ферме же каждый девайс был общим, поэтому на него не устанавливался чей-то конкретный сертификат. Плюс устройства были подключены к другой Wi-Fi-сети.
Мы внедрили авторизацию на сетевом уровне.
А через два дня после того, как мы сделали внутренний доступ, весь Яндекс отправился на удалёнку. Популярность фермы у разработчиков и других сотрудников взлетела!
Нагрузка на Колхоз росла, и стороннее решение для устройств на Android перестало нас устраивать.
У Open STF часто не загружался фронтенд. Статус устройства горел зелёным (готовым к работе), а удалённый экран не грузился. Нам приходили жалобы, а мы никак не могли повлиять на стабильность стороннего решения.
Пришла пора разрабатывать свою версию Android-фермы. Но мы решили это делать с минимальными изменениями, чтобы по-прежнему было не очень сложно обновить софт управления с выходом новой версии Android.
Форк заключался в том, что мы выпилили всю авторизацию — то есть, наоборот вырезали часть функциональности из Open STF, чтобы не мешала. И затем развернули копию этого софта прямо у себя в серверной, на тех же компьютерах, куда были подключены наши устройства на Android.
Было: одна большая Open STF, которая обслуживала все устройства и тянула их за собой в случае проблем; плюс прокси-сервер для проверки авторизации. Стало: четыре маленьких локальных фермы, каждая из которых не зависит от других и даёт прямой доступ к устройствам под контролем нашего бэкенда.
Обычно мы заклеиваем камеру на устройствах, и на снимке виден только чёрный экран:
Но иногда можно увидеть лоток, в котором лежат устройства:
Подключение Гиперкуба
Благодаря новой архитектуре Android-фермы мы получили возможность устанавливать часть софта для управления устройствами на компьютеры вне серверной Колхоза. Как раз в это время к нам пришли администраторы Гиперкуба и предложили добавить на ферму их устройства — во время пандемии сотрудники разобрали их по домам и не могли передавать девайсы друг другу.
Всё, что нам нужно было сделать, — установить специальную программу на компьютеры в Гиперкубе. И в Колхозе появилось больше тысячи новых устройств на Android. Единственное ограничение — эти телефоны были доступны только штатным сотрудникам, потому что не имели доступа к внешнему Wi-Fi. Но в период пандемии и массового перехода на удалёнку это расширение оказалось полезным.
Увы, с iOS-девайсами такая интеграция была невозможна — мы не могли засунуть в кубик сорок дополнительных ноутбуков, чтобы к каждому подключить по телефону. А с Android — пожалуйста. Их можно десятками подсоединять к одному агенту, и всё работает быстро и качественно. Наш рекорд — к одному мощному компьютеру подключены сто девайсов на Android.
Но после интеграции Гиперкуба мы поняли, что можем сделать сервером фермы любой рабочий ноутбук — на macOS, Windows или Linux. И уже к нему сотрудники смогут подключать все нужные им устройства. Эту возможность мы стали предоставлять распределённым командам: они собирают маленькую ферму с собственными девайсами прямо у себя в кабинете и сами решают, кому давать права управления их устройствами. После этого команда может подключаться к своим рабочим девайсам из любых точек мира — через единый интерфейс Колхоза.
С ростом парка устройств провода снова начали походить на распутанный клубок
Дальше история Колхоза не заканчивается, но двигается вперёд маленькими шагами. Поделюсь самыми важными.
Летом 2020 года мы перестали справляться с сообщениями в ламповом чате команды. Тогда завели большую справку с инструкциями по ферме и обучающими видео. А ещё — полноценный саппорт в виде окошка быстрого чата в интерфейсе.
Если пользователь не находит ответ на свой вопрос в готовой справке, он может обратиться к саппорту:
Наша служба поддержки, как и тестировщики, работает удалённо. Это люди, которые хорошо знают ферму и помогут в большинстве возникающих вопросов. Если пользователи пожалуются на неисправность устройства, саппорт проверит, действительно ли есть проблема. Если да — устройство пометят как нерабочее и попробуют починить удалённо. Не получится — передадут информацию о поломке офлайн-администраторам.
Кроме этого, есть автоматические диагностики — все устройства периодически запускают самотестирование, которое проверяет основные функции. Когда что-то не работает, устройство получает пометку, чтобы пользователи его не брали.
У одного из тестировщиков подвисла тестовая версия Навигатора
Запрос на эту фичу был с самого начала, но не сразу получилось внедрить автоматическую чистку. Поэтому долгое время мы просто просили пользователей: выйдите отовсюду, удалите файлы и установленные приложения. Но, конечно, далеко не все это делали. Когда другие люди брали устройство, им сначала приходилось чистить девайс и сбрасывать предыдущие настройки.
В 2020 году мы наконец-то смогли добавить автоматическое обнуление на смартфонах. Теперь система после каждой сессии проверяет и стирает установленные программы, чистит часть файловой системы устройства, загрузки, выходит из приложений. Всем стало проще работать.
Просим пользователей не логиниться в личных аккаунтах
Изначально звук на наших устройствах не воспроизводился. Через удалённый доступ нельзя было послушать голосовые команды, сигналы в приложениях, трек в видео. Эту фичу у нас часто просили команды Яндекс Музыки и Карт. Мы долгое время изучали разные способы, как дотащить звук до пользователя через все наши серверные и удалённое управление.
Особенность передачи звука с фермы — рядом всегда находится много других устройств, которые тоже как-то звучат. Поэтому звук нужно снимать только системно, не через динамики. Если зайти в серверную Колхоза, там на одном телефоне играет рэп, на другом кто-то смотрит стрим, на третьем тестируются Карты. Шум порой стоит невозможный.
Мы нашли два решения. Первое — для Android-устройств: проводом получать звук через разъём наушников. Второе — для iOS: внезапно оказалось, что механизм, позволяющий использовать только один девайс на одном ноутбуке, умеет передавать и звук тоже. Спасибо и на том.
Добавили нестандартные устройства
У нас давно числились в базе головные автомобильные устройства, которыми для нашего сервиса являются планшеты на Android. С развитием фермы мы вывели их в отдельную вкладку «Умные устройства». После добавления поддержки звука туда же попала Яндекс Станция. А потом, по запросу Группы тестирования Алисы и Умных устройств, у нас появились и телевизоры.
Кто-то тестирует Android TV
Новенькие, закупленные на ферму Яндекс Станции
По умолчанию у нас работает автоматическое тегирование, которое при подключении устройства к ферме выясняет и вносит в систему его характеристики. В среднем это 30-40 параметров: от модели телефона и версии ОС до разрешения экрана и быстродействия. В итоге мы получаем детальную базу устройств, из которой пользователь может выбрать максимально подходящее — отметить в системе нужные фильтры и получить список доступных девайсов.
В начале 2021 года мы сделали возможность оценить устройство после работы — так к техническим характеристикам девайса добавился его рейтинг. Если устройство часто тормозит или плохо справляется с тестами, у него будет низкий рейтинг, а если всё летает — то высокий.
Рейтинг помог нам обнаружить самые плохие устройства и убрать их из раздачи или заменить новыми. Делать вручную это было бы долго и тяжело, а так на помощь нам пришёл классический краудсорсинг — по отзывам сотен людей мы стали быстро получать точную оценку каждого девайса.
При завершении бронирования система просит пользователя оценить устройство
Кроме того, система теперь подбирает пользователю девайсы с самым высоким рейтингом из доступных, а не первые попавшиеся. До этого часто были случаи, когда тестировщики получали медленное устройство и жаловались на него, в то время как более мощный подходящий девайс лежал без дела. Рейтинг оптимизировал распределение.
На скрине выше видна голубая плашка-предупреждение о видеозаписи всех сессий. Эту фичу мы внедрили в целях безопасности и контроля качества. Раньше при неполадках на устройстве тестировщики не всегда нажимали кнопку «Запись» — потом было сложно в точности воспроизвести замеченные дефекты и разобраться, что работает не так. С видеозаписью всех сессий на бэкенд фермы проблему решили. Теперь можно автоматически получить скринкаст своих тестов с любого девайса.
У администраторов Колхоза есть доступ ко всем видео. Это помогает контролировать качество работы устройств, вычислять читеров или делать сложный дебаг (учитывать все действия на девайсе, а не только указанные в баг-репорте).
Изначально у нас не было никаких ограничений по времени использования устройства и их количеству на одного пользователя. В крауд-тестировании с этим не возникало проблем — удалённый тестировщик приходил, брал подходящий девайс, делал свой тест по инструкции и уходил. А вот с наплывом в Колхоз разработчиков начались сложности.
Некоторые бронировали двадцать устройств на час и перебирали их — смотрели, с каким больше нравится работать. Бывали и бронирования на целый день, по которым даже не открывали устройство — забывали или не успевали. Чтобы такого не было, мы ввели квоты.
Теперь у каждого сотрудника есть три часа в день на использование девайсов в Колхозе. Но если квота закончилась, а человеку нужно продолжать работать, он может запросить увеличение времени.
Опираясь на рейтинг и информацию о бронированиях, мы делаем выводы: каких устройств не хватает, а какие совсем не используются. Это помогает нам перестраивать базу под потребности тестирования — чтобы ненужные девайсы не занимали слоты на ферме.
Например, слишком старые версии ОС перестают быть актуальными — тогда мы оставляем несколько устройств с такими системами на всякий случай, а остальные обновляем до более востребованных.
Кстати, новые версии ОС у нас появляются сразу после релиза, а модели телефонов — как только выходят в продажу. Например, в Колхозе можно потестировать Huawei с HMS, Google Pixel 2, 3, 4a, 5 и 6, версии Android от 4.2.2 до новейшей беты 13 и устройства на iOS от 9 до 16 версии. Но зачастую проблемы возникают именно со старыми системами и устройствами, которые не так просто купить. Поэтому мы стараемся сохранять редкие девайсы и ОС.
Ещё одна фича, которую мы не сразу смогли внедрить. На компьютере, куда подключено устройство, прописываем для связи с девайсом прокси-сервер — но не настоящий, а особый. Он (прокси) через веб-сокеты заворачивает в туннель приходящие к нему запросы. Этот туннель протягивается от наших серверов до интерфейса фермы на компьютере пользователя, где тоже ставится специальное приложение, соединённое с нашим сервером. Грубо говоря, в этот момент ферма становится мостиком, по которому до устройства дотягивается локальный интернет с компьютера пользователя. И человек во Владивостоке может раздать свою сеть на наш девайс в Питере.
Схема даёт две возможности: перехватывать и анализировать трафик с удалённого устройства
Периодически нам поступают запросы на поддержку автотестов, но мы пока сконцентрированы на ручном тестировании. Поэтому стали предоставлять API, через который можно забронировать устройство и попробовать своими средствами сделать инфраструктуру для автотестирования.
Потом эти пользовательские системы подключаются к API фермы и выполняют заданные действия. Благодаря этому для Android-устройств теперь возможна удалённая отладка тестов.
Если оглядываться назад, то мы, конечно, не ожидали, что ферма разрастётся до таких масштабов. Создавали её для iOS-устройств, чтобы предоставить удалённым тестировщикам дефицитные версии телефонов и ОС, а в итоге сделали мультиплатформенное решение, которое поддержало девайсами весь Яндекс на удалёнке и позволило сервису Crowd вырасти из 100 исполнителей в текущие 3000+ человек.
Всё это было бы невозможно без поддержки ряда команд Яндекса, которые помогали нам развивать сервис на разных этапах истории. Хелпдеск спас железом, Гиперкуб поделился устройствами, группы Поиска, Алисы, Навигатора и Музыки помогли с внедрением полезных фич. Парк Колхоза стартовал с 12 айфонов и 30 андроидов, а теперь у нас больше 200 iOS-устройств, около 450 андроидов и больше 50 умных девайсов, Станций и телевизоров. И всё это можно продолжать масштабировать.
В глобальном смысле Колхоз даёт людям возможность войти в профессию тестировщика с одним компьютером. Раньше лишь у малой части удалённых исполнителей имелись на руках разные устройства: планшеты на Android, айпады, свои Станции, умные часы, блютус-гарнитуры, смартфоны на разных ОС. Большинство же работало с одним лэптопом и смартфоном — многие задания тестировщикам было просто не на чем выполнять.
В планах — продолжать наращивать качество и объём тестирования, увеличивать возможности фермы за счёт технических доработок.
Если у вас появились идеи, как ещё можно использовать Колхоз, пишите в комментарии, будем рады свежим мыслям.
Меня зовут Кирилл Коргов, я отвечаю за то, чтобы ферма устройств работала и развивалась. Кстати, называть её просто фермой было бы скучно, поэтому где-то на заре проекта мы по-доброму назвали её близким по смыслу словом «Колхоз». Если интересно, с чего Колхоз начинался, как пандемия привела к неожиданному росту его популярности и что общего у макбуков с лотками для офисной бумаги, прошу под кат.
Вводная часть про тестирование
Объясню, как оно работало у нас до Колхоза и с чем случались проблемы.
Тестирование в Яндексе бывает двух типов. Первый — когда сами разработчики что-то тестируют в процессе своей работы. Для этого, помимо устройств команды, у нас есть Гиперкуб, мы уже писали о нём на Хабре. Если кратко — в офисах Яндекса стоят специальные шкафы с разными девайсами, которые сотрудники могут брать для тестов. Запомните про них — они ещё поучаствуют в истории Колхоза.
Второй тип — тестирование через внутренний сервис Crowd. Это служба удалённых тестировщиков Яндекса, которые проводят тесты по запросу разработчиков. Исполнители получают готовый сценарий — что и на чём нужно проверить. Например: посмотреть, как отображается новый блок в приложении. Создаём задание, указываем требуемые версии телефонов и ОС, нужное количество тестов и выкладываем на внутренний сервис. Тестировщики, свободные в этот момент, берут задачу и присылают нам результаты.
Изначально, мы создавали ферму именно для крауд-тестирования, поэтому расскажу о нём подробнее.
Плюсы
Удалённые тестировщики сервиса Crowd работают из разных регионов, без привязки к рабочему дню, поэтому тесты не останавливаются даже ночью или в выходные. Ещё крауд-тестирование позволяет получить результат гораздо быстрее, чем инхаус: сто тестировщиков проведут сто тестов за пару часов, а команда из нескольких человек потратит на это дни.
Минусы
Но нам не пришлось бы создавать ферму устройств, если бы всё было так идеально. Главной болью крауд-тестирования стало разнообразие девайсов — вернее, его отсутствие. У каждого удалённого тестировщика имелся свой телефон, не самый мощный ноутбук/ПК и всё. На них он и проводил тесты. Из этого вытекали проблемы:
- Критически мало было устройств на iOS, потому что большинство тестировщиков пользовались смартфонами на Android.
- Не хватало старых версий ОС. Свои устройства люди обычно обновляют, а для теста нужны минимум три последние версии системы.
- Устройства нельзя было передавать. Это ведь чьи-то смартфоны — мы не могли сказать: Вася, отдай телефон Пете, пока ты отдыхаешь, он сделает на нём пару тестов.
- Невозможно было чётко спланировать тестирование. У нас имелась база устройств исполнителей, но мы не знали, в какой момент их держатели смогут провести тесты.
- Устройства не очищались. Иногда для теста важно полностью сбросить настройки, удалить все файлы, выйти из приложений — естественно, свой смартфон мало кто будет так дотошно очищать под нужды тестирования.
В особых случаях мы выдавали тестировщикам устройства Яндекса, но это была редкая и долгая практика. Как я уже говорил, исполнители работают из разных регионов, и тут этот плюс превращается в минус. Пока мы отправим устройство для теста, пока тестировщик его получит, выполнит задачу, пройдёт неделя, а то и больше. При этом во время транспортировки устройство не приносит пользу.
По всем этим причинам нам и пришла в голову идея фермы удалённых устройств для тестирования в сервисе Crowd. И тут я перехожу к истории создания Колхоза — длинной, но увлекательной.
Попытка: чужое решение
В начале 2018 года мы поняли, что хорошо бы иметь какую-то ферму, чтобы всё тестирование проходило удалённо и под нашим контролем. Сначала даже не думали о собственной разработке, а просто смотрели, какие решения уже существуют.
Подошло только одно — Open STF, ферма для Android-смартфонов. Для iOS подобную функциональность предлагали облачные провайдеры, но такие фермы стоили очень дорого и были развёрнуты на удалённых серверах — а мы не всегда можем отправлять за пределы компании приложения в статусе beta.
Решили для начала попробовать Open STF. Принцип работы фермы:
- запускаешь программу на компьютере (или сервере),
- подключаешь к нему по USB устройства на Android,
- управляешь подключёнными устройствами через веб-приложение.
Open STF — международная платформа, интерфейс только на английском
Сложности
Тут мы поняли, что у нас, оказывается, много специфических требований к ферме для крауд-тестирования. Например, остро не хватало возможности автоматизированно следить за состоянием устройств и ограничивать к ним доступ. Телефон мог сломаться, а мы даже не знали об этом, и он продолжал числиться в нашей базе. Или несколько тестировщиков одновременно приходили на один и тот же смартфон и мешали друг другу.
Open STF не была заточена под задачи нашего сервиса Crowd. Это был софт, на котором к одному девайсу параллельно могли подключаться несколько тестировщиков. К тому же устройства часто падали, а добавление новых смартфонов одновременно с выполнением заданий на ферме вызывало проблемы.
Решение
Мы подключили через Open STF несколько десятков Android-смартфонов и пользовались ими, когда у удалённых тестировщиков не было нужной модели телефона или версии ОС для задачи. Но главные проблемы мы этим не закрыли — по-прежнему не хватало устройств на iOS, а о масштабировании не было речи.
В Open STF отсутствовала возможность забронировать девайс — просто открываешь и пользуешься, иногда вместе с другими тестировщиками
Первая версия своей фермы: только iOS
Идея была простой — сделать собственное решение наподобие Open STF, но для iOS и с нужной нам функциональностью для крауд-тестирования. Представляли, что для начала хватит компьютера Mac (потому что только с ними можно по-настоящему подружить девайсы на iOS), к которому мы подключим 10–15 устройств, разместив их в серверной. Тестировщикам станут круглосуточно доступны айфоны с редкими версиями — мы частично закроем проблему, а дальше будем расширяться.
Как это часто бывает, на деле всё оказалось сложнее.
Летом 2018 года начали разработку фермы: организовали распределённую команду между офисами Яндекса в Минске и Санкт-Петербурге. Минская команда собрала первые прототипы — софт для подключения к iOS-устройствам, а также интерфейс управления. Мы в Питере делали софт для ограничения доступа, бэкенд и бизнес-логику.
Примерно за три месяца наша команда научилась получать картинку с устройства и имитировать управление им в удалённом режиме. На телефоны устанавливали наше iOS-приложение, связывали его с системой, развёрнутой на компьютере — и все действия, которые мы совершали через сторонний веб-интерфейс, телефон воспринимал как реальные действия пользователя.
Сложности
Первые тестовые стенды — два компьютера и два подключённых к ним телефона — были готовы в Минске к концу осени 2018-го. И тут выяснилось серьёзное ограничение, которое мы до сих пор не победили: на одном Mac может нормально работать только одно iOS-устройство. При подключении удалённого доступа к двум и более девайсам кадры двух устройств путались. Попробовали перейти на получение картинки через снятие скриншота прямо на устройстве — FPS оказался на уровне 1–5 кадров в секунду. Естественно, при таком быстродействии невозможно что-то тестировать.
Решение
Постоянную инсталляцию развернули уже в Питере в начале 2019-го — там площадь позволяла разместить нужное оборудование в коммутационной комнате. Вместо запланированного одного компьютера поставили пять Mac mini. Подключили к ним десять iOS-устройств (по два на каждый Mac), которые работали по очереди. В одну сессию был активен только один связанный с компьютером девайс, второй в это время становился недоступен. Это позволило нам поддерживать FPS от 12 до 15 кадров в секунду без буферизации — можно сказать, устройства почти моментально реагировали на нажатия в интерфейсе.
Систему бронирования и изоляции сессии заложили сразу, так что одной проблемой стало меньше (как эта система работает, расскажу чуть дальше). Но было непонятно, как масштабировать ферму — десять iOS-устройств на тысячи исполнителей было мало. К тому же первое решение оказалось очень требовательным к компьютерам тестировщиков — съедало много RAM и сетевого трафика. Эти ограничения нам ещё предстояло победить.
Самая первая и самая скромная версия Колхоза
Рост фермы
Пока мы ломали голову над тем, как совладать с ограничениями Apple и подключить к одному компьютеру несколько устройств, помощь пришла с другой стороны.
На складах у хелпдеска Яндекса в тот момент образовалось какое-то количество старых макбуков. Они уже не подходили по параметрам для работы разработчиков, но вполне годились нам на роль агента для управления iOS-устройствами. Спасибо коллегам из хелпа — великодушно поделились с нами железом.
Дело пошло быстрее. Весной 2019-го ферма сразу выросла на двадцать макбуков. Дальше ребята из хелпдеска отдавали в Колхоз рабочие компьютеры Apple, если они больше никому были не нужны. Нам оставалось только докупать телефоны и планшеты на iOS и подключать их к агентам. Чем мы и занялись.
В первую очередь приобретали устройства, которых в сервисе Crowd не было совсем (но имелись запросы на них) или которых часто не хватало. В последнем случае тесты в Колхозе на этих девайсах проходили с большими сроками, и это нарушало дедлайн у проектов Яндекса. После того как закрыли критические дыры, перешли на докупку просто популярных устройств, чтобы постепенно всё больше тестов переводить на ферму.
Сложности
Одновременно с ростом фермы мы вдруг осознали, что все наши устройства — телефоны, планшеты — в первую очередь пользовательские, а не промышленные, как серверное оборудование. Почему-то они не хотели сами жить и стабильно работать 24/7, а требовали внимания. Нормой стала ситуация, когда девайсы постоянно ломаются, зависают, выключаются или перезагружаются.
Решение
Решили, что нам нужен специальный человек, который будет технически поддерживать ферму — взяли в команду системного администратора. Плюс создали чат в телеграме, где пользователи задавали вопросы напрямую разработчикам фермы: как подключиться, сбросить настройки, что делать, если устройство зависло, и так далее. Постепенно мы обзаведёмся и полноценной службой поддержки, но это будет только через год, когда ферма разрастётся до такой степени, что станет невозможно отвечать всем своими силами.
Поначалу макбуки, как и десктопы, стояли на ребре или на верхней полке, рядом с каждым лежал телефон. Место распределялось неэффективно, но решение для этого мы нашли позже
Вторая версия фермы: переносим к себе Android
Наша ферма для iOS росла и крепла, а софт для Android наши исполнители по-прежнему тестировали через Open STF. И страдали всё от тех же проблем: не было автоматического контроля за состоянием устройств и отсутствовало бронирование девайса только для себя. От этого, как уже говорил, хромали удобство (удалённые тестировщики на одном устройстве мешали друг другу) и конфиденциальность (любой мог увидеть данные, которые вводит исполнитель).
Попробовали влиять инструкциями — запретили заходить на девайс с пометкой «Занято». Появилась другая загвоздка — выяснилось, что тестировщики часто забывали выходить из сессии, и пометка «Занято» висела, даже когда устройством никто не пользовался.
Осенью 2019 года мы начали искать решение: как дотащить базовую функциональность нашей фермы до Open STF. Делать полностью свой софт под Android нам не хотелось — рабочая технология уже существовала, и не факт, что мы сделали бы лучше. Вариант форкнуть стороннее решение и развивать свою ветку тоже пока отмели, потому что опасались сложностей с обновлением до новых версий.
Шаг 1: интеграция
Решили начать с единого интерфейса, чтобы тестирование на iOS и Android проходило в одном месте, на сайте нашей фермы. Напомню, через Open STF тесты проходили в их веб-приложении.
Самым простым вариантом было сделать iframe — чтобы в окне на нашем сайте стал доступен интерфейс сторонней фермы. Эту идею сразу отмели и начали делать нормально. За несколько дней мы адаптировали интерфейс Колхоза для отображения и управления Android-устройством. Но технологии по-прежнему были завязаны на Open STF, просто пользователи об этом не знали.
Шаг 2: проксирование
Критическим оставался вопрос с изоляцией сессии. И тут мы додумались поставить между нашими устройствами и сторонним софтом reverse proxy в виде nginx, куда встроили специальную авторизацию на каждый запрос.
Как работала проверка:
- автоматика раздачи заданий создавала на ферме бронь под конкретного удалённого тестировщика, конкретные тест и время;
- исполнитель получал прямую ссылку на забронированное устройство;
- когда пользователь открывал ссылку, запускалась авторизация сессии;
- на наш сервер поступало сетевое обращение — существует ли для этого тестировщика бронирование именно этого устройства на это время. Если нет — доступ к экрану не открывался.
Всё. Теперь пользователь мог открыть только то устройство, к которому у него правда был доступ в данный момент времени. Так мы донесли удобство и конфиденциальность тестирования и до Open STF.
Сложности
На этом этапе у нас уже было около 60 девайсов на Android и 30 на iOS. На выделенных нам полках в общей коммутационной начал разрастаться хаос с кучей проводов. А с появлением бронирования фермой заинтересовались штатные сотрудники Яндекса — они понесли нам на подключение и обслуживание ещё и свои рабочие устройства, чтобы мы централизованно их поддерживали. Эти телефоны и планшеты становились доступны всем — и это было круто, потому что наш парк устройств рос без всяких вложений. Но на своих полках мы перестали помещаться.
Решение
С переносом к себе в интерфейс Android-фермы мы убили сразу двух зайцев. Получили единую модель данных, которая умеет работать с разными технологиями, и расширили базу устройств за счёт девайсов сотрудников. И в это же время нам выделили первую собственную комнатку!
Собираем стеллажи в новой серверной
Обустройство фермы
Немного расскажу, как мы обживались в новой серверной.
Переезжали постепенно — нельзя было просто всё отключить и разом перенести, ведь тестирование работало круглосуточно. Поэтому мы частично отключали какие-то устройства и переносили их в новое помещение. Потом, когда освобождались другие, шла следующая партия. В процессе мы научились жить в условиях, когда ферма распределена на несколько комнат.
Специально для нас помещение оборудовали: установили бесперебойники, систему охлаждения, стеллажи под устройства. Но главной проблемой оставалось грамотное использование места, которое всё равно было в дефиците.
Особенно сложно выходило с iOS-фермой. Какое-то время макбуки стояли у нас на ребре, а рядом с каждым лежал телефон. Потом пробовали использовать полки с разделителями — вставляли телефоны, как книжки. Но всё это получалось неэффективно, потому что полка большая, а телефоны маленькие: даже если ставили в ряд десять девайсов, много места всё равно оставалось свободным.
Так умещали андроиды. Половина полки пустовала
И только в январе 2020 года мы нашли решение — лотки для бумаг! Оказалось, что туда идеально встаёт макбук с экраном в 13 дюймов — миллиметр в миллиметр. Не помню, как мы это выяснили, но лотки стали находкой года. Теперь они выполняют на нашей ферме функцию серверного шкафа. Чтобы подключать провода, мы вырезаем в лотках отверстия под зарядку для ноутбука и USB для телефонов.
Ноу-хау стали использовать универсально. Для iOS-фермы: ставим приоткрытый макбук в лоток и на него кладём телефон. Для Android-фермы: устанавливаем стопки лотков возле агента, в каждый помещаем несколько телефонов или телефон и планшет — в зависимости от диагонали. Важно, что лотки можно ставить один на другой — тогда на каждую полку входит одна или две стопки по шесть лотков.
Если раньше на одну полку мы могли сложить только 10 устройств, подключённых к одному компьютеру, то теперь там помещалось до 24 девайсов. Оптимизацию места провели успешно — можно было закупать больше устройств, расширять ферму и не переживать, что всё повалится с полок.
С лотками стало возможно использовать пространство на полках «в высоту»
Макбуки разместились просто идеально — по пять штук там, где раньше влезало только два
Третья версия фермы: появление десктопов
Когда мы начали работу над фермой устройств на Android и iOS, у нас уже был удалённый доступ к десктопам для тестировщиков. Работали через TeamViewer, но он поддерживал не полное логирование действий, и расшарить лицензию мы могли на ограниченное количество человек — это плохо при масштабировании. К тому же лицензии выдавали вручную, на персональный логин тестировщика — это отнимало много времени.
В начале 2019 года мы бросили все силы на iOS-ферму, а десктопы до поры не трогали. Но как только разгребли все главные проблемы со смартфонами, у нас дошли руки и до этого направления.
Сложности
Серьёзный недочёт старой версии десктоп-фермы был в том, что к TeamViewer могли подключаться все тестировщики этого направления — из общего списка исполнителей, которые знали пароли для доступа к разным устройствам. При этом TeamViewer работал на своих серверах, и не было возможности внедрить строгую внутреннюю авторизацию: чтобы один конкретный человек получал доступ к нужному устройству в определённое время.
К любому ПК два-три человека могли подключиться одновременно и начать мешать друг другу
В январе 2020 года у нас заканчивалась лицензия в TeamViewer — мы решили, что это отличный момент, чтобы перетащить десктопы к себе в интерфейс, как Android-устройства.
Сначала попробовали управлять устройствами через VNC. Это решило вопрос с безопасностью. Всё работало по той же схеме, что и смартфоны — тестировщик получал одноразовую ссылку на сессию работы с конкретным устройством. Но потом мы выяснили, что при управлении через веб-клиент VNC с Mac приходит всего три кадра в секунду вместо желаемых пятнадцати — картинка тормозит из-за большого разрешения экрана и отсутствия в веб-клиенте поддержки проприетарных кодеков, которые обеспечивают хорошее быстродействие в десктопных VNC-клиентах на macOS.
Поначалу после переезда в новую серверную наши стеллажи стояли полупустые — простор и порядок. Но скоро нам снова некуда будет складывать устройства
Решение
Разработали свою технологию с приемлемым качеством. Получилось нативное приложение на C++ (так как важна скорость). Оно делает захват экрана через системное API в macOS и по маске сравнивает очередной кадр с предыдущим — чтобы для экономии трафика посылать в сеть только те кусочки кадра, которые отличаются. Эти кусочки приложение кодирует с помощью TurboJPEG и отправляет картинками, а не буферизированным видеопотоком, что позволяет видеть моментальную реакцию на действия пользователя.
Технологию делали в первую очередь для macOS, но получилось кроссплатформенное решение, которое сейчас используем для Linux и частично для Windows. Стандартное бронирование и авторизацию для тестировщиков, конечно, сразу вшили.
Пандемия: миграция Яндекса в Колхоз
Мы добрались до весны 2020-го. Примечательно, что ещё до карантина к нам пришли коллеги из поисковой выдачи Яндекса и попросили организовать на ферме доступ к внутренней сети компании — чтобы на наших устройствах открывались сервисы и приложения на стадии разработки.
Внутреннюю сеть сотрудники могли самостоятельно настроить на устройствах из Гиперкуба, но её не было в Колхозе. А так как у нас уже накопилось больше девайсов, чем в каждом отдельно взятом кубике, то сотрудники хотели пользоваться этим разнообразием. Особенно просили те, кто часто работал удалённо или уставал ходить по офису к Гиперкубу. Мы взялись за дело.
Сложности
Не удавалось взять и подключить даже часть телефонов к внутренней сети. По требованиям безопасности нужно отслеживать, какие действия пользователи совершают в сети Яндекса. На ферме же каждый девайс был общим, поэтому на него не устанавливался чей-то конкретный сертификат. Плюс устройства были подключены к другой Wi-Fi-сети.
Решение
Мы внедрили авторизацию на сетевом уровне.
А через два дня после того, как мы сделали внутренний доступ, весь Яндекс отправился на удалёнку. Популярность фермы у разработчиков и других сотрудников взлетела!
Четвёртая версия фермы: всё-таки форкаем решение для Android (и снова расширяемся)
Нагрузка на Колхоз росла, и стороннее решение для устройств на Android перестало нас устраивать.
Сложности
У Open STF часто не загружался фронтенд. Статус устройства горел зелёным (готовым к работе), а удалённый экран не грузился. Нам приходили жалобы, а мы никак не могли повлиять на стабильность стороннего решения.
Пришла пора разрабатывать свою версию Android-фермы. Но мы решили это делать с минимальными изменениями, чтобы по-прежнему было не очень сложно обновить софт управления с выходом новой версии Android.
Решение
Форк заключался в том, что мы выпилили всю авторизацию — то есть, наоборот вырезали часть функциональности из Open STF, чтобы не мешала. И затем развернули копию этого софта прямо у себя в серверной, на тех же компьютерах, куда были подключены наши устройства на Android.
Было: одна большая Open STF, которая обслуживала все устройства и тянула их за собой в случае проблем; плюс прокси-сервер для проверки авторизации. Стало: четыре маленьких локальных фермы, каждая из которых не зависит от других и даёт прямой доступ к устройствам под контролем нашего бэкенда.
Обычно мы заклеиваем камеру на устройствах, и на снимке виден только чёрный экран:
Но иногда можно увидеть лоток, в котором лежат устройства:
Подключение Гиперкуба
Благодаря новой архитектуре Android-фермы мы получили возможность устанавливать часть софта для управления устройствами на компьютеры вне серверной Колхоза. Как раз в это время к нам пришли администраторы Гиперкуба и предложили добавить на ферму их устройства — во время пандемии сотрудники разобрали их по домам и не могли передавать девайсы друг другу.
Всё, что нам нужно было сделать, — установить специальную программу на компьютеры в Гиперкубе. И в Колхозе появилось больше тысячи новых устройств на Android. Единственное ограничение — эти телефоны были доступны только штатным сотрудникам, потому что не имели доступа к внешнему Wi-Fi. Но в период пандемии и массового перехода на удалёнку это расширение оказалось полезным.
Увы, с iOS-девайсами такая интеграция была невозможна — мы не могли засунуть в кубик сорок дополнительных ноутбуков, чтобы к каждому подключить по телефону. А с Android — пожалуйста. Их можно десятками подсоединять к одному агенту, и всё работает быстро и качественно. Наш рекорд — к одному мощному компьютеру подключены сто девайсов на Android.
Но после интеграции Гиперкуба мы поняли, что можем сделать сервером фермы любой рабочий ноутбук — на macOS, Windows или Linux. И уже к нему сотрудники смогут подключать все нужные им устройства. Эту возможность мы стали предоставлять распределённым командам: они собирают маленькую ферму с собственными девайсами прямо у себя в кабинете и сами решают, кому давать права управления их устройствами. После этого команда может подключаться к своим рабочим девайсам из любых точек мира — через единый интерфейс Колхоза.
С ростом парка устройств провода снова начали походить на распутанный клубок
Развитие фермы
Дальше история Колхоза не заканчивается, но двигается вперёд маленькими шагами. Поделюсь самыми важными.
Подключили службу поддержки
Летом 2020 года мы перестали справляться с сообщениями в ламповом чате команды. Тогда завели большую справку с инструкциями по ферме и обучающими видео. А ещё — полноценный саппорт в виде окошка быстрого чата в интерфейсе.
Если пользователь не находит ответ на свой вопрос в готовой справке, он может обратиться к саппорту:
Наша служба поддержки, как и тестировщики, работает удалённо. Это люди, которые хорошо знают ферму и помогут в большинстве возникающих вопросов. Если пользователи пожалуются на неисправность устройства, саппорт проверит, действительно ли есть проблема. Если да — устройство пометят как нерабочее и попробуют починить удалённо. Не получится — передадут информацию о поломке офлайн-администраторам.
Кроме этого, есть автоматические диагностики — все устройства периодически запускают самотестирование, которое проверяет основные функции. Когда что-то не работает, устройство получает пометку, чтобы пользователи его не брали.
У одного из тестировщиков подвисла тестовая версия Навигатора
Научились обнулять устройства после сессии
Запрос на эту фичу был с самого начала, но не сразу получилось внедрить автоматическую чистку. Поэтому долгое время мы просто просили пользователей: выйдите отовсюду, удалите файлы и установленные приложения. Но, конечно, далеко не все это делали. Когда другие люди брали устройство, им сначала приходилось чистить девайс и сбрасывать предыдущие настройки.
В 2020 году мы наконец-то смогли добавить автоматическое обнуление на смартфонах. Теперь система после каждой сессии проверяет и стирает установленные программы, чистит часть файловой системы устройства, загрузки, выходит из приложений. Всем стало проще работать.
Просим пользователей не логиниться в личных аккаунтах
Добавили звук
Изначально звук на наших устройствах не воспроизводился. Через удалённый доступ нельзя было послушать голосовые команды, сигналы в приложениях, трек в видео. Эту фичу у нас часто просили команды Яндекс Музыки и Карт. Мы долгое время изучали разные способы, как дотащить звук до пользователя через все наши серверные и удалённое управление.
Особенность передачи звука с фермы — рядом всегда находится много других устройств, которые тоже как-то звучат. Поэтому звук нужно снимать только системно, не через динамики. Если зайти в серверную Колхоза, там на одном телефоне играет рэп, на другом кто-то смотрит стрим, на третьем тестируются Карты. Шум порой стоит невозможный.
Мы нашли два решения. Первое — для Android-устройств: проводом получать звук через разъём наушников. Второе — для iOS: внезапно оказалось, что механизм, позволяющий использовать только один девайс на одном ноутбуке, умеет передавать и звук тоже. Спасибо и на том.
Добавили нестандартные устройства
У нас давно числились в базе головные автомобильные устройства, которыми для нашего сервиса являются планшеты на Android. С развитием фермы мы вывели их в отдельную вкладку «Умные устройства». После добавления поддержки звука туда же попала Яндекс Станция. А потом, по запросу Группы тестирования Алисы и Умных устройств, у нас появились и телевизоры.
Головные устройства крепим сбоку на лотки под бумагу — это фото вы уже видели
Кто-то тестирует Android TV
Новенькие, закупленные на ферму Яндекс Станции
Внедрили систему рейтинга устройств
По умолчанию у нас работает автоматическое тегирование, которое при подключении устройства к ферме выясняет и вносит в систему его характеристики. В среднем это 30-40 параметров: от модели телефона и версии ОС до разрешения экрана и быстродействия. В итоге мы получаем детальную базу устройств, из которой пользователь может выбрать максимально подходящее — отметить в системе нужные фильтры и получить список доступных девайсов.
В начале 2021 года мы сделали возможность оценить устройство после работы — так к техническим характеристикам девайса добавился его рейтинг. Если устройство часто тормозит или плохо справляется с тестами, у него будет низкий рейтинг, а если всё летает — то высокий.
Рейтинг помог нам обнаружить самые плохие устройства и убрать их из раздачи или заменить новыми. Делать вручную это было бы долго и тяжело, а так на помощь нам пришёл классический краудсорсинг — по отзывам сотен людей мы стали быстро получать точную оценку каждого девайса.
При завершении бронирования система просит пользователя оценить устройство
Кроме того, система теперь подбирает пользователю девайсы с самым высоким рейтингом из доступных, а не первые попавшиеся. До этого часто были случаи, когда тестировщики получали медленное устройство и жаловались на него, в то время как более мощный подходящий девайс лежал без дела. Рейтинг оптимизировал распределение.
Стали автоматически записывать сессии
На скрине выше видна голубая плашка-предупреждение о видеозаписи всех сессий. Эту фичу мы внедрили в целях безопасности и контроля качества. Раньше при неполадках на устройстве тестировщики не всегда нажимали кнопку «Запись» — потом было сложно в точности воспроизвести замеченные дефекты и разобраться, что работает не так. С видеозаписью всех сессий на бэкенд фермы проблему решили. Теперь можно автоматически получить скринкаст своих тестов с любого девайса.
У администраторов Колхоза есть доступ ко всем видео. Это помогает контролировать качество работы устройств, вычислять читеров или делать сложный дебаг (учитывать все действия на девайсе, а не только указанные в баг-репорте).
Ввели квоты для сотрудников
Изначально у нас не было никаких ограничений по времени использования устройства и их количеству на одного пользователя. В крауд-тестировании с этим не возникало проблем — удалённый тестировщик приходил, брал подходящий девайс, делал свой тест по инструкции и уходил. А вот с наплывом в Колхоз разработчиков начались сложности.
Некоторые бронировали двадцать устройств на час и перебирали их — смотрели, с каким больше нравится работать. Бывали и бронирования на целый день, по которым даже не открывали устройство — забывали или не успевали. Чтобы такого не было, мы ввели квоты.
Теперь у каждого сотрудника есть три часа в день на использование девайсов в Колхозе. Но если квота закончилась, а человеку нужно продолжать работать, он может запросить увеличение времени.
Начали вести аналитику
Опираясь на рейтинг и информацию о бронированиях, мы делаем выводы: каких устройств не хватает, а какие совсем не используются. Это помогает нам перестраивать базу под потребности тестирования — чтобы ненужные девайсы не занимали слоты на ферме.
Например, слишком старые версии ОС перестают быть актуальными — тогда мы оставляем несколько устройств с такими системами на всякий случай, а остальные обновляем до более востребованных.
Кстати, новые версии ОС у нас появляются сразу после релиза, а модели телефонов — как только выходят в продажу. Например, в Колхозе можно потестировать Huawei с HMS, Google Pixel 2, 3, 4a, 5 и 6, версии Android от 4.2.2 до новейшей беты 13 и устройства на iOS от 9 до 16 версии. Но зачастую проблемы возникают именно со старыми системами и устройствами, которые не так просто купить. Поэтому мы стараемся сохранять редкие девайсы и ОС.
Пробросили локальный интернет
Ещё одна фича, которую мы не сразу смогли внедрить. На компьютере, куда подключено устройство, прописываем для связи с девайсом прокси-сервер — но не настоящий, а особый. Он (прокси) через веб-сокеты заворачивает в туннель приходящие к нему запросы. Этот туннель протягивается от наших серверов до интерфейса фермы на компьютере пользователя, где тоже ставится специальное приложение, соединённое с нашим сервером. Грубо говоря, в этот момент ферма становится мостиком, по которому до устройства дотягивается локальный интернет с компьютера пользователя. И человек во Владивостоке может раздать свою сеть на наш девайс в Питере.
Схема даёт две возможности: перехватывать и анализировать трафик с удалённого устройства
Открыли API для бронирования устройств
Периодически нам поступают запросы на поддержку автотестов, но мы пока сконцентрированы на ручном тестировании. Поэтому стали предоставлять API, через который можно забронировать устройство и попробовать своими средствами сделать инфраструктуру для автотестирования.
Потом эти пользовательские системы подключаются к API фермы и выполняют заданные действия. Благодаря этому для Android-устройств теперь возможна удалённая отладка тестов.
Итоги и планы
Если оглядываться назад, то мы, конечно, не ожидали, что ферма разрастётся до таких масштабов. Создавали её для iOS-устройств, чтобы предоставить удалённым тестировщикам дефицитные версии телефонов и ОС, а в итоге сделали мультиплатформенное решение, которое поддержало девайсами весь Яндекс на удалёнке и позволило сервису Crowd вырасти из 100 исполнителей в текущие 3000+ человек.
Всё это было бы невозможно без поддержки ряда команд Яндекса, которые помогали нам развивать сервис на разных этапах истории. Хелпдеск спас железом, Гиперкуб поделился устройствами, группы Поиска, Алисы, Навигатора и Музыки помогли с внедрением полезных фич. Парк Колхоза стартовал с 12 айфонов и 30 андроидов, а теперь у нас больше 200 iOS-устройств, около 450 андроидов и больше 50 умных девайсов, Станций и телевизоров. И всё это можно продолжать масштабировать.
В глобальном смысле Колхоз даёт людям возможность войти в профессию тестировщика с одним компьютером. Раньше лишь у малой части удалённых исполнителей имелись на руках разные устройства: планшеты на Android, айпады, свои Станции, умные часы, блютус-гарнитуры, смартфоны на разных ОС. Большинство же работало с одним лэптопом и смартфоном — многие задания тестировщикам было просто не на чем выполнять.
В планах — продолжать наращивать качество и объём тестирования, увеличивать возможности фермы за счёт технических доработок.
Если у вас появились идеи, как ещё можно использовать Колхоз, пишите в комментарии, будем рады свежим мыслям.