XCTest中的快照测试

“这不是一个错误,这是一个功能”。 几乎每个团队成员都已经学会了这句话。 是的,很奇怪,可以说它存在一定数量的缺陷。 但不是关于显示效果不好的布局。 考虑到交付到商店的时间成本,这对于移动测试尤为重要。

我们有许多类似的工具可用于测试iOS应用程序中的布局。 但是大多数人只是从一个人那里分叉或提出了一个主意。 因此,在此XCNote中,我想谈一谈– iOSSnapshotTestCase

该工具最初是在Facebook的领导下作为一个开源项目创建的。 随着时间的流逝,进入存档的计划被传递给了Uber,该项目仍在成功开发中。 最令人高兴的是, iOSSnapshotTestCase继承自XCTestCase ,这显然意味着,我们根本不需要对自动化系统进行任何更改。

我还要注意,我们可以像XCUITest一样在XCUITest中使用iOSSnapshotTestCase。 太好了,让我们尝试。

一开始,我们应该:

  • Podfile中添加一个额外的pod:

保存参考快照的功能由位于setUp()中的变量recordMode调节

  recordMode = true //保存参考快照 
recordMode = false //使用实际验证参考快照

为了对每个测试进行多个检查,我们应该将“ identifier”设置为FBSnapshotVerifyView和FBSnapshotVerifyLayer方法的参数。

如果需要通过XCUITest验证全屏快照,则可能会遇到以下问题:状态栏中会发生冲突(电池,时间等)。 可以解决此问题,尽管以一种有点荒谬的方式进行—在拍摄快照时,剪掉用于状态栏的几个像素。

主要问题是,由于iPhone X系列的状态栏尺寸不标准:

我们可以使用UIImage扩展来实现此拐杖:

此后,为了在所有iPhone机型上正确执行此裁切操作,我们将需要学习如何从测试中确定裁切结果。 为此,我们需要扩展UIDevice

然后将像这样使用它:

有时我们可能需要验证全屏快照,但特定元素除外。

谁能画画? 还有油漆吗?)现在该重新油漆了,因为我们可以借助“ 着色 ”解决这个问题。 我不是在开玩笑😉。 为此,我们需要:

1.通过创建fill(element:XCUIElement)方法再次扩展UIImage ,该方法将在快照上绘制所选元素:

2.在先前创建的验证方法附近创建一个新方法verifyScreen(不包含元素:XCUIElement)

综上所述,我想说的是,至少可以在移动设备上使用快照进行测试,并且最多可以加快我们的自动化测试的速度。

阅读完有关快照测试的文章后,如果您有任何疑问或澄清,我们将很乐意为您解答。 您可以在这里找到完成的项目:

https://github.com/alter-al/sample_of_ios_snapshot_testing_2048

所以,祝你好运,玩得开心,以后再见(: