Калабаш-андроид внутри Трэвиса

android continuous-integration travis-ci calabash-android

380 просмотра

1 ответ

38 Репутация автора

Я пытаюсь заставить работать калебас-андроид внутри Трэвиса. Calabash-Android прекрасно работает на моей машине без каких-либо проблем. У меня есть следующий travis.yml:

    language: android
jdk: oraclejdk8
before_cache:
  - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
cache:
  directories:
    - $HOME/.gradle/caches/
    - $HOME/.gradle/wrapper/
    - $HOME/.gradle/daemon
    - $HOME/.gradle/native
env:
  global:
    # wait up to 10 minutes for adb to connect to emulator
    - ADB_INSTALL_TIMEOUT=20
    - SLAVE_AAPT_TIMEOUT=40

android:
  components:
    - platform-tools
    - tools
    - build-tools-23.0.3
    - android-23
    - extra-android-support
    - extra-android-m2repository
    - extra-google-m2repository
    - sys-img-armeabi-v7a-android-23

before_install:
  # install ruby 2.0.0
  - rvm install 2.0.0
  # install calabash-android
  - gem install calabash-android

before_script:
  - echo no | android create avd --force --name test --target android-23 --abi armeabi-v7a
  - emulator -avd test -no-skin -no-audio -no-window -no-boot-anim &
  - android-wait-for-emulator
  - adb shell settings put global window_animation_scale 0 &
  - adb shell settings put global transition_animation_scale 0 &
  - adb shell settings put global animator_duration_scale 0 &
  - adb shell input keyevent 82 & #for unlocking as "powerkey"
  - sleep 3 # give screen some time to become unlocked
  - ./gradlew clean assembleDebug -PdisablePreDex --continue --stacktrace

script:
  - calabash-android resign /home/travis/build/app/build/outputs/apk/app-debug.apk
  - calabash-android run /home/travis/build/app/build/outputs/apk/app-debug.apk

Он работает с 1-м сценарием функции, а затем, как только он запускает 2-й сценарий, он показывает эту ошибку:

App did not start (RuntimeError)
 ./features/support/app_life_cycle_hooks.rb:5:in `Before'

Есть идеи? или предложение?

Автор: Kordova Источник Размещён: 18.07.2016 09:38

Ответы (1)


0 плюса

6833 Репутация автора

-no-boot-animОпция удаления , android-wait-for-emulatorскрипт зависит от загрузочной анимации, чтобы определить, когда эмулятор готов.

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

Второй шаг - дождаться полной загрузки эмулятора, чтобы его можно было использовать для запуска некоторого кода. Это оказалось самой сложной частью. Особенно для эмуляторов с API Level 11+ (11-14 на момент написания).

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

Следующее состояние устройства переходит в состояние «устройство». Это когда устройство загружается. После загрузки устройство переходит в состояние «онлайн». Это когда система начинает загрузку и начинается нормальная работа эмулятора.

С того момента, как устройство переходит в состояние «устройство», оболочка adb может использоваться для выполнения различных команд на устройстве и запроса некоторой полезной информации о его состоянии.

Я нашел несколько свойств, которые нужно отслеживать, чтобы надежно определить, когда устройство готово. Первое свойство называется dev.bootcompleted. Как только устройство завершит загрузку, это свойство будет установлено в 1.

После того, как dev.bootcompleted равен 1, следует отслеживать следующее свойство sys.boot_completed. Он будет установлен в 1, как только система завершит загрузку (обычно это происходит при отправке широковещательной рассылки BOOT_COMPLETED). Это свойство устанавливается только на эмуляторах с API уровня 9 или выше. На 8 и ниже это свойство никогда не используется (и не должно отслеживаться).

Но эмулятор все еще не готов, даже когда sys.boot_completed имеет значение 1. Вы заметите, что анимация загрузки будет продолжаться в течение некоторого (значительного) периода времени. И только тогда появится интерфейс. Но, к счастью, есть способ обнаружить и это событие. Для этого нам нужно отследить значение свойства init.svc.bootanim. Это свойство сохраняет состояние службы загрузки анимации, которая будет остановлена, как только появится пользовательский интерфейс. Другими словами, как только значение init.svc.bootanim остановлено, можно с уверенностью предположить, что эмулятор запущен и готов к использованию .

Использование -no-boot-animзначения stoppedдо полной загрузки вашего эмулятора:

# Originally written by Ralf Kistner <ralf@embarkmobile.com>, but placed in the public domain

set +e

bootanim=""
failcounter=0
timeout_in_sec=360

until [[ "$bootanim" =~ "stopped" ]]; do
  bootanim=`adb -e shell getprop init.svc.bootanim 2>&1 &`
  if [[ "$bootanim" =~ "device not found" || "$bootanim" =~ "device offline"
    || "$bootanim" =~ "running" ]]; then
    let "failcounter += 1"
    echo "Waiting for emulator to start"
    if [[ $failcounter -gt timeout_in_sec ]]; then
      echo "Timeout ($timeout_in_sec seconds) reached; failed to start emulator"
      exit 1
    fi
  fi
  sleep 1
done

echo "Emulator is ready"

Теперь я сомневался из-за первого сценария работ (я никогда не использовал calabash-android), но я вижу, что это не зависит от готовности эмулятора:

calabash-android - Что делает отставка?

Отставка используется, если вам нужно подписать приложение в соответствии с вашим хранилищем ключей. Скопировано из документации GitHub https://github.com/calabash/calabash-android/wiki/Running-Calabash-Android

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

Запуски apk calabash android должны быть подписаны тем же хранилищем ключей, что и тест-сервер.

Используйте команду: calabash-android resign <apk>чтобы оставить заявку.

Сборка тестового сервера с использованием сборки calabash-android создаст тестовый сервер и подпишет его тем же ключом, что и тестируемое приложение.

Второй сценарий делает это:

Бегущий тест

Чтобы запустить тест: calabash-android run <apk>

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

Возможно, существуют другие проблемы в этом случае, но эта проблема устранена при удалении -no-boot-anim.

Автор: albodelu Размещён: 15.08.2016 03:36
Вопросы из категории :
32x32