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

image

Меня зовут Дмитрий Мухаев, я — тест-менеджер в мобильном штабе «Лаборатории Касперского». В этой статье я расскажу о том, как с помощью мобильной фермы мы сделали парк из более чем 500 устройств доступными в режиме 24/7 любому в большой распределенной команде из QA, UX, саппорта и отдела документирования и локализации, а это в общей сложности более 200 пользователей.

Идея фермы появилась в ответ на проблему шаринга устройств между командами.
У нас более 500 устройств — не таскать же баул со смартфонами и планшетами, например =) Так что вместо передачи гаджетов «из рук в руки» мы попытались организовать к ним общий доступ. Так мы пришли к идее фермы на OpenSTF.

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

Самое главное преимущество, которое мы получили от фермы по сравнению с россыпью устройств на рабочих столах, — это возможность уйти с тестированием на удаленку/гибрид. Кардинально сократилось время на поиски нужного устройства, а значит, ускорились все рабочие процессы. Не нужно в коммуникаторах пытаться достучаться до коллег, выясняя, у кого физически лежит тот или иной смартфон. Не надо ни с кем договариваться о том, чтобы в какой-то отрезок рабочего времени получить к ним доступ. Все устройства доступны 24/7. Если вдруг приспичило, то даже в 2 часа ночи можно найти нужный Samsung и запустить на нем тест.

Часть устройств у нас постоянно выделена для долгосрочного тестирования (long-term). Все тесты производительности — скорости инициализации, старта, выполнения отдельных функций, да и в целом производительности приложений, то есть. все, что может раздражать пользователя при проседании, — мы стараемся запускать удаленно на ферме, за исключением, пожалуй, теста на потребление заряда батареи.

Фермой пользуются и смежные подразделения, то есть все, кому может быстро понадобиться пользовательский телефон: дизайн, саппорт, Doc&Loc и так далее. Это второе большое преимущество такой схемы работы. Коллеги из других отделов свободно проверяют локализацию продуктов, тестируют дизайн. Например, в саппорт прилетает запрос, описывающий девайс-специфическую проблему. Разработчик может не брать устройство к себе домой, а проверить все удаленно. Аналогично можно проверить, насколько дизайн адаптирован к супермаленькому экрану.

Ну и конечно, ферма фактически сокращает бюджет на закупку популярных устройств для тестирования. В особенности если попадаются «экзотические» пользовательские устройства, которые непросто найти, — теперь есть возможность быстро поставить такое устройство на удаленку. У нас есть «дежурный» по ферме, который может быстро подключить необходимый девайс.

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

Как это работает


За последние годы у нас было несколько реинкарнаций фермы. Начинали с вертикального стенда, в котором помещалось порядка 20 устройств. Со временем поняли, что ферма пользуется достаточно большой популярностью, и начали искать другие варианты.

Мы хотели разместить в ферме больше устройств, расположив их плотнее. И было несколько моментов, о которых стоило подумать заранее:

  • У старой фермы были проблемы с USB-хабами — устройства периодически отваливались и не заряжались. Это хотелось устранить.
  • При плотном размещении устройств мы ожидали проблем с охлаждением.
  • Хотелось сделать ферму модульной, чтобы мы могли поэтапно раскатывать обновления и частично уводить в обслуживание без полного отключения.
  • Параллельно мы стремились повысить отказоустойчивость. Нам нужно было, чтобы устройства в ферме были минимально зависимы от программных сбоев, то есть хотелось иметь возможность использовать часть фермы, если другая часть выходит из строя.

Мы провели несколько этапов экспериментов и остановились на такой схеме.

Размещение устройств


Для размещения устройств мы используем металлический телеком-шкаф с выдвижными полками 800 x 600 x 600 мм. В шкафу 8 полок, на каждой из которых можно разместить 8–10 телефонов. Планшеты и фаблеты лежат отдельно, поскольку занимают больше места. В общей сложности к ферме подключено порядка 80-90 устройств.

image

Металлический шкаф обеспечивает хороший отвод тепла. Мы предполагали в случае проблем с охлаждением установить в штатные места телеком-шкафа стандартный блок вентиляторов, но они не понадобились. Шкаф установлен в отдельной комнате, где нет рабочих мест, поэтому температура там всего 21 градус. И это решает часть проблем.

Было лишь одно опасение — не будут ли при таком плотном размещении устройства создавать друг другу помехи при постоянном подключении к Wi-Fi. Но на практике это не помешало.

Ноды и USB-хабы


Устройства собраны в STF-ноды с помощью специфических USB-хабов. Оптимальное сочетание для наших нужд — это USB 3.0 для передачи данных и BC 1.2 для зарядки.

Надо отметить, что поиск USB-хабов был проблемой. Почти все производители, заявляющие поддержку той или иной мощности на определенное количество портов, к сожалению, предоставляют недостоверную информацию. Сами устройства при этом вытягивают всего несколько портов, что для фермы недостаточно. В итоге мы выбрали две модели хабов с Amazon в США. К сожалению, сейчас они уже сняты с производства.

Для управления каждой нодой используется Raspberry Pi model b (с arm64 и 4 Гб оперативной памяти). Он отлично справляется с транспортом данных и видеопотока, поддерживая работу 8–10 устройств. Десктоп в этой роли был бы оверкиллом, который занял бы в 3-4 раза больше места. Микрокомпьютеры же позволили повысить отказоустойчивость (на фоне предыдущей версии фермы) и сделать каждую полку самостоятельной. Настройку и развертывание образов мы выполняем стандартными Ansible-скриптами.

Хост


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

А управляется все это хостом OpenSTF. Правда, под использование Raspberry Pi (под arm-архитектуру) пришлось его немного адаптировать — пересобрать OpenSTF.

