使用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