具有代码覆盖率的 UIAutomation
Posted
技术标签:
【中文标题】具有代码覆盖率的 UIAutomation【英文标题】:UIAutomation with code coverage 【发布时间】:2012-11-19 12:20:29 【问题描述】:我目前正在 jenkins 上自动化我们的 ios 测试。到目前为止,我在运行单元测试、将 OCUnit 转换为 JUnit 以及以 Cobertura 格式生成代码覆盖率方面没有遇到任何问题(很多谷歌搜索,但没有遇到困难)。
但是,在创建 UIAutomation 作业时,我被卡住了。测试运行成功(从命令行调用instruments
)。生成 junit 报告很棘手,但可能。
问题是在运行 UIAutomation 时,没有生成代码覆盖文件。
是否有可能生成它们?如果不是,您能解释一下原因吗?
到目前为止我尝试了什么:
-
将 UIAutomation 附加到 iOS 模拟器上已运行的应用程序。
这似乎是不可能的。正在运行的应用程序被工具杀死并重新启动新实例或打印出神秘的错误消息。
使用 osascript 和
UIAHost. performTaskWithPathArgumentsTimeout
的组合在 js 脚本末尾退出模拟器。
应用程序正常结束,但未生成覆盖范围。
编辑
在使用不同的框架进行一些测试后,我意识到退出模拟器是不够的,您必须从应用程序中显式调用 exit()
。使用 UI 自动化这有点棘手,但您可以声明一个应用程序方案,例如my-app://exit
并使用 UIAHost.performTaskWithPathArgumentsTimeout
通过 MobileSafari 调用它。将检查这是否足以生成文件。
【问题讨论】:
嗨,我知道这可能不是答案:你也可以试试testingwithfrank.com 我测试了我的应用程序的 UI 到 80%。它也很容易阅读,因为它使用了黄瓜 @VinhTran 好吧,我可以使用许多不同的框架,包括 OCUnit,但我们选择了 UIAutomation,并且我们已经编写了很多测试。 @VinhTran 最后,我已经开始将测试重写给 Frank。它进展缓慢,因为我不是一个 ruby 人,但最大的优点是框架是开放的。我已经修复了一些错误,我可以轻松检查为什么测试不起作用。 Jenkins 集成更容易,CC 生成工作没有问题。 我很高兴听到它可以帮助您。真正的劣势只在一开始就可见。但以后好处会很明显。 @VinhTran 测试组织立即变得更好(在调试时标记场景/功能的可能性非常好,例如“@record”标记来录制视频)。此外,直接调用 obj-c 方法的可能性有助于我测试我无法使用 UI 自动化测试的东西。到目前为止,最大的问题是 Frank 中的偶尔出现的错误 - 然而,它是开源的,我的一些修复已经合并 :) 【参考方案1】:按照这些步骤,我能够从 UI 自动化生成代码覆盖率文件,并通过 cobertura Jenkins 插件显示信息。
首先将“Generate Test Coverage Files”和“Instrument Program Flow”构建设置设置为Yes。这将在您每次在模拟器中运行应用程序并退出应用程序时生成代码覆盖率文件。在 Info.plist 文件中添加 UIApplicationExitsOnSuspend 并将此选项设置为“YES”。运行 UI 自动化测试,最后您可以通过手动按下模拟器中的 HOME 按钮或使用 UIATarget.localTarget().deactivateAppForDuration() 方法退出应用程序。请注意,如果您的应用有任何依赖 deactivateAppForDuration() 方法的 UI 自动化测试,则测试将在运行该命令时终止。
获得 gcda 文件后,您可以通过下载 gcovr (https://software.sandia.gov/trac/fast/wiki/gcovr) 并运行命令来生成 cobertura xml 文件
gcovr -r your_root_directory --object-directory path_to_gcda_files --xml > coverage.xml
您可以设置 Jenkins cobertura 插件以根据需要显示信息。
来源:http://blog.octo.com/en/jenkins-quality-dashboard-ios-development/#step2-2
【讨论】:
是的,这证实了我问题末尾的建议确实有效。 @Sulthan 没有明白您的意思。您还可以判断上面的链接是否有效 - UIAutomation + 代码覆盖率?【参考方案2】:据我了解,应用退出时会生成代码覆盖率文件,但您不能只杀死模拟器。
您是否尝试为您的应用创建一个单独的目标,将 info.plist 属性“UIApplicationExitsOnSuspend”设置为 true?
不过,还有一个更广泛的问题。生成的覆盖文件不是累积的,每次应用程序退出时都会被覆盖。因此,根据您的测试的结构(即您是否为每个不同的测试杀死并启动应用程序),您可能很难获得良好的代码覆盖率。
【讨论】:
我不是killing
模拟器。我尝试使用退出模拟器的osascript
- 这是非常不同的。 UIApplicationExitsOnSuspend
不是一个好的解决方案,因为 suspend
事件(将应用程序发送到后台)是一个有效的用例,不应结束应用程序。不过,我确实试过了。此外,代码覆盖率文件的覆盖是预期的,不是问题。
我明白了,但代码覆盖率只写在应用程序退出时,所以听起来你被卡住了(直到苹果改进这个)。
我认为问题不是由应用退出引起的。我能够使应用程序正常退出。我相信问题是由应用程序启动的方式引起的,而不是退出。不幸的是,我无法控制仪器如何启动它。以上是关于具有代码覆盖率的 UIAutomation的主要内容,如果未能解决你的问题,请参考以下文章
使用具有多个目标的 CodeCoverage.cmake 进行代码覆盖率分析
KarmaJS 中的代码覆盖率过高,具有 karma-coverage 和 Jasmine