Подтвердить что ты не робот

Калабаш-андроид: приложение для запуска приложения

У меня есть calabash-андроид, который отлично работает со сценарием по умолчанию (используя cucumber для запуска тестов или calabash-android console для входа в режим REPL).

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

Когда дело доходит до Calabash на iOS, эта задача очень проста: никакой дополнительной подготовки не требуется, поскольку приложение начинается с подключенного тестового сервера, и я могу в любое время присоединить к нему калабаш. Тем не менее, Calabash Android, похоже, отключает приложение каждый раз, когда я пытаюсь запустить calabash с запуском приложения.

Есть ли способ обойти это?

ИЗМЕНИТЬ Похоже, что приведенные ниже ответы не помогли, но я все еще надеюсь, что кто-то (калабаш-разработчики, где ты?) Наткнется на этот день. Я потратил некоторое время на обнаружение проблемы самостоятельно, и в этом проблема:

  • Запустите приложение в режиме отладки (например, с помощью Xamarin)
  • Начать calabash-android console PATH_TO_APK
  • Попробуйте выдавать какие-либо команды (например, query("*")) - сбой сообщения с сообщением KeepAliveDisconnected
  • Попробуйте запустить start_test_server_in_background - приложение убито, а сеанс отладки завершен

Копаясь глубже в деталях, я обнаружил, что start_test_server_in_background фактически запускает shell am instrument с sh.calaba.instrumentationbackend.CalabashInstrumentationTestRunner, являющимся инструментальной базой и множеством других флагов, описывающих, какое приложение для инструмента, какой порт использовать и т.д.

Таким образом, следующее поможет много: возможно ли, чтобы инструмент shell am подключался к запущенному приложению?

4b9b3361

Ответ 1

Отличный вопрос, и простой ответ:

Нет

По крайней мере, не на Android (я не могу подтвердить iOS). Зачем? Calabash должен установить крючки в приложении, которое вы хотите запустить, прежде чем вы сможете запускать любые тесты в приложении. Это связано с рядом причин, связанных с пакетом Android.

Первая причина - безопасность. Android блокирует приложения на этапе установки на основе разрешений, установленных для него. Из-за этого дизайна Calabash (или любой другой способ вмешательства приложения script) не сможет выполнить в середине процесса приложения. Как вы выяснили, вы все еще можете запускать тесты Calabash вместе с началом приложения, так как Android будет проверять Calabash для этой цели.

Вторая причина - архитектура. Android разработан как слои процессов и представлений. То, что вы пытаетесь сделать, вероятно, будет мешать более чем одному процессу на разных уровнях.

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

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

Ответ 2

Я только что успешно это сделал. Это было не так много - я просто остановил тесты Calabash в момент неудачи с крючком "After", который останавливает Ruby (на самом деле он использует IRB, но это случайно):

After do |scenario|
  if scenario.failed? && scenario.source_tag_names.include?('@wip') && PLATFORM == ANDROID
    require 'irb'
    require 'irb/completion'
    ARGV.clear
    IRB.start
  end
end

затем запустил Android Studio, нажал кнопку "Прикрепить отладчик к процессу Android" справа от обычного значка отладки на панели инструментов, щелкнул всплывающее окно "Невозможно подключиться к adb", чтобы попросить его попробовать снова (без убийства/повторного запуска adb), нажал на процесс, который он мне предлагал, и... он подключился к счастью. Я успешно установил точку останова, ударил ее и выполнил запрос ( "*" ) в консоли до и после.

Мне не пришлось менять командную команду Calabash, чтобы добавить -e 'debug true' или что-то еще.

Единственное, что пошло не так, было то, что Android Studio достала сервер adb, когда я его закрыл, но я думаю, что известная ошибка ^ H ^ H ^ Hfeature.

Возможно, если вы создадите "И Cucumber ждет нажатия клавиши", который ждет, когда вы нажмете на клавиатуру главного компьютера, чтобы вы могли подключить Android Studio к телефонному процессу и установить точки останова перед возобновлением. Очевидно, хотя - точки останова собираются испортить любой тайм-аут в script.

Ответ 3

Calabash-Android останавливает любой тестовый сервер и тестируемое приложение при запуске нового сервера на том же порту.

Если вы хотите прикрепить консоль к текущему тесту, просто откройте консоль (bundle exec calabash console ..) и выпустите свои жесты и запросы, не запустив приложение с помощью start_test_server_in_background. Обычным примером является использование gem pry с помощью метода binding.pry для приостановки теста и запуска консоли.

Обратите внимание, что сгенерированный скелет окунь Calabash-Android будет запускать shutdown_test_server автоматически, когда сценарий огурца завершится неудачно или закончится. Вы можете удалить этот вызов и прикрепить консоль.