在 iOS 上使用 UI 自动化测试屏幕跟踪

Posted

技术标签:

【中文标题】在 iOS 上使用 UI 自动化测试屏幕跟踪【英文标题】:Testing screen tracking with UI automation on iOS 【发布时间】:2014-04-07 11:52:13 【问题描述】:

所以我有了这个想法,即使用 UI 自动化在我的应用上测试我的屏幕跟踪(使用 Google Analytics)的实现。

最初的想法是构建一个 UI 脚本来遍历屏幕,同时检查是否相应地发送了跟踪事件。我需要这个,因为有时我无法从视图控制器中组合所有内容,或者事件未按预期顺序转发。无论如何,我也应该测试我的应用程序的这方面,我认为 UI 自动化就是答案。

我已经使用 UI 自动化工具实现了一个脚本来浏览屏幕,并且它工作正常。我什至使用tuneup js 来使代码更加精简和易于理解。 我期待有类似的东西(一般来说,语法只是一种简化):

Being on screen X
    Tap button A
Expect screen Y and tracking event for the screen Y

但是,据我所知,通过 UI 自动化测试屏幕跟踪是不可能的。 还是我错过了什么?

我想创建一个不可见的视图,它位于所有视图层次结构的顶部,并在每次加载新屏幕时更改其名称,以便我使用 UI 自动化对其进行测试,但这个想法听起来有点过头了.. .

你们有什么建议?寻找另一个 UI 自动化工具?用单元测试代替吗?

提前感谢您的帮助

【问题讨论】:

是否可以对 Google Analytics 进行手动测试?也许您可以分别测试三个不同的三个设备;我和我的搭档的方法是分析前一两天下载的数据,然后询问朋友他们访问过哪些页面。 可以在模拟器中使用GoogleAnalytics的参考:***.com/a/19934264/1546710 我想让它自动化,这样我就可以在服务器上运行它作为回归测试。我想将此包含在一种工作流测试中,以检查是否没有任何问题。 您能用您希望完成的任务更新问题吗? IE。你的成功标准是什么? (我猜“当我点击 X 时,事件 X 被发送到 GA”)。 @quellish,没错。我已经更新了我的问题。 【参考方案1】:

您可以使用 UIAlertView 并检查这些警报。您可以弹出警报,而不是发送分析事件,以便您可以在 UIAutomation 中检查它。

像AnalyticsKit 这样的分析抽象框架提供了一种更改分析提供程序的简单方法。 AnalyticsKit 甚至有一个例子(看看 AnalyticsKitDebugProvider 类)。因此,对生产代码的更改很少。

您可以使用构建配置来设置构建变量来控制分析的初始化

id<AnalyticsKitProvider> provider
#ifdef USE_UI_AUTOMATION_ANALYTICS
provider = [[TestAutomationProvider alloc] init];
#else
provider = [[RealProvider alloc] initWithApiKey:API_KEY];
#endif

[AnalyticsKit initializeLoggers:@[provider]];

在 UIAutomation 中,您可以测试即将出现的警报。你可以利用 tuneup.js 包中的 assertions.js 来编写这样的函数

function checkForAlert()

    var alert = null;
    retry( function() 
          log("wait until alert appaers");
          alert = UIATarget.localTarget().frontMostApp().alert();
          assertNotNull(alert, "No alert found");
          assertTrue("The name you can choose for the alert" == alert.name()); 
          , 5, 1.0);
    return alert;
;

这结合了等待警报和测试它是否最终出现。如果未出现警报,则测试将失败。

在您的测试中,您可以通过以下方式使用它:

var analyticAlert = checkForAlert() // if alert appears it will be in the var, otherwise the test fails at this point.
analyticAlert.buttons()["OK"].tap(); // dismiss the alert

要完成这项工作,您还需要设置一个 onAlert 处理程序。否则 UIAutomation 将尝试立即关闭您的警报。这必须在您的测试代码之前完成。 UIAutomation 文档中解释了警报处理。

function MyOnAlertHandler(alert)

   if("The name you choose"==alert.name()) // filter all alerts created by analytics provider
   
      return true; // handle alert in your test
   

   return false // automaticly dismiss all other 


UIATarget.onAlert = MyOnAlertHandler; // set the alert handler

【讨论】:

感谢您的回答和建议 AnalyticsKit,这似乎很有趣,但缺少一些文档。稍后必须再次检查他们的cmets。拥有 UIAlertView 的想法与我的拥有隐藏视图的想法非常相似,并且可能看起来比我的更有趣且更容易实现。但是,我必须区分这些警报和我用来向用户传达故障或信息的警报。你能权衡一下吗? 我试图更详细地概述您的测试的外观。 HTH

以上是关于在 iOS 上使用 UI 自动化测试屏幕跟踪的主要内容,如果未能解决你的问题,请参考以下文章

IOS UI 自动化导出跟踪结果

如何在 jenkins 上运行 ios 模拟器进行 ui 自动化测试

iOS XCUITest 模拟指纹

腾讯TMQ解放程序猿(媛)的双手—iOS UI自动化测试

iOS自动化UI测试——KIF使用分享

针对 iPhone 应用的 Instruments UI 自动化测试