13

我已将 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 - 应用程序被终止并且调试会话被终止

深入研究细节后,我发现 start_test_server_in_background 实际上是作为检测后端运行shell am instrument的,sh.calaba.instrumentationbackend.CalabashInstrumentationTestRunner还有一堆其他标志描述了要检测的应用程序、要使用的端口等。

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

4

3 回答 3

2

我刚刚成功地做到了。没什么——我只是在失败点暂停了 Calabash 测试,并使用了一个暂停 Ruby 的“After”钩子(实际上,它使用 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),单击它提供给我的进程,然后......它连接愉快。我成功地设置了一个断点并命中它,并在前后都在控制台中执行了 query("*") 。

我不必更改 Calabash 仪器命令来添加 -e 'debug true' 或任何东西。

唯一出错的是Android Studio在我关闭它时取出了adb服务器,但我认为这是一个已知的错误^H^H^H功能。

也许如果您创建一个“And Cucumber 等待按键”步骤来等待您敲击主机的键盘,那么您可以将 Android Studio 附加到手机的进程并在恢复之前设置断点。显然——断点会打乱脚本中的任何时间。

于 2015-08-04T08:37:18.087 回答
1

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

至少不在 Android 上(我无法证明 iOS)。为什么?Calabash 必须先在要运行的应用程序上建立挂钩,然后才能在应用程序上运行任何测试。这是由于有关 Android 堆栈的多种原因造成的。

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

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

您可以做的最好的事情是在不重新安装应用程序的情况下为应用程序启动 Calabash,但这是 Android 允许您做的最多的事情。

最后,如果这个答案没有深入研究非常技术性的细节,我深表歉意,这些是在我遇到类似问题时在特定的 Hackathon 期间给我的答案。

于 2015-06-22T06:58:07.297 回答
0

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

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

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

于 2015-06-22T20:02:12.257 回答