使用XCWaiter在Swift中进行异步iOS测试

苹果公司最近为开发人员发布了Swift 3.1开发快照和XCode 8.3。 XCTest框架中添加了几个方便的类,以为iOS和macOS应用程序启用异步测试。 在本文中,我们将看到如何使用XCWaiter执行异步测试。

Swift 3.1开发版

Xcode 8.3中提供了新添加的类,如果您具有Apple Developer Account,则当前可以下载该类。 您可以从开发者帐户的“下载”部分获得它。 Xcode 8.3需要macOS版本10.12及更高版本。 您可以下载大约4.​​52 GB的压缩XIP文件。 如果您已经具有以前版本的Xcode,请删除它或保留它,但是必须在Xcode DEVLOPER_DIR之间切换。 下载完成后,您可以解压缩文件以安装Xcode 8.3 beta,并等待Xcode和命令行工具的安装。 一旦使用所有命令行工具完全安装了Xcode 8.3,我们就可以将其拖到/ Applications路径中。 现在,我们必须通过运行以下命令来切换到新的Xcode版本

  $ sudo xcode-select —切换/Applications/Xcode-beta.app/ 

这将设置新的DEVELOPER_DIR,我们准备使用Xcode 8.3。 确保使用xcrun使用正确的工具链— find swift命令将显示您正在使用的当前工具链。

  $ xcrun —快速查找 
  /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift 

现在,请确保导出工具链并使用正确的Swift版本,此版本当前为Apple Swift版本3.1-dev。 您可以通过运行以下命令轻松地做到这一点。

  $ export TOOLCHAINS = swift 
  $ swift —版本 
  Apple Swift版本3.1-dev(LLVM 40fb70e1b6,Clang 658ce8b57d,Swift d6c7fe1067) 
 目标:x86_64-apple-macosx10.9 

这将确保您使用的是Swift 3.1。 现在,我们可以尝试XCTest Framework的新功能。

XCUI测试中的当前等待

XCTest框架允许开发人员为iOS,macOS应用编写单元和UI测试。 苹果在WWDC 2015中引入了Xcode UI测试,这使我们能够在Xcode中编写UI测试。 作为Xcode 8.3发行版的一部分,Apple向XCTest框架增加了几个新类,以支持异步测试。 这意味着在等待XCUIElement出现时不涉及任何处理程序。 以前,我们将waitForExpectations(timeout:handler :)方法与XCTestExpectation结合使用来测试异步代码,如下所示:

  let谓词= NSPredicate(格式:“存在== 1”) 
 让查询= XCUIApplication()。buttons [“按钮”] 
  ExpectationForPredicate(谓词,ratedWithObject:查询,处理程序:无) 
  waitForExpectationsWithTimeout(3,处理程序:无) 

这段代码将等待3秒钟才能找到该按钮,如果找不到元素,它将在3秒钟后失败。 我们已将nil传递给处理程序,一旦达到超时,该处理程序将调用错误。 这种导致测试失败以及引发错误的方法非常通用,在调试时通常没有用。 幸运的是,我们现在可以使用XCWaiter更好地控制错误和处理程序。

XCTestWaiter

XCTest Framework现在具有XCTWaiter类来等待该元素。 新添加的类和子类的列表如下:

  • XCTWaiter:控制等待策略。
  • XCTNSPredicateExpectation:编写自动化测试时可读的期望
  • XCTKVOExpectation:编写自动化测试时可读的期望
  • XCTDarwinNotificationExpectation:另一个可读的通知期望。

XCWaiter类以布尔值的形式返回期望的结果。 它返回.completed,.timedOut,.incorrectOrder或.invertedFulFilment四种可能情况的枚举。 我们可以简单地将扩展名添加到XCUIElement或添加简单的函数,该函数返回的服务员函数的结果将从XCWaiter返回结果之一。

  func waiterResultWithExpextation(_元素:XCUIElement)-> XCTWaiterResult { 
 让myPredicate = NSPredicate(格式:“存在== true”) 
 让myExpectation =期望值(用于:myPredicate,ratedWith:元素, 
 处理程序:无) 
  let result = XCTWaiter()。wait(for:[myExpectation],超时:5) 
 返回结果 
}

没有回调块或完成处理程序。 helper方法仅返回一个布尔值,指示该元素是否出现。 让我们简要地回顾一下XCTWaiterResult返回的每个布尔结果,以了解它在做什么

已完成

当满足或完成定义的期望时,这将返回true。 如果在指定的超时时间内未达到期望,则返回false。 如果未达到期望,测试可能会失败。

时间到

如果在超时时间内未达到预期,则返回true。 通过提供有用的调试错误消息,我们可以定义如何使测试用例失败。

顺序错误

这告诉我们成功的期望和仍在等待成功的期望。 我们知道诊断该问题需要花费时间。

倒硫化

不能完全确定它是如何工作的,但是根据文档,如果将期望设置为具有反向行为,则实现它会产生与无法满足常规期望相似的效果。

可读的期望

XCTest框架中增加了一些新的期望,即XCTNSPredicateExpectation,XCTKVOExpectation和XCTDarwinNotificationExpectation。 我认为,其背后的想法是使期望更具可读性和可定制性。 以前,我们必须与处理人员一起提高期望。 现在我们可以这样写期望:

 让myExpectation = XCTKVOExpectation(keyPath:“ exists”,object:element, 
  ExpectedValue:true) 

然后,我们可以将此期望传递给XCWaiter以获取布尔结果。 您可以在此处的示例存储库中找到一些示例。

XCWaiter有什么好处

更好的等待策略

XCWaiter给我们每个期望的布尔结果,这使我们能够更好地控制XCTest。 这可能有助于处理测试的脆弱性。 XCWaiter结果仅返回元素是否出现。

定义多重期望的能力

我们可以定义多个期望,并等待XCWaiter为每个期望返回结果。 如上所述,期望可以以更易读的方式编写。

处理超时和错误

如果在指定的超时时间内未达到期望,并且错误非常普遍,以前XCtest就会失败。 现在,我们有了XCWaiter的.timedOut结果,因此我们可以通过适当的错误消息来控制测试失败。

减少剥落感

XCWaiter使我们可以更好地控制如何定义测试失败。 这将减少片状测试的数量。 XCWaiter结果还可以使我们能够通过适当的错误消息使测试失败或通过

突出性能问题

XCWaiter使我们能够定义多个期望,每个期望都试图在超时时间内实现。 有XCWaiter结果.incorrectOrder告诉我们有多少期望已实现,还有多少仍在等待实现。 这向我们表明了为什么这些期望值会变慢并且可能会出现一些性能问题。 我们可以诊断出使测试和应用程序更快的速度

GitHub Repo XCWaiter演示

我已经使用示例iOS应用程序创建了GitHub存储库Xcode83_Demo,以提供XCWaiter尝试和实验XCWaiter功能。 随意克隆并尝试一下。

最初发布在我的个人博客上:XCBlog-Shashikant Jagtap

像XCBlog的 XCTEQ 发布的帖子一样 您可能还喜欢我们的一些服务,例如访客博客或Mobile DevOps(CI / CD)或测试自动化。 Github 搜索我们的 服务 ,开源项目, 或者在 Twitter Facebook Youtube LinkedIn 上关注我们 下载我们的 XCBlog iOS应用程序以离线阅读博客。

X CTEQ 一家专门从事基于Mobile DevOps,CI / CD,Mobile,AI / ML的测试自动化Checkout XCTEQ产品和服务的公司, 网址 http://www.xcteq.co.uk 或写信给我们info@xcteq.co。英国..