Все новые сервисы Яндекса, а также апдейты к существующим приложениям и сайтам нужно тестировать: на айфонах, андроидах, десктопах, умных колонках, телевизорах. Раньше часть тестировщиков работали на личных телефонах и компьютерах, а часть — использовали для тестов корпоративные девайсы. Процесс не был гибким и с трудом масштабировался. Поэтому мы сделали свою клауд-ферму устройств. Сначала ей пользовались только отдельные команды тестирования, но со временем ферма стала особенно популярна и среди разработчиков. В итоге мы собрали почти 800 разных девайсов, которые теперь доступны 24/7.



Меня зовут Кирилл Коргов, я отвечаю за то, чтобы ферма устройств работала и развивалась. Кстати, называть её просто фермой было бы скучно, поэтому где-то на заре проекта мы по-доброму назвали её близким по смыслу словом «Колхоз». Если интересно, с чего Колхоз начинался, как пандемия привела к неожиданному росту его популярности и что общего у макбуков с лотками для офисной бумаги, прошу под кат.

Вводная часть про тестирование


Объясню, как оно работало у нас до Колхоза и с чем случались проблемы.

Тестирование в Яндексе бывает двух типов. Первый — когда сами разработчики что-то тестируют в процессе своей работы. Для этого, помимо устройств команды, у нас есть Гиперкуб, мы уже писали о нём на Хабре. Если кратко — в офисах Яндекса стоят специальные шкафы с разными девайсами, которые сотрудники могут брать для тестов. Запомните про них — они ещё поучаствуют в истории Колхоза.

Второй тип — тестирование через внутренний сервис 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, айпады, свои Станции, умные часы, блютус-гарнитуры, смартфоны на разных ОС. Большинство же работало с одним лэптопом и смартфоном — многие задания тестировщикам было просто не на чем выполнять.

В планах — продолжать наращивать качество и объём тестирования, увеличивать возможности фермы за счёт технических доработок.

Если у вас появились идеи, как ещё можно использовать Колхоз, пишите в комментарии, будем рады свежим мыслям.

