Calabash-android:附加到正在运行的应用程序

时间:2015-06-15 08:54:28

标签: android cucumber calabash calabash-android android-instrumentation

我让calabash-android设置与默认方案完美配合(使用cucumber运行测试或calabash-android console进入REPL模式)。

但是,在某些情况下,能够附加到已经运行的应用程序非常有用。例如,我将在调试模式下启动应用程序并启动测试以便能够设置断点并检查为什么某些功能在我的方案中不能按预期工作。

说到iOS上的Calabash,这项任务非常简单:当应用程序以捆绑的测试服务器启动时,无需额外准备,我可以随时附加葫芦。但是,每当我尝试启动运行应用程序的calabash时,Calabash Android似乎都会强制退出应用程序。

周围有什么办法吗?

修改 看起来下面的答案没什么帮助,但我仍然希望有人(葫芦开发者,你在哪里?)会偶然发现这一天。我花了一些时间自己发现问题,具体问题是:

  1. 以调试模式启动应用程序(例如,使用Xamarin)
  2. 开始calabash-android console PATH_TO_APK
  3. 尝试发出任何命令(例如query("*")) - 它失败并显示KeepAliveDisconnected消息
  4. 尝试运行start_test_server_in_background - 应用程序被终止并且调试会话终止
  5. 深入研究细节,我发现start_test_server_in_background实际上运行shell am instrument,其中sh.calaba.instrumentationbackend.CalabashInstrumentationTestRunner是检测后端,还有一堆其他标志,用于描述要检测的应用程序,使用的端口等。

    如上所述,以下内容会有很大帮助: shell am instrument是否可以附加到正在运行的应用程序

3 个答案:

答案 0 :(得分: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连接到手机的进程并在恢复之前设置断点。显然, - 断点会破坏脚本中的任何时间。

答案 1 :(得分:1)

很好的问题,简单的答案是:

  

没有

至少不在Android上(我无法证明iOS)。为什么?在您可以在应用程序上运行任何测试之前,Calabash必须在您要运行的应用程序上建立挂钩。这是由于Android堆栈的各种原因造成的。

第一个原因是安全。 Android会根据为其设置的权限在安装阶段锁定应用程序。由于这种设计,Calabash(或任何其他应用程序进程干扰脚本)将无法在应用程序进程中执行。正如您所知,您仍然可以在应用程序启动时运行Calabash测试,因为Android将为此目的验证Calabash。

第二个原因是建筑。 Android被设计为进程和视图的层。您要做的事情可能会干扰多个级别的多个流程。

你能做的最好的事情就是在没有重新安装的情况下启动Calabash for app,但这是Android允许你做的最多。

最后,如果这个答案没有深入研究技术细节,我很抱歉,这些是我在特定黑客马拉松期间给出的答案,因为我在类似的问题上挣扎。

答案 2 :(得分:0)

当您在同一端口上启动新服务器时,Calabash-Android会停止所有测试服务器和正在测试的应用程序。

如果您希望将控制台附加到正在运行的测试中,只需打开控制台(bundle exec calabash console ..)并发出手势和查询,而无需使用start_test_server_in_background启动应用。常见的模式是使用gem pry,方法binding.pry暂停测试,然后启动控制台。

请注意,当黄瓜场景失败或结束时,生成的Calabash-Android黄瓜骨架将自动运行shutdown_test_server。您可以删除该呼叫并附加控制台。