image

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

Полезные функции


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

  • Группирование устройств. Для пользователей или проектных команд мы можем выделять устройства в группы, к которым имеют доступ все заинтересованные, так все знают, как именно используются эти устройства. А главное, никто посторонний не имеет к ним доступа — то есть не зайдет и не поломает тесты, не сотрет нужную версию приложения. При этом мы никак не ограничиваем процесс тестирования — мы предоставляем проектным командам возможность самостоятельно выстраивать работу.
  • Чистка мусора. Базовый функционал OpenSTF — это очистка мусора с устройства после окончания тестирования. Для каких-нибудь интеграционных тестов можно установить множество приложений. OpenSTF сам все это удалит после окончания процесса перед разблокировкой устройства для других пользователей. Это очень полезно. Автоочистка отключается для долгосрочного тестирования. Устройства под эту задачу мы стараемся собирать на одну полку, чтобы отключать автоочистку для какой-то одной ноды.
  • Звонки и SMS. На ферме есть телефоны с SIM-картами (на момент выхода статьи из 88 телефонов симки были установлены в 13). Мы держим по одной SIM-карте в каждом мажорном Android, начиная с 5.0. С этих телефонов можно позвонить или послать SMS, если это необходимо для тестирования.
  • Встроенные скриншоты. Ферма позволяет стандартными средствами OpenSTF удаленно делать скриншоты экранов на разных смартфонах.
  • Adb over tcp, который предоставляет все необходимые инструменты отладки, как будто телефон лежит на столе.

Мониторинг и расширение фермы


OpenSTF позволяет нам наблюдать за загрузкой фермы и работой каждого устройства. Данные по доступности, зарядке батареи и утилизации в тестах конкретного смартфона OpenSTF отдает через API. Мы их забираем и складываем в БД MS SQL, чтобы впоследствии визуализировать.

Загруженность устройств помогает планировать расширение фермы. Наша цель, чтобы каждое устройство было загружено менее чем на 30%. Тогда с вероятностью более 70% пользователь найдет его свободным (или сможет подобрать близкое по характеристикам).

Даже в периоды активного использования одновременно задействованы порядка 10 устройств в день, и то не 24 часа в сутки. Кто-то попользовался — ушел обедать или писать тест-кейсы. А мы следим за тем, какие из устройств чаще используются для прогона ручных или автотестов, а какие простаивают. Если устройство не используется определенное время (около месяца), мы задаем коллегам вопрос, а нужно ли оно на ферме вообще? Если никто не хочет с ним работать, мы можем заменить его на что-то более полезное.

image

Планируя, какие устройства стоит добавить, мы не только мониторим загруженность, но и следим, чтобы не было перекоса. К примеру, у нас технически много Android 10, но пользователям нужно только два таких устройства на ферме, и на них постоянно очередь. Мы стремимся, чтобы распределение устройств на ферме соответствовало популярности ОС в реальной жизни. Плюс отслеживаем новинки рынка и разные события, вроде выхода нового девпревью Android или раскатки oneui на Samsung. Это повод добавить такие устройства в ферму или обновить существующие. А некоторые устройства коллеги могут попросить добавить в явном виде.

Популярные устройства мы стараемся размещать на разных полках, чтобы распределить нагрузку между разными нодами. Теоретически производительности Raspberry Pi хватает для полной загрузки полки, но в этом случае могут проявиться проблемы с передачей видеопотока из-за возможного перегрева ЦПУ. Так что мы стараемся перераспределять нагрузку.

image

image

Параллельно мы ведем графики и таблицы по проблемным устройствам.

К примеру, мы смотрим график зарядки. Если устройство начинает постоянно садиться даже в режиме stand by (то есть его график зарядки напоминает пилу), значит его необходимо проверить.

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

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

Поддержка


В общей сложности поддержкой фермы — осмотрами, удалением и добавлением устройств — занимается несколько человек, заинтересованных в этой идее. По уровню трудозатрат это максимум один человеко-день в неделю. В целом это не доставляет много проблем. Разве что для обслуживания одиннадцати Raspberry Pi приходится держать запас кулеров, смазки, кабелей, SD-карт и т. п. А еще 3-4 раза в год надо пересобирать OpenSTF (по мере накопления обновлений в репозитории).

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

iOS


До недавнего времени через OpenSTF у нас были подключены только устройства на Android. У iOS есть проблемы с агентом на телефоне — устройство периодически отваливается от фермы. Сейчас мы пытаемся обойти эту проблему, поэтому запустили пилот на полукастомном сочетании OpenSTF и DeviceFloor. Так, несколько iPhone подключены к Mac mini. Надеемся, что теперь сможем запускать сценарии и забирать логи. Связка действительно работает, но пока не так быстро, как хотелось бы.

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

Вместо итогов


Ферма работает и активно используется. Все тесты, для которых требуются реальные устройства, мы постепенно переводим на нее. И это существенно ускоряет логистику, а вместе с тем и процессы тестирования.

И да, на пути к этой реализации фермы мы сталкивались с некоторыми неудачными решениями, которые впоследствии заменяли на более продуманные. Не стоит повторять этот путь — лучше используйте наш опыт. Или сразу приходите к нам =) 14 мая мы проведем Mobile Easy Offer — однодневный наем по fast track в команды мобильной разработки. Прочитать о нем подробнее и зарегистрироваться на участие можно по этой ссылке. До скорого!

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


  1. MedicusAmicus
    28.04.2022 15:43

    Кабели понравились. Модель не подскажете?


  1. qeeeeeeeeeeeeeeeeeeeeeeee
    29.04.2022 10:31
    -3

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

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

    Возможно мы просто не сталкивались с таким парком как у вас, у нас устройств 200