带代码覆盖率的UIAutomation

我目前正在jenkins上自动化我们的iOStesting。 到目前为止,我没有运行unit testing的问题,将OCUnit转换成JUnit,并生成Cobertura格式的代码覆盖(大量的search,但没有困难)。

但是,当创buildUIAutomation作业,我卡住了。 testing正在成功运行(从命令行调用instruments )。 生成junit报告是棘手的,但可能的。 问题是,运行UIAutomation时,不会生成代码覆盖率文件。

有没有可能产生它们? 如果没有,请解释为什么?

我到目前为止所尝试的是:

  1. 将UIAutomation附加到iOS模拟器上已经运行的应用程序。
    • 这似乎不可能。 正在运行的应用程序被杀死的仪器和新的实例重新启动或一个神秘的错误消息打印。
  2. 使用osascript和UIAHost. performTaskWithPathArgumentsTimeout的组合,在js脚本的结尾退出模拟器UIAHost. performTaskWithPathArgumentsTimeout UIAHost. performTaskWithPathArgumentsTimeout
    • 应用程序优雅地结束,但没有产生覆盖。

编辑使用不同的框架进行了一些testing之后,我意识到退出模拟器是不够的,你必须明确地从应用程序调用exit() 。 使用UI自动化,这是有点棘手,但你可以声明一个应用程序的scheme,例如my-app://exit并通过UIAHost.performTaskWithPathArgumentsTimeout使用UIAHost.performTaskWithPathArgumentsTimeout调用它。 将检查这是否足以生成文件。

遵循这些步骤,我能够从UI Automation生成代码覆盖率文件,并通过cobertura Jenkins插件显示信息。

首先将“生成testing覆盖率文件”和“仪器程序stream量”构build设置设置为是。 这将在您每次在模拟器中运行应用程序并退出应用程序时生成代码覆盖率文件。 在Info.plist文件中添加UIApplicationExitsOnSuspend,并将此选项设置为“YES”。 运行UI自动化testing,最后可以通过手动按下模拟器中的HOMEbutton或使用UIATarget.localTarget()。deactivateAppForDuration()方法退出应用程序。 请注意,如果您的应用程序具有任何依赖于deactivateAppForDuration()方法的UI自动化testing,则testing将在运行该命令时终止。

一旦你有了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

从我理解的代码覆盖率文件得到应用程序退出时生成,但你不能只杀死模拟器。

你有没有尝试为你的应用程序创build一个单独的目标,你有info.plist属性“UIApplicationExitsOnSuspend”设置为true?

但是,还有一个更广泛的问题。 生成的覆盖率文件不会累积,每次应用程序退出时都会被覆盖。 所以,根据你的testing结构(即你是否在为每个不同的testing而开发应用程序),你可能很难获得体面的代码覆盖率。