Обходимо обмеження в Calabash-Android з UIAutomator

enter image description here
Appium і Calabash — одні з найпопулярніших фреймворків для автоматизації тестування Android-додатків. У кожного, звичайно, є свої переваги і недоліки. Їх основні обмеження:
  • Calabash: може управляти тільки користувальницьким інтерфейсом, який є частиною тестового програми, зокрема, немає підтримки тестування повідомлень;
  • Appium: не може викликати backdoor-методы в додатках зразок Calabash (ці методи дуже корисні для налаштування стану досліджуваного додатки).
Ми в Badoo користувалися Calabash для автоматизації тестування, коли Appium тільки починав розвиватися. Це дуже стабільний інструмент, і він досі працює швидше Appium, так що ми не збираємося мігрувати. Але щоб автоматизувати таке багатофункціональне додаток, як Badoo, нам довелося обійти обмеження Calabash на роботу тільки з інтерфейсом тестового додатку.
Коли ми прийшли до такого рішення. І хоча воно ще працює, його надійність знижується із-за безлічі варіацій пристроїв з різною діагоналлю, різними версіями Android і так далі.
У цій статті я розповім, як ми вирішили проблему з допомогою додавання в Calabash підтримки UIAutomator2. Якщо ви занадто нетерплячі, то скажу по секрету, що в кінці є посилання на готовий до використання Ruby Gem.
Усвідомлення проблеми
Давайте подивимося на високорівневу архітектуру Calabash-Android:
enter image description here
Calabash-Android-Server використовує фреймворк Robotium, який в свою чергу для управління додатком використовує Android-фреймворк Instrumentation. Instrumentation дає Robotium (а отже, і Calabash) доступ до середовища виконання, що дозволяє тому управляти інтерфейсом програми та здійснювати виклик методів ззовні.
Але це також означає, що Robotium може керувати лише користувальницьким інтерфейсом, що є частиною коду програми. У Appium немає такого обмеження, оскільки він використовує UIAutomator.
Вирішення проблеми
Фреймворк Google Instrumentation є частиною допоміжною Android-бібліотеки для тестування. Він працює в контексті програми, показує всі взаємодії системи з додатком і, отже, може керувати ними. На базі Instrumentation побудовані такі популярні фреймворки для тестування, як Robotium і Espresso.
Крім того, Robotium використовується в серверній частині Calabash-Android і тому має доступ до інформації Instrumentation. Також частиною Instrumentation в свій час став UIAutomator 2.0, що дає можливість його використання всередині сервера Calabash-Android.
З допомогою CalabashInstrumentationTestRunner Ruby-клієнт Calabash запускає Instrumentation через ADB. У сервері Calabash CalabashInstrumentationTestRunner є розширенням Android-класу Instrumentation. Це об'єкт Instrumentation, що передається в Robotium Solo. Завдяки UIAutomator 2, він може бути використаний для створення нового об'єкта UIDevice, який здатний керувати всім пристроєм.
enter image description here
Ось як я прийшов до вирішення проблеми:
1) Додав бібліотеку UIAutomator в сервер Calabash-Android
Я клонував проект Сalabash-Android-Server і додав JAR uiautomator2 в папку lib.
2) Инстанцировал об'єкт UIDevice
У файлі
InstrumentationBackend.java
я створив метод для инстанцирования об'єкта UIDevice з UIAutomator.
public static UiDevice getUiDevice() {
if (instrumentation.getUiAutomation() == null) {
throw new NullPointerException("uiAutomation==null: did you forget to set '-w' flag for 'am instrument'?");
}
if(uiDevice == null) {
uiDevice = UiDevice.getInstance(instrumentation);
}
return uiDevice;
}

3) Додав нову команду за допомогою API UIAutomator2
Зовсім нескладно додати в Calabash-Android-Server нову команду. Всі команди, які ви використовуєте в коді Ruby, мапятся в інтерфейс Actions:
sh.calaba.instrumentationbackend.actions

Давайте реалізуємо дію для відкриття панелі повідомлень:
public class PullNotification implements Action {
@Override
public Result execute(String... args) {
InstrumentationBackend.getUiDevice().openNotification();
return new Result(true);
}

@Override
public String key() {
return "pull_notification";
}
}

У цьому прикладі метод key() використаний для найменування команди, яка буде використовуватися Ruby-клієнтом Calabash. При виклику цієї команди клієнтом вона запускає метод execute().
4) Запустив вимірювання (Instrumentation) із прапором-w
Клонував Ruby-клієнт з https://github.com/calabash/calabash-android. Пропатчити
lib/calabash-android/operations.rb
і додав прапор -w в запуск вимірювання з використанням команди АБР. Як це зробити, переглянути в цьому коммите.
Вищеописані приклади можна подивитися в моєму форке:
Працює приклад:
Давайте подивимося, як можна витягти з панелі сповіщень і відкрити одну з них.
  • Клонуйте обидва репозиторію з вищезазначеного форк в каталог того ж рівня.
    git clone
    https://github.com/rajdeepv/calabash-android
    git clone
    https://github.com/rajdeepv/calabash-android-server
  • В обох репозиторіях перейдіть на гілку
    'uiautomator'
    .
  • Перейдіть в папку ruby-gem в репозиторії calabash-android і зберіть Ruby Gem допомогою команди
    bundle exec rake build
    .
  • Увімкніть цей Gem у свій проект.
  • Змінити
    start_test_server_in_background
    на
    start_test_server_in_background(with_uiautomator: true)
    .
  • Команда витягування панелі сповіщень:
    perform_action('pull_notification')
    .
  • Щоб «зачепити» нотифікації з відомим фрагментом тексту, використовуйте
    perform_action('uiautomator_touch_partial_text', 'my partial text')
Готовий до використання Ruby Gem:
Якщо не хочете все це робити, можете завантажити готовий gem і просто слідувати трьом останнім пунктів.
Висновок
Мені було потрібно прикласти деякі зусилля, щоб заглибитися в код Calabash-Android-Server, зрозуміти, як він працює, і дослідити можливість вирішення проблеми. З першої спроби це зробити не вдалося, але в процесі роботи я дізнався деякі секрети Instrumentation. Коли-небудь я поділюся ними з вами.
Хоча цей приклад присвячений автоматизації push-повідомлень з допомогою Calabash, той же підхід можна застосувати до будь-якої задачі, з якою ви зіткнетеся в автоматизаційних фреймворках на базі Calabash:
  • тестування віджетів вашого програми для домашнього екрану;
  • обробка намірів (Intent) з допомогою діалогових блоків Complete action using в Android-додатках;
  • тестування взаємодії зі сторонніми додатками, запущеними з вашого застосування.
Сподіваюся, цей пост допоможе вам у тестуванні ситуацій, що виходять за рамки роботи з інтерфейсом вашого додатку, за допомогою Calabash. Якщо у вас є питання або будь-яка інша зворотній зв'язок — ласкаво просимо в коментарі.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.