使用FBSnapshotTestCase测试用户界面

有时,您需要为应用程序的UI添加自动测试。 有几种不同的方法可以实现此目的。

在测试中,您可以获取屏幕的元素并断言所有帧是否都符合您的期望。 根据要测试的UI,这可能需要很多工作。

或者,您可以使用Xcode提供的UI测试。 但是这些操作非常慢,以我的经验,有时它们只是停止工作。

有更好的选择。 Facebook有一个名为FBSnapshotTestCase的开源组件。 此类允许您创建快照测试。 快照测试将视图的UI与快照的外观进行比较。 让我们看看它是如何工作的。

我要测试的UI如下所示:

有两个带有标签,按钮和两个文本字段的堆栈视图。

使用迦太基安装FBSnapshotTestCase

我是迦太基人。 因此,我将向您展示如何使用迦太基在测试目标中安装FBSnapshotTestCase并使用它为简单的登录屏幕添加快照测试。

创建一个如下所示的Cartfile:

  github“ facebook / ios-snapshot-test-case” 

然后要求Carthage使用以下命令创建动态框架

 迦太基更新-平台iOS 

迦太基将从github上获取源代码并构建框架。 迦太基完成后,将框架从迦太基/ Bild / iOS文件夹中拖动到测试目标的链接二进制文件与库构建阶段:

接下来,向测试目标添加一个新的运行脚本构建阶段。 输入命令

  / usr / local / bin / carthage复制框架 

并添加输入文件$(SRCROOT)/Carthage/Build/iOS/FBSnapshotTestCase.framework 。 在Xcode中,它应如下所示:

配置FBSnapshotTestCase

接下来,您需要配置放置快照的目录。 每当快照测试失败时,您还可以告诉FBSnapshotTestCase创建差异映像。 这意味着,当测试失败时,将创建一个图像,该图像显示预期的UI和使测试失败的UI之间的差异。 这样,您可以找出UI中发生了什么变化。

打开您使用测试的方案,并添加以下环境变量:

  FB_REFERENCE_IMAGE_DIR:$(SOURCE_ROOT)/ $(PROJECT_NAME)测试/失败差异 
  FB_REFERENCE_IMAGE_DIR:$(SOURCE_ROOT)/ $(PROJECT_NAME)测试 

在Xcode中,它看起来像这样:

创建快照

要创建快照测试,请将FBSnapshotTestCase的子类添加到测试目标并添加以下导入语句:

 导入FBSnapshotTestCase 
  @testable导入SnapshotTestDemo 

接下来,添加测试方法:

  func test_LoginViewSnapshot(){ 
 让Storyboard = UIStoryboard(名称:“ Main”,包:nil) 
 让sut = storyboard.instantiateInitialViewController()为!  ViewController 
  _ = sut.view 
  recordMode = true 
  FBSnapshotVerifyView(sut.view) 
  } 

前两行创建您要测试的视图控制器的实例。 _ = sut.view行触发了视图的加载。 这是必要的,因为否则视图在测试中将为零。 recoredMode = true行告诉FBSnapshotTestCase应该创建参考快照。 使用FBSnapshotVerifyView(sut.view)会将参考快照与视图的当前UI进行比较。

运行测试。 该测试将失败,因为FBSnapshotVerifyView()找不到与该视图进行比较的参考快照。 在Finder中打开测试目标的目录。 现在有一个目录ReferenceImages_64 。 在此目录中,您可以找到所有以记录模式记录的快照。

现在从测试中删除记录模式= true行, 然后再次运行测试。 测试成功。 真好! 从现在开始,每当登录屏幕的UI更改时,测试失败都会通知您。

差异图像

但是我们如何知道快照测试确实有效? 简单,让我们更改UI并查看会发生什么。 在用户界面中进行更改。 在示例UI中,包含文本字段和按钮的内部堆栈视图的间距为20点。 我将其更改为21并再次运行测试。

测试失败,并且在测试目标的目录中有一个名为FailureDiffs的新目录。 在这个新目录中,您可以找到失败测试的所有差异映像。 就我而言,差异图像如下所示:

太棒了! 使用此图像,应该很容易在UI中找到导致测试失败的更改。

如果您不想了解有关测试的更多信息(尤其是测试驱动的iOS开发),我已经写了一本书。 第一版的反馈非常好,许多读者说这有助于他们掌握测试驱动的iOS开发。

玩得开心,测试您的所有UI!

如果您喜欢这篇文章,请查看我的博客:http://swiftandpainless.com