Calabash-android:附加到 运行 应用

Calabash-android: attach to running app

我已将 calabash-android 设置为在默认情况下完美运行(使用 cucumber 到 运行 测试或 calabash-android console 进入 REPL 模式)。

但是,在某些情况下,事实证明能够附加到已经 运行ning 的应用非常有用。例如,我会在调试模式下启动一个应用程序并启动测试以便能够设置断点并检查为什么某些功能在我的场景中无法按预期工作。

当谈到 iOS 上的 Calabash 时,这项任务非常简单:不需要额外的准备,因为应用程序从捆绑的测试服务器开始,我可以随时将 calabash 附加到它。但是,Calabash Android 似乎每次我尝试启动带有应用程序 运行ning 的 calabash 时强制退出该应用程序。

有什么解决办法吗?

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

  1. 在调试模式下启动应用程序(例如,使用 Xamarin)
  2. 开始calabash-android console PATH_TO_APK
  3. 尝试发出任何命令(例如 query("*"))——失败并显示消息 KeepAliveDisconnected
  4. 尝试 运行ning start_test_server_in_background – 应用程序被杀死并且调试会话被终止

深入了解细节后,我发现 start_test_server_in_background 实际上是 运行 的 shell am instrument,其中 sh.calaba.instrumentationbackend.CalabashInstrumentationTestRunner 是检测后端,还有一堆描述哪个应用程序的其他标志仪器,使用什么端口等

因此,以下内容会有很大帮助:是否可以将 shell 仪器连接到 运行ning 应用程序

问得好,简单的答案是:

No

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

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

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

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

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

当您在同一端口上启动新服务器时,

Calabash-Android 会停止任何测试服务器和正在测试的应用程序。

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

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

我刚刚成功完成了。没什么大不了的-我只是在失败时用 'After' 挂钩暂停了 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,点击工具栏中正常调试图标右侧的 'Attach debugger to Android process' 按钮,点击“无法连接到 adb”弹出窗口告诉它再试一次(我自己没有 killing/restarting adb),单击它提供给我的过程,然后......它连接愉快。我成功地设置了断点并命中了它,前后都在控制台中执行了query("*")。

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

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

也许如果您创建一个 'And Cucumber waits for a keypress' 等待您敲击主机键盘的步骤,那么您可以将 Android Studio 附加到 phone 的进程并设置您的恢复前的断点。显然 - 断点会打乱脚本中的任何时间。