Calabash-android: подключиться к работающему приложению

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

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

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

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

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

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

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

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


person Anton    schedule 15.06.2015    source источник
comment
Calabash должен запустить приложение с помощью команды инструментария, чтобы его сервер работал с привилегиями, которые позволяют ему запрашивать и контролировать приложение. stackoverflow.com/questions/10942049/ предлагает добавить -e 'debug true' к инструментальной команде Calabash, а затем использовать кнопку "присоединить к запущенному процессу" (чтобы сторона значка отладки в Android Studio) Убедитесь, что манифест вашего приложения доступен для отладки.   -  person android.weasel    schedule 23.07.2015


Ответы (3)


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

No

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

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

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

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

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

person bunbun    schedule 22.06.2015
comment
Звучит разумно, но как тогда работает отладка модульных тестов? На самом деле они используют тот же инструментарий запуска, что и Calabash, но мы определенно можем отлаживать приложение, когда оно проходит модульные тесты. Есть предположения? - person Anton; 22.06.2015

Я только что успешно сделал это. В этом не было ничего особенного — я просто приостановил тесты Calabash в точке отказа с помощью хука «После», который приостанавливает 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 ^ H.

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

person android.weasel    schedule 04.08.2015

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

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

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

person Tobias    schedule 22.06.2015
comment
Как я уже упоминал, это нормально на iOS, но на Android, похоже, не работает — обратите внимание, что я хотел бы ПРИСОЕДИНИТЬСЯ к приложению, которое уже работает, поскольку я хочу отлаживать приложение, а не тесты. А поскольку приложение было запущено кем-то другим, TestInstrumentation не запускается, и поэтому консоль не может подключиться к приложению. - person Anton; 23.06.2015
comment
Хорошо, как сказал @bernlim, Calabash-Android в настоящее время не поддерживает присоединение к приложению, которое не было запущено инфраструктурой Calabash. Каков вариант использования и что вы пытаетесь решить? - person Tobias; 23.06.2015
comment
На самом деле все просто: я хочу отлаживать тесты. Скажем, я замечаю сбой сценария и хочу отлаживать приложение по мере его выполнения — это, по-видимому, экономит время, поскольку некоторые сценарии могут быть довольно сложными и включать начальные данные, предварительно настроенные на сервере, что означает воспроизведение выпуск вручную немного болезненный - person Anton; 23.06.2015