Ios 具有代码覆盖率的UIC自动化

Ios 具有代码覆盖率的UIC自动化,ios,ios-ui-automation,Ios,Ios Ui Automation,我目前正在jenkins上自动化我们的iOS测试。到目前为止,我在运行单元测试、将OCUnit转换为JUnit以及以Cobertura格式生成代码覆盖率方面没有遇到任何问题(谷歌搜索很多,但没有遇到任何难题) 然而,在创建UIAutomation作业时,我被卡住了。测试正在成功运行(从命令行调用instruments)。生成junit报告很棘手,但却是可能的。 问题在于,在运行UIAutomation时,不会生成代码覆盖率文件 是否有可能生成它们?如果没有,请解释一下原因 到目前为止,我尝试的是

我目前正在jenkins上自动化我们的iOS测试。到目前为止,我在运行单元测试、将OCUnit转换为JUnit以及以Cobertura格式生成代码覆盖率方面没有遇到任何问题(谷歌搜索很多,但没有遇到任何难题)

然而,在创建UIAutomation作业时,我被卡住了。测试正在成功运行(从命令行调用
instruments
)。生成junit报告很棘手,但却是可能的。 问题在于,在运行UIAutomation时,不会生成代码覆盖率文件

是否有可能生成它们?如果没有,请解释一下原因

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

  • 将UIAutomation附加到iOS模拟器上已经运行的应用程序。
    • 这似乎是不可能的。运行中的应用程序被工具杀死,重新启动一个新实例,或者打印一条神秘的错误消息
  • 在js脚本末尾使用osascript和
    UIAHost组合退出模拟器。performTaskWithPathArgumentsTimeout
    • 应用程序正常结束,但未生成覆盖率
  • 编辑
    在使用不同的框架进行了一些测试之后,我意识到退出模拟器是不够的,您必须明确地从应用程序中调用
    exit()
    。对于UI自动化,这有点棘手,但您可以声明应用程序方案,例如
    my-app://exit
    并通过MobileSafari使用
    UIAHost.performTaskWithPathArgumentsTimeout调用它。将检查这是否足以生成文件。

    据我所知,代码覆盖率文件是在应用程序退出时生成的,但你不能仅仅杀死模拟器

    您是否尝试为应用程序创建一个单独的目标,其中info.plist属性“UIApplicationExitsOnSuspend”设置为true


    然而,还有一个更大的问题。生成的覆盖率文件不是累积的,每次应用程序退出时都会被覆盖。因此,根据您的测试的结构(即,您是否为每个不同的测试终止并启动应用程序),您可能很难获得适当的代码覆盖率。

    按照这些步骤,我能够从UI自动化生成代码覆盖率文件,并通过cobertura Jenkins插件显示信息

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

    一旦获得了gcda文件,就可以通过下载gcovr()并运行命令来生成cobertura xml文件

    gcovr-r您的\u根目录\u到\u gcda\u文件的对象目录路径\u--xml>coverage.xml

    有了它,您可以设置Jenkins cobertura插件,根据需要显示信息


    来源:

    Hi,我知道这可能不是答案:你也可以试试我测试了80%的应用程序UI。它也很容易阅读,因为它使用cucumber@VinhTran嗯,我可以使用很多不同的框架,包括OCUnit,但我们选择了UIAutomation,我们已经编写了很多测试。@VinhTran最后,我开始将测试重写给Frank。它进展缓慢,因为我不是一个喜欢ruby的人,但最大的优点是框架是开放的。我已经修复了一些bug,我可以很容易地检查为什么测试不起作用。Jenkins集成更容易,CC生成工作没有问题。我很高兴听到它可以帮助您。真正的缺点只有在开始时才看得出来。但稍后,这些好处将清晰可见。@VinhTran测试组织立即变得更好(在调试时标记场景/功能的可能性非常好,例如,“@record”标记以录制视频)。另外,直接调用obj-c方法的可能性有助于我测试UI自动化无法测试的东西。到目前为止,最大的问题是Frank中的ocational bug——不过,它是开源的,我的一些修复程序已经合并了:)我没有杀死模拟器。我尝试使用一个退出模拟器的
    osascript
    ,这是非常不同的
    UIApplicationExitsOnSuspend
    不是一个好的解决方案,因为
    suspend
    事件(将应用程序发送到后台)是一个有效的用例,不应该结束应用程序。然而,我确实试过了。此外,代码覆盖率文件的覆盖是意料之中的,也不是问题。我明白,但代码覆盖率只会在退出应用程序时写入,所以听起来你好像被卡住了(除非苹果改进)。我不认为问题是由退出应用程序引起的。我能够使应用程序正常退出。我相信问题是由应用程序的启动方式造成的,而不是退出。不幸的是,我无法控制仪器如何发射它。是的,这证实了我问题末尾的建议确实有效。@Sulthan不明白你这句话的意思。您还可以判断上述链接是否有效-UIAutomation+代码覆盖率?