Автоматизированнное тестирование apk без доступа к исходному коду

Доброго времени суток.
Ранее писал автотесты Selenium WebDriver под Web.
Сейчас в связи со сменой работы была поставлена следующая задача:
Необходимо написать автоматизированные тесты для тестирования apk под android.

Задача казалось бы тривиальна, но есть ряд ограничений:

  1. Нет исходного кода, то есть есть только apk файл
  2. Само приложение написано на Uniti3D, то есть определение идентификаторов невозможно, только картинки фактически.

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

  • как определять успешность теста, если доступен только функционал клика по координатам?
  • реально ли из Robotium поднять приложение, учитывая что у меня нет исходников?

Так же смотрел в сторону такого инструмента как Sikuli (пробовал в свое время для Web’а, не с целью решения реальной задачи, а с целью получения практического опыта)
Тут вопрос определения успешности теста отпадает, но вопрос запуска приложения по прежнему актуален.

В связи с чем прошу подсказать:
Реально ли протестировать apk не имея исходного кода?
Какой инструмент выбрать? Учитывая, что потенциально доступен только функционал клика по координатам (приложение на uniti3d)
Если смотреть в сторону Sikuli - каким образом можно из сикули поднять приложение?

Похоже, для этой задачи идеально подходит Appium. Он как раз умеет запустить apk на эмуляторе и прогнать на нём все тесты с помощью интерфейса WebDriver.

Например:

AppiumDriver driver = new AppiumDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);

WebElement el = driver.findElement(By.name("Add Contact"));
    el.click();
    List<WebElement> textFieldsList = driver.findElementsByClassName("android.widget.EditText");
    textFieldsList.get(0).sendKeys("Some Name");
    textFieldsList.get(2).sendKeys("Some@example.com");
    driver.swipe(100, 500, 100, 100, 2);
    driver.findElementByName("Save").click();
2 лайка

Я не тестировал приложения Unity, но по вашему описанию, вот как себе это представляю:

  1. Вы ставите VNC сервер и получаете картинку телефона у себя на рабочей машине
  2. При помощи Sikuli пишете скрипт автоматизации действий на десктопе, для VNC Viewer’а

Я таким образом накручивал себе Goldball’ы для игры Homerun battle :wink: Принцип накрутки заключался в открытии рекламных ссылок, которых в день давалось 20 :wink:

Это не самый стабильный путь. Поэтому, вначале убедитесь, что действительно никак кроме image-based автоматизации то что вам необходимо не сделать.

У сикули есть льтернативы, такие как eggPlant и Ranorex.

У VNC тоже есть альтернативы, такие как TeamViewer

2 лайка

Доброго времени суток.


Т.к. у вас есть Selenium-опыт, то наиболее просты в освоении будут:

Им не нужен исходный код приложения и они предоставляют возможность писать тесты под мобильные платформы на WebDriver API, поддерживают достаточное количество современных языков.

Лучше посмотреть в сторону Appium, т.к. он интенсивнее развивается и также включает в себя Selendroid (как один из альтернативных компонентов).

Кроме того, для тестирования Android популярны uiautomator (входит в Android SDK), Robotium, calabash, Espresso, MonkeyTalk. Из них только MonkeyTalk нужен исходный код приложения, всем остальным достаточно APK-файла.


Все перечисленные инструменты фактически распознают на экране те же самые элементы.



Рекомендую запустить uiautomatorviewer из Android SDK — и им захватить экран приложения. Если он распознаёт все нужные элементы, имеет смысл использовать Appium или подобный инструмент. А если нет — тогда смотреть в сторону Sikuli или ему подобных.



C Sikuli-подобным решением:
— чуть поразвлекаетесь, если нужно тестировать на реальных устройствах, но это реально
— сложнее организовать тестирование в параллель

4 лайка

Если использовать Sikuli или что-то вроде, то устанавливать и запускать приложение — через adb (утилита из Android SDK).

Пример:

adb install -r path_to/file.apk                               # установка
adb shell am start app.package/app.activity.MainActivity      # запуск

А если хотите динамически получать package и activity из apk-файла, то так (Unix-решение):

APP_PATH="path_to/file.apk"
adb install -r $APP_PATH

AAPT=`ls $ANDROID_HOME/build-tools/*/aapt | head -1`
MF_DUMP=`$AAPT dump badging $APP_PATH`
APP_PKG=`echo $MF_DUMP | grep -o "package: name='[^']*" | awk -F "='" '{print $2}'`
APP_ACT=`echo $MF_DUMP | grep -o "activity: name='[^']*" | awk -F "='" '{print $2}'`

adb shell am start $APP_PKG/$APP_ACT

То есть нужно сначала выполнить sh-скрипт (как precondition, в каком-нибудь Before), а потом уже выполнять непосредственно Sikuli-тест.

3 лайка

@Mr_Nehoch отпишитесь пожалуйста в эту тему, помогли ли вам советы, после того как вы решите вашу проблему. После решения, поделитесь пожалуйста тем путем, который вы выбрали.

Вот еще видео по тестированию Unity3d игрушек, но тут нужен доступ к коду… и не знаю ли оно вообще к Android подходит :slight_smile:

1 лайк

Благодарю всех за ответы, в ближайшее время еще раз посмотрю в сторону Appium.
@asolntsev , @anym0us,
Честно говоря, почему-то исходил из того что Appium заточен больше под IOS, нежели под Android, и написание тестов на нем удобнее всего вести под Macom, и что в Windows Appium сильно порезан. Поэтому почти сразу его отбросил. Наверно стоит вернуться к этому инструменту и еще раз попробовать оценить его для решения данной задачи.

Сегодня попытался все таки довести дело с Robotium’ом до какой-то логической точки - удалось запустить приложение без исходника и покликать по координатам. (Спасибо @anym0us за помощь в получении package и activity из apk-файла. Его пост очень помог) Попытался соединить Robotium и Sikuli (роботиум кликает, сикули анализирует), однако пока никакого конечно результата получить не удалось.

@dzhariy , О результатах обязательно отпишусь. И спасибо за видео)

2 лайка

В соседней теме упомянули fMBT. Недавно появился.

Можете на него тоже посмотреть, как на альтернативу Sikuli.

1 лайк

Не очень понимаю завязок на исходники. В большинстве случаев при тестировании исходники недоступны. :smile: (естественно речь идёт о нормальных - не web приложениях).