Комментарии (48)


  1. prishol
    06.09.2022 11:12
    +7

    Удачно подобрали название для внутреннего сервиса :) Обычно из таких внутренних разработок компании рождается полноценный продукт.


    1. vagonovozhaty
      06.09.2022 19:51
      +6

      Квоты можно переименовать в трудодни


      1. Magnum72
        07.09.2022 00:59
        +2

        Полки в свинарники, лотки в стойла


  1. netmaniac
    06.09.2022 12:14
    +8

    Расскажите как решили проблему постоянно висящих на зарядке устройств и их вздувшихся аккумуляторов


    1. GeXoGeN
      06.09.2022 13:45
      +5

      привет, отвечу, как человек, который непосредственно эту проблему решает. каждый раз, в комментариях к статьям про мобильные фермы задаётся этот вопрос, и иногда мне самому хочется его задать, потому что серебряной пули мы не нашли. знаю, что наши коллеги в своё время придумали подключать внешний источник питания непосредственно к контроллеру батареи, удаляя родной элемент питания. к сожалению, мы не смогли придумать как нам отмасштабировать это решение до объёмов фермы. потому что во-первых - это сразу x2 проводов к каждому устройству, а проводов, как можно видеть на фото к посту и так довольно много, а во-вторых нужно дополнительно придумывать, как синхронизировать рабочее напряжение на разных моделях устройств (либо подключать каждое к отдельному источнику питания), в итоге это дополнительно усложнит нашу и без того непростую жизнь. в общем, конечно, хотелось бы воплотить возможность работы девайсов без аккумулятора, но пока мы поступаем, как и большинство наших коллег - производим визуальный осмотр фермы и меняем вздутые батареи.


      1. Tarakanator
        06.09.2022 16:14

        а зачем синхронизировать питание? везде литиевые аккумы, так что любой девайс от 3.7 вольта работать будет. Нет, конечно у ноутбуков могут и 2 и 3 элемента последовательно соединяться.... но это всё равно только 3 варианта напряжений.


        1. GeXoGeN
          06.09.2022 16:35
          +1

          я наверное неправильно выразился, но девайсы будут пытаться заряжать внешний блок питания и друг друга. просто параллельно все на одну шину посадить нельзя. ну и в последнее время свежие андроиды пытаются умную зарядку делать и не заряжают больше 80% (а поскольку мы их с зарядки никогда не снимаем) они никогда и не пытаются больше 80 зарядить). короче, сходу кажется, что можно сделать легко, но когда начинаешь о всех нюансах думать, как-то сразу начинает меньше хотеться, пока справляемся просто меняя аккумуляторы. как только поймём, что перестали, будем придумывать что-то новое.


          1. TheRaven
            06.09.2022 20:41
            +1

            но девайсы будут пытаться заряжать внешний блок питания и друг друга. просто параллельно все на одну шину посадить нельзя

            Чего они будут пытаться делать?
            Суть предложения вот в чем — удаляем аккум, на его контакты вешаем внешний БП на ~4 вольта, шнурок из USB выдёргиваем. Всё. У девайса бесконечная батарея заряженная на ~85%.


            1. GeXoGeN
              06.09.2022 20:43

              Аааа…. Вон оно что… девайсы без юсб не будут управляться. Юсб не для зарядки им нужен, а как раз для управления.


              1. TheRaven
                06.09.2022 20:51

                Ну хорошо, дополняем систему USB-шкой с разомкнутой линией 5v — дата есть, земля есть, управляйтесь.
                Если сделать кастомные шнурки, то и мешанины проводов не будет.


                1. GeXoGeN
                  06.09.2022 21:32
                  +3

                  Выглядит, как хорошая тема для исследований, особенно интересно, как по таким кастомным кабелям будут эппловские девайсы работать (вангую, что не будут). Не думай, что я сразу отметаю идею, но простой она только кажется, а на деле это будет бесконечная ходьба по граблям, и в итоге окажется, что проще было пару мастеров посадить, чтоб они сидели и круглые сутки батарейки меняли.


                  1. TheRaven
                    06.09.2022 22:07

                    А это скорее всего так и есть, примеры китайских ферм это доказывают.

                    В комменте ниже pbw дал ссылку на статью, в которой раскрываются некоторые офигенно неочевидные нюансы работы контроллера заряда мобильника.


      1. netmaniac
        06.09.2022 17:06
        +1

        Вытаскивание и "переделка" батарей - большой объем работ и проблемы с гарантией

        Когда ковырялся в этой теме пару лет назад, то заметил, что андроид устройства могут работать(подключаться) по USB с минимальным током на +5В.
        Оставалось сделать: софтовое решение отдающее процент батареи на сервер и "железный" USB хаб подающий на нужный порт с севшим аппаратом +5В с нормальным током для зарядки


        1. GeXoGeN
          06.09.2022 20:28

          ну к слову сказать, девайсы, которые ещё на гарантии, пока ни разу не вздувались.


      1. pbw
        06.09.2022 19:16
        +5

        Чуть ли не единственная правильная статья на эту тему, автор реально умен.

        Эта статья - не то, что нужно. Но вот комменты к ней стоит внимательно почитать.

        Это заработает не всегда и не со всем подряд. Копья об конденсаторы до сих пор ломают.


        1. GeXoGeN
          06.09.2022 19:21
          +2

          благодарю. очень полезный материал.


    1. Coderx64
      07.09.2022 12:23

      на рутанутых девайсах можно такую штуку заюзать
      https://f-droid.org/ru/packages/com.slash.batterychargelimit/


  1. SADKO
    06.09.2022 12:24
    +1

    Красавы ваще, нечто подобное часто видел у китайцев, там правда не ради тестирования своих приложений, а ради создания иллюзии жизни для чужих, способных распознавать не только виртуализацию, но и особо топорные костыли на физических устройствах ;-)


    1. AnnaPerova
      08.09.2022 10:12

      Что имеете ввиду? Объясните, пожалуйста


  1. Mnemonik
    06.09.2022 14:17
    +6

    увидел кучу макбуков, подумал «вот это дичь», прочитал про 1 айфон - 1 макбук, подумал что «дичь конечно, но теперь понятно почему». потом сразу подумал - а не пробовали виртуализировать macos и пробрасывать usb порты в виртуалки? macos легально запускать в виртуалке на другой макос (хардваре эппл), не пробовали поставить макмини помощнее, запустить на нем пяток виртуалок и пробросить в каждую 1 usb порт?

    а в целом нереальный респект за очевидный «колхоз», но без снобизма объяснённый зачем так сделано и почему. нестандартные задачи требуют нестандартных решений!


    1. DarthVictor
      06.09.2022 15:49
      +1

      В Яндексе 10К сотрудников и у 90% макбук, кажется, что у них есть достаточный запас макбуков возрастом 3-4 года, которые не стали выкупать их пользователи, после списания.


      1. event1
        06.09.2022 16:04
        +1

        С одной стороны да, но с другой 50 макбуков занимают сильно меньше места чем 200 макбуков. По 6 на полку, получается 10 полок против 50-и полок.


    1. GeXoGeN
      06.09.2022 20:01
      +1

      по поводу виртуалок - поскольку мы используем в основном б/у макбуки, у них не особо хватает вычислительной мощности, чтоб запустить рядом ещё одну макось с нашим приложением, поэтому мы даже особо не тестировали на них. захват видеопотока с экрана устройства потребляет достаточно много cpu (в процессе работы наблюдается 100% загрузка одного из ядер). так что по моим прикидкам, даже если взять 6-ядерный макмини, то это даст нам не пяток виртуалок а всего одну (потому что помимо захвата, поток надо ещё обрабатывать и передавать пользователю, выполнять приложение, которое пробрасывает жесты пользователя на устройство), в довесок к хостовой системе получим 1 девайс в виртуалке и 1 в хостовой ОС, профит небольшой, а система усложняется. но благодаря некоторому избытку хостов, мы можем использовать недоутилизированные мощности, например в статье упоминалось про видеозапись пользовательских сессий, их мы перекодируем как раз на этих же самых макбуках, на встроенной Iris Graphics. часть макбуков выделено для использования в качестве билдагентов для нашего приложения, и ещё часть используется для запуска автотестов в Safari.


  1. Alexa11223344
    06.09.2022 16:24

    Классно придумали, было интересно почитать


  1. SabMakc
    06.09.2022 16:24
    +1

    Пробовали стоящие на боку раскрытые ноуты, но "вложенные" друг в друга? Как минимум для маков такое бы обеспечило достаточно высокую плотность размещения...

    Правда доставать неудобно было бы... Если речь не про верхнюю полку )

    И да, решение с лотками как минимум удобнее - тестовое устройство в одном лотке с маком.


    1. korgov Автор
      06.09.2022 17:43
      +2

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


      1. SabMakc
        06.09.2022 17:45

        кроме ноутбука нужно ещё куда-то разместить и сам девайс

        Скотчем к корпусу?


        1. GeXoGeN
          06.09.2022 20:23

          надо тогда на магнит ))) чтобы когда тебе надо взять в руки телефон, не приходилось ещё и макбук брать. ну и про мешанину проводов упоминали уже вроде. когда они вложены, постоянно, вытягивая один, зацепляешь соседние в частности - отключаются разъёмы магсэйф. ну и чтоб добить - вентиляция у вложенных друг в друга ноутов сильно хуже. лотки, которые мы используем, хороши тем, что они очень хорошо продуваются.


  1. ernestocruz
    06.09.2022 16:27
    +2

    занятно.
    При этом вход в аккаунт, через главную страницу яндекса, тот еще квест (возможно уже починили). После обращения в ТП наверное еще с месяц проблема оставалась.
    Может стоит заставить всех сотрудников пользоваться собственными сервисами? =)


  1. Didimus
    06.09.2022 17:28
    +2

    Оффтоп: что там с датацентром в Финляндии?


  1. Shura_m
    06.09.2022 17:45
    +2

    Может точнее будет "Совхоз"?

    "колхоз"- это объединение работников со своими средствами производства.


    1. korgov Автор
      06.09.2022 17:53
      +4

      Под это определение "Колхоза" мы тоже можем подойти - например, разные внутренние команды Яндекса стали отдавать свои тестовые устройства к нам в сервис, чтобы они были доступны для удалённого использования, но вместе с этим устройства становятся доступны ещё и другим командам - таким образом увеличивается разнообразие устройств доступных всем.


  1. Blogoslov
    06.09.2022 21:38

    На одном из скриншотов "Новенькие, закупленные на ферму Яндекс Станции" видно что у вас там без костылей не обходится. Поделитесь пожалуйста в чём они заключаются, ну или на каком из них обнулился счётчик?


    1. Ionenice
      06.09.2022 23:01
      +2

      Так вся статья же как раз о костылях, а новые проблемы плодят всё больше костылей)


  1. slonopotamus
    06.09.2022 22:07
    +4

    Очень круто, где исходники колхоза скачать-то?


  1. wizard_s
    07.09.2022 08:20
    +1

    Что в итоге из оригинального OpenSTF у вас осталось, а что переписали? Не планируете выложить в opensource?

    По опыту работы с даже небольшим парком телефонов (20-30шт): из коробки получается система, которая постоянно требует ручного обслуживания. На вашем парке имеет смысл держать отдельного сотрудника, при небольшом числе устройств ферма превращается в головную боль кого-то из сотрудников, который не очень горит этим заниматься. Телефоны, особенно китайские, регулярно отваливаются, требуется вручную отключать-подключать, чтобы заново определились, что-то нажимать на экране (разрешения, изменения режимов зарядки - у некоторых китайцев так и не разобрались как включить на постоянку то, что нужно, при каждом подключении режим слетает или отключаются галки отладки по usb и другие, на некоторых решили, на некоторых нет), вручную перезапускать контейнеры с adb. Более-менее нормально и беспроблемно подключаются и работают самсунги. В самом STF из коробки часть функций и пунктов меню вообще не работает. Связка mcloud-ios с STF - еще более проблемное поделие. Ну и стандартные жалобы пользоваталей - тормозит, подвисает интерфейс и т.п. За неимением альтернативы, конечно, пользуемся, но нам не нравится.

    Как решили вопрос с разблокировкой ios удаленно? Через STF свайпы для разблокировки не срабатывают нормально, приходится отключать блокировку (и рано или поздно идти к айфону и разблокировать вручную).


    1. korgov Автор
      07.09.2022 23:58

      По поводу OpenSTF - на самом деле всё что отвечает за управление android-устройством у нас осталось нетронутым, мы просто точечно вырезали все места где была какая-либо авторизация или проверка (прав / stf-брони), чтобы вебсокет-соединение для управления девайсом всегда устанавливалось и информация об устройстве и всех его портах для управления и захвата картинки всегда была доступна, тк перед stf-инстансом у нас собственный фронтед и бэкенд со всеми нужными нам проверками.

      Про разблокировку iOS я может не совсем правильно понял, но есть возможность программно нажимать кнопку "Home" (даже если на самом телефоне такой физической уже нет), и она успешно справляется с включением экрана + мы умеем детектить что картинка пропала и выполняем это действие автоматически.

      А про обслуживание всего парка устройств - вы абсолютно правы, как только мы вышли в продакшен, потребовался специально выделенный сотрудник, чтобы решать проблемы возникающие в ходе эксплуатации устройств и всей инфраструктуры вокруг.


  1. Neverstan
    07.09.2022 10:26

    Спасибо за статью! Интересно как у вас выглядит тестирование Яндекс станций, как-то удаётся передавать звук с микрофонов пользователей на удалённую станцию?


    1. korgov Автор
      08.09.2022 00:14

      Тут нам помогли сами разработчики из команды умных устройств, сделав специально для нас возможность передавать звук в "виртуальный микрофон" по сети, а не в настоящий. В качестве альтернативы ещё рассматривали возможность как-то припаиваться к настоящему микрофону и дотаскивать сигнал проводами от специальных звуковых карт, но это всё оказалось сложнее и менее надежно :)

      Но справедливости ради - в последнее время тестирование Яндекс Станций в Колхозе больше ушло в сторону автотестов и Колхоз тут выступает как площадка где их можно прогонять.


  1. AnnaPerova
    07.09.2022 11:56
    +2

    Прочитала не отрываясь про костылизацию костылей, и это комплимент. Смекалочка с лотками — пять баллов. Коллективные устройства — название «Колхоз» в тему) Квоты тогда надо было назвать трудоднями)
    1. Но есть уточняющий вопрос — есть служба поддержки. Но не понятно — это выделенная служба только для Колхоза?
    2. Возникали ли мысли «расшарить» сервис на внешних пользователей? Яндекс.Колхоз или что-то такое?)


    1. korgov Автор
      08.09.2022 00:31
      +1

      1. В компании есть специальное подразделение которое занимается поддержкой пользователей, как внешних, так и внутренних. И у отдельно выделенных сотрудников поддержки есть специализация заточенная под конкретные сервисы, такая появилась и для нашего Колхоза.

      2. Мысли такие конечно же возникали, но пока большую часть времени мы уделяли именно внутренним потребностям. :)


      1. AnnaPerova
        08.09.2022 10:16

        1. Спасибо, теперь понятнее)

        2. Будем ждать масштабирования, удаленный доступ почти ко всему списку мобильных устройств сильно бы упростило жизнь)


  1. alordash
    07.09.2022 12:08
    +1

    Есть ли в планах сделать рейтинг устройств публичным?


    1. korgov Автор
      08.09.2022 00:55

      Честно говоря, не думали об этом, но спасибо за идею :)

      Просто наш рейтинг, который мы учитываем при ранжировании устройств, привязан к конкретному устройству, а не к его модели. Поэтому утверждать что переносить его на другие устройства тех же моделей будет справедливо - нельзя. Но какая-то корреляция наверное есть.


  1. 3aBulon
    07.09.2022 12:32

    Откуда берете редкие устройства? Алиэкспресс? Интересно про это было бы почитать. Где брать батареи под старые устройства?

    Покупаете ли редкие устройства на Авито/Юле, пока они еще есть? Или все же не настолько они нужны?


    1. korgov Автор
      08.09.2022 00:47

      В основном закупка происходит у официальных ритейлеров и чаще это именно новые модели устройств или просто "ещё не снятые с продажи". Старые модели устройств у нас либо накапливаются естественным путём (устаревает то что мы сами купили), либо нам иногда отдают то что было когда-то куплено в компании для сотрудников, ещё до существования нашего сервиса.

      Отдельное внимание мы уделяем версии ОС которая предустановлена на устройство и если это не та которая нам нужна - такие устройства стараемся не покупать, тк откатиться на более старую версию зачастую нельзя.

      Батареи покупаем в основном в обычных сервисных центрах и проблем с этим особо не возникало, но тут может меня поправят. :)


  1. LordCrash
    07.09.2022 15:12

    Как устроиться в Яндекс и заниматься такими задачами? Хочу


    1. Katsvill_91
      07.09.2022 17:10
      +1

      Привет! А напиши мне в телегу @katsvill
      помогу ????