基本上我有一个项目列表,我可以使用按钮在该列表中创建一个新项目。
现在我想测试单击按钮时是否将该项目添加到列表中。
在为此创建测试用例时,我想在点击按钮之前和之后截取屏幕截图并进行比较以了解是否添加了项目。但是现在我被困在如何比较两个屏幕截图上。
PS:列表很复杂,项目可能包含不同的数据。
private func takeScreenshot() -> XCUIScreenshot{
return XCUIScreen.main.screenshot()
}
private func testElements(){
let app = XCUIApplication()
app.buttons["List Items"].tap()
app.tables["OuterTable"].cells.allElementsBoundByIndex.first?.tap()
let createBar = app.otherElements["createBar"]
let button = app.buttons["CreateButton"]
let initialScreenshot = takeScreenshot()
button.tap()
let newScreenshot = takeScreenshot()
//Compare initialScreenshot and new Screenshot
}
PS:列表以自下而上的方式显示,就像您看到聊天新项目将在底部添加一样。
有一个名为iOSSnapshotTestCase(FBSnapshotTestCase(的库就是这样做的。曾经是Facebook的项目,现在是Uber的项目。
iOS NapshotTestCase
它设置为截取视图/视图控制器的屏幕截图,然后在后续测试运行中,它将您的视图与保存的快照图像进行比较,并生成显示任何差异的输出图像。
我从 https://www.objc.io/issues/15-testing/snapshot-testing/读到:
"它通过绘制视图或图层和 将现有快照转换为两个 CGContextRefs 并进行内存比较 其中带有 C 函数 memcmp((。
您可以使用pngRepresentation
属性比较屏幕截图图像的原始数据:
let expectedResult = initialScreenshot.pngRepresentation == newScreenshot.pngRepresentation
XCTAssert(expectedResult, "the screenshots don't match")