Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CodeFest 2017, Игорь Павлов и Глеб Головин (2ГИ...

CodeFest
January 29, 2018

CodeFest 2017, Игорь Павлов и Глеб Головин (2ГИС), Как мы ферму для тестирования под Android построили

https://2017.codefest.ru/lecture/1193

У 2ГИС есть нативное приложение под Android и 2ГИС Онлайн для мобильных браузеров, а также другие приложения для данной ОС. При их тестировании возникают следующие проблемы:

Эти продукты тестируются как вручную, так и автоматизировано, при этом в день запускается более чем 10000 различных автотестов. Некоторые падения требуют ручного воспроизведения.

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

Нам необходимо было обеспечить возможность для тестирования на разных уровнях: от unit-тестирования до тестов, работающих через ui.

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

Узнайте как мы решили эти проблемы построив ферму реальных и виртуальных устройств с удобным и единым для всех сценариев тестирования доступом, которым хотим поделиться

CodeFest

January 29, 2018
Tweet

More Decks by CodeFest

Other Decks in Technology

Transcript

  1. Про тесты 1. 2ГИС android a. qmlunittests b. 500 e2e

    тестов за 2 часа c. на MR 7 сценарных тестов за 6 минут, ~9 запусков в час d. тесты производительности 2. 2ГИС online mobile a. на каждый пуш 20 сценарных тестов за 4 минуты, ~14 в час b. тесты производительности
  2. Про ферму 1. Ферма: a. 11 реальных девайсов b. 17

    эмуляторов 2. Легко расширяется дальше 3. Запись видео 4. Ничего не нужно менять в тестах, все работает через adb
  3. Проблемы 1. Отчеты, по которым понятно в чем проблема, либо

    можно воспроизвести ее 2. Стабильность 3. Восстановление работоспособности системы 4. Параллельность тестов 5. Стабильность замеров производительности
  4. Мало девайсов У нас есть: • 2 девайса • ручное

    тестирование, unit тесты, e2e тесты Нужно: 1. Увеличить покрытие девайсов
  5. Несколько девайсов У нас есть: • 10 девайсов • ручное

    тестирование, unit тесты, e2e тесты Проблемы: 1. Очень много ручного труда по переподключению, прогону и т.д. Нужно: 1. Подключить девайсы к компу и чтобы тесты сами периодически запускались
  6. Периодические запуски тестов Проблемы: 1. Тесты периодически падают 2. Часть

    тестов не воспроизводят проблемы при повторном запуске 3. Остальные тесты требуют много времени на разбор падений
  7. Периодические запуски тестов Изменилось: 1. Постоянство подключения девайса 2. Убрали

    девайсы от себя – не видим экран во время прогона тестов 3. Появилась неочевидная конкуренция за девайсы 4. *А как теперь вручную тестировать?
  8. Периодические запуски тестов Нужно: 1. Контролировать конкуренцию за девайсы 2.

    Отлаживать тесты и видеть что происходит на экране (видеть экран) 3. Не забирать девайс из фермы для ручного тестирования (видеть и тыкать) 4. Иметь всю необходимую информацию для воспроизведения или разбора по результатам прогона 5. Стабильность подключения девайса
  9. Поиск готового решения Нужно: 1. Контролировать конкуренцию за девайсы 2.

    Отлаживать тесты и видеть что происходит на экране 3. Не забирать девайс из фермы для ручного тестирования Облака не подходят, потому что не дают нужный уровень доступа к девайсу
  10. Периодические запуски тестов Нужно: 1. Контролировать конкуренцию за девайсы 2.

    Отлаживать тесты и видеть что происходит на экране (видеть экран) 3. Не забирать девайс из фермы для ручного тестирования (видеть и тыкать) 4. Подключать девайсы из OpenSTF 5. Иметь всю необходимую информацию для воспроизведения или разбора по результатам прогона 6. Стабильность подключения девайса
  11. Подключение девайсов из OpenSTF Утилита stf-connect подключает устройства по заданной

    спецификации 10 любых х86 девайсов: { "group_name": "x86", "amount": "10", "specs": { "abi": "x86" } } Определенное устройство: { "group_name": "my_nexus", "amount": "1", "specs": { "serial": "<nexus_serial>" } }
  12. Правила подключения 1. Уже занятый мной девайс свободным не считается

    2. Если надо два девайса, но один занят, подключить 2ой как только он освободится
  13. Периодические запуски тестов Нужно: 1. Подключать девайсы 2. Иметь всю

    необходимую информацию для воспроизведения или разбора по результатам прогона 3. Стабильность подключения девайса
  14. Запись видео через stf Утилита stf-record через websocket получает jpeg

    кадры экрана • с android 4.0 кадры отдаются только на изменения На стороне тестов используя ffmpeg склеиваем кадры и получаем webm видео • 1 минута ~1.5 MB
  15. Периодические запуски тестов Нужно: 1. Управлять доступом к девайсам 2.

    Иметь всю необходимую информацию для воспроизведения или разбора по результатам прогона 3. Стабильность подключения девайса
  16. Стабильность сети Выход в сеть • надо использовать ethernet, не

    WiFi Пропускная способность • у нас 1 Гбит/сек, проблем не замечено
  17. Стабильность USB Проблемы: 1. Проблемы в используемом hardware для подключения

    телефонов 2. Телефон разрядился 3. Ошибки/проблемы в самих телефонах
  18. Как распознать hardware проблему ~$ cat /var/log/syslog | grep "USB

    disconnect" Mar 31 18:38:02 kernel: [4435042.287759] usb 2-1.5.3: USB disconnect, device number 115 Mar 31 18:39:28 kernel: [4435127.788020] usb 2-1.5.3: USB disconnect, device number 5 Mar 31 18:40:02 kernel: [4435161.834510] usb 2-1.5.3: USB disconnect, device number 74 Mar 31 18:40:36 kernel: [4435196.137327] usb 2-1.5.3: USB disconnect, device number 75 Mar 31 18:40:42 kernel: [4435202.281571] usb 2-1.5.3: USB disconnect, device number 99 Mar 31 18:42:17 kernel: [4435297.155140] usb 2-1.5.3: USB disconnect, device number 18
  19. USB PCI-e плата расширения ST Lab U-1010 • нет замеченных

    обрывов соединения • 4 USB порта по 480 Мбит/сек каждый • дополнительное питание от блока ST Lab U-1010 (аналог PEXUSB3S44V, рекомендация команды openstf)
  20. USB хабы Пробовали 7 портовый USB 3.0 хаб • часто

    обрывает соединение Пробовали 7 портовый USB 2.0 хаб • ненадёжная архитектура (4 порта умерли под первой же нагрузкой)
  21. USB хабы Используем 4 портовый USB 2.0 хаб • нет

    замеченных обрывов соединения • можно подключать питание
  22. Компьютер для девайсов Конфигурация: • i5 CPU 760 (Lynnfield) •

    HDD 500GB • DDR 2GB (x2) • Motherboard c одним x16 PCI-e слотом • USB PCI-e карта ST Lab U-1010 (x1) • 4 портовый USB 2.0 хаб (x4) Результат: 16 девайсов
  23. Стабильность USB Проблемы: 1. Проблемы в используемом hardware для подключения

    телефонов 2. Телефон разрядился 3. Ошибки/проблемы в самих телефонах
  24. Проблемы телефонов Проблема: 1. Так как телефоны не рассчитаны на

    постоянное использование, рано или поздно они дают сбой Нужно: 1. Восстановление работоспособности системы
  25. Nexus 5x обрывает соединение tcpdump Source Destination Protocol Length Info

    хост телефон HTTP 113 Continuation or non-HTTP traffic телефон хост TCP 54 7693 > 41764 [RST] Seq=2488805 Win=0 Len=0 хост телефон TCP 66 41764 > 7693 [FIN, ACK] Seq=580681 Ack=2488 телефон хост TCP 54 7693 > 41764 [RST] Seq=2488806 Win=0 Len=0 adb trace switch_socket_transport: 2120:4147975936 | Switch transport success WriteFdExactly: 2120:4147975936 | writex: fd=3 len=4: 30303136 0016 WriteFdExactly: 2120:4147975936 | writex: fd=3 len=22: 7368656c6c3a67657470726f7020656d shell:getprop em ReadFdExactly: 2120:4147975936 | readx: fd=3 wanted=4 ReadFdExactly: 2120:4147975936 | readx: fd=3 disconnected adb_connect: 2120:4147975936 | _adb_connect error: protocol fault (couldn't read status): Success adb_connect: 2120:4147975936 | adb_connect: return fd -1
  26. Восстанавливаем соединение Получаем физический usb путь: ~$ adb devices -l

    00ec0ea6616e95c8 device usb:7-1.3 product:bullhead model:Nexus_5X Перезагружаем usb подключение: with open("/sys/bus/usb/devices/%s/busnum" % "7-1.3", "r") as f: busnum = "%03d" % int(f.read()) with open("/sys/bus/usb/devices/%s/devnum" % "7-1.3", "r") as f: devnum = "%03d" % int(f.read()) fd = os.open("/dev/bus/usb/%s/%s" % (busnum, devnum), os.O_WRONLY) fcntl.ioctl(fd, ord('U') << (4 * 2) | 20, 0)
  27. Несколько девайсов Нужно: 1. Информацию для воспроизведения 2. Стабильность подключения

    девайса 3. Восстановление работоспособности системы 4. Запускать на MR a. Быстрая обратная связь от тестов (< 15 мин) b. Полная воспроизводимость результатов
  28. Ускорение выполнения тестов 1. Ускорение тестов 2. Параллелизация: a. все

    тесты на разные девайсы b. все тесты на одинаковые девайсы
  29. Одинаковые девайсы 1. Реальные девайсы не будем использовать потому что:

    a. ломаются b. через какое-то время нигде не купить c. устаревают Нужно: 1. Использовать эмуляторы x86 для MR
  30. Эмуляторы x86 Проблемы: 1. Приложение 2ГИС использует opengl, потому что

    карты 2. Эмуляторы не рассчитаны на постоянное использование: a. течет память у эмуляторов при использовании b. зависают
  31. Серверное решение 1. У нас не было серверов, которые используют

    GPU 2. Виртуализация GPU не помогла a. Работает медленно b. Порой приводит к падению эмулятора на старте с segfault
  32. Варианты GPU в ПК 1. Дискретная видеокарта a. Течет память

    при работе с эмуляторами b. Проблемы с драйверами 2. Процессор с графическим ядром
  33. Эмуляторы x86 Проблемы: 1. Приложение 2ГИС использует opengl, потому что

    карты 2. Эмуляторы не рассчитаны на постоянное использование: a. течет память у эмуляторов при использовании b. зависают
  34. Течет память 6 эмулятором съедают 20GB за 20 минут при

    прогоне тестов • а это 1GB в минуту Есть решение: • перезагружать!
  35. Нельзя перезагрузить Эмуляторы зависают на команду: adb reboot Но выключаются

    на команду через adb shell: am start -a android.intent.action.ACTION_REQUEST_SHUTDOWN; stop adbd
  36. Запуск эмуляторов Утилита emulator-starter запускает эмуляторы по заданной конфигурации •

    со сбросом пользовательских данных (-wipe-data) Пример конфига: { "start_interval": 5, "predefined_avd": { "gnexus1": "6654", "gnexus2": "6656" } }
  37. Используем SSD диски Запуск эмулятора в 3 раза быстрее, чем

    на HDD Для домашнего использования (Kingston SUV) • умер за 2 месяца (х2) Для компаний (Kingston SV) • один работает без сбоев больше 1.5 лет • два работают без сбоев 6 месяцев
  38. Компьютер для эмуляторов Конфигурация: • i7-6700K / HD 530 (Skylake)

    • SSD Kingston SV • DDR4 16GB Результат: 6 эмуляторов
  39. Эмуляторы x86 Проблемы: 1. Приложение 2ГИС использует opengl, потому что

    карты 2. Эмуляторы не рассчитаны на постоянное использование: a. течет память у эмуляторов при использовании b. зависают
  40. Зависание эмулятора лечится убийством Отправляем команду kill управляющей консоли эмулятора:

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("localhost", emulator_console_port)) s.sendall(b"\rkill\r") s.shutdown(socket.SHUT_WR) data = s.recv(1024)
  41. Несколько девайсов Нужно: 1. Информацию для воспроизведения 2. Стабильность подключения

    девайса 3. Восстановление работоспособности системы 4. Запускать на MR – использование эмуляторов 5. Тесты на производительность
  42. Мониторинг temp и cpu Температура, статус, состояние батарейки: ~$ adb

    shell dumpsys battery Загрузка процессора, ожидание ввода/вывода: ~$ adb shell dumpsys cpuinfo Частота ядер: ~$ adb shell cat /sys/devices/system/cpu/cpu%s/cpufreq/%s" % (cpu_number, type) Температура ядер: ~$ adb shell cat /sys/class/thermal/%s/temp % thermal_zone
  43. Итоги 1. OpenSTF 2. Клиент к OpenSTF 3. Стабильность a.

    реальные девайсы и эмуляторы 2. Восстановление работоспособности системы a. реальные девайсы и эмуляторы 3. Отчеты, по которым понятно в чем проблема, либо можно воспроизвести ее 4. Параллельность тестов 5. Стабильность замеров производительности