KIF 很棒。KIF 允许您保持应用功能,鼓励您使用辅助功能,等等。KIF 的一个弱点是它无法告诉您应用是否 视觉上是 发生了变化。您仍然需要测试人员手动检查应用,眯起眼睛查看应用并问“是否与线框图匹配?”
Lela 正在这里帮助 KIF! Lela,代表 Less Eyeballing Large Apps(可以不用那么细看大型应用),是一个在 KIF 之上构建的库,如果您是 Lela 的用户。Lela 可以告诉你屏幕是否发生了变化。Lela 为不同屏幕尺寸、密度、操作系统版本和设备类型具有特定的图像名称,这意味着您可以将不同类型的设备插入 CI 服务器,并让 Lela 验证它们。
重要说明: Lela 使用的代码来自 Perceptual Image Diff,并受 GPL 许可证的许可。在大多数情况下这不重要,因为您没有分发测试,但如果您分叉项目或计划将其包装到产品中,请记住这一点。
Lela 附带一个演示项目,展示三种不同的结果模式(通过、图像不满足预期、预期图像缺失)对于一个非视网膜的 iOS 6.1 模拟器。我知道这很具体,但这就是需要做到的!
![测试结果](https://github.com/kif-framework/Lela/raw/master/Images/TestResults.png)
您会注意到的一个重要事情是,测试在 Lela 检测到不匹配时不会停止。由于破碎的外观不一定意味着 UI 破碎,测试继续进行以收集更多屏幕并平稳退出测试。
当您的业务合作伙伴可以确认应用的某个部分时,Lela 最佳。这里有一个如何实施的例子。
当发生更改时,无论是故意的还是无意的,你将得到一个包含三个文件(预期、实际和差异)的测试错误。如果是由于bug,则修复它!如果不是,再次将截图发送给你的业务伙伴。一旦你得到认可,将批准的图片复制到你的测试包中,你就可以设置了。
你可能想使用现有的KIF测试目标来测试这些文件,或者创建一个新的目标。这完全取决于你是否愿意在生产服务器上的KIF测试中看到大量测试失败。
Lela可以通过CocoaPods进行安装。
target 'Acceptance Tests' do
pod 'Lela', '~> 0.2'
end
这个示例假设你已经熟悉KIF,并借鉴了那个项目的示例。你实际上只需要做两件事。
将Lela头文件添加到你的测试用例文件中
#import <Lela/Lela.h>
在你的测试中添加expectScreenToMatchImageNamed:
步骤。
- (void)testSuccessfulLogin
{
[tester enterText:@"[email protected]" intoViewWithAccessibilityLabel:@"Login User Name"];
[tester enterText:@"thisismypassword" intoViewWithAccessibilityLabel:@"Login Password"];
[tester tapViewWithAccessibilityLabel:@"Log In"];
// Test that the login screen looks correct.
[tester expectScreenToMatchImageNamed:@"Filled Out Login Screen"];
// Verify that the login succeeded
[tester waitForTappableViewWithAccessibilityLabel:@"Welcome"];
// Test that the welcome screen looks correct.
[tester expectScreenToMatchImageNamed:@"Welcome screen"];
}
如果你的视图需要一段时间才能稳定,你可能会想要添加一些waitForTimeInterval:
步骤。
在某些情况下,某些视图/图像在你应用程序中的渲染可能会有轻微的运行时可变性。当处理模糊图像时这种情况最明显。
为了处理这种情况,你可以指定如果差异不超过X像素,则Lela应认为视图与预期图像匹配。
你可以这样指定这个阈值
// Test that the login screen looks correct within a threshold
NSUInteger numberOfPixelsThatCanDiffer = 100;
[tester expectScreenToMatchImageNamed:@"Filled Out Login Screen" options:@{LECompareOptionThresholdPixels : @(numberOfPixelsThatCanDiffer) }];