Xcode swift UI 测试对比两张截图

Posted

技术标签:

【中文标题】Xcode swift UI 测试对比两张截图【英文标题】:Xcode swift UI Testing compare two screenshots 【发布时间】:2018-08-29 14:21:25 【问题描述】:

基本上我拥有的是一个项目列表,我可以使用按钮在该列表中创建一个新项目。

现在我想测试单击按钮时是否将项目添加到列表中。

在为此创建测试用例时,我想在点击按钮之前和之后截取屏幕截图并比较它们以了解是否添加了项目。但是现在我被困在如何比较两个屏幕截图上。

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:列表以自下而上的方式显示,就像您看到聊天新项目将添加在底部一样。

【问题讨论】:

您可以添加您已经尝试过的内容吗? 我实际上没有,正如您在问题中看到的那样,我被困在如何比较两个屏幕截图。尽管如此,我会添加代码以供参考 @regina_fallangi 已添加代码请检查是否需要其他内容 一幅图像实际上是一个 NxM 矩阵,包含 (R,G,B,A) 值的元组。最简单的方法是沿每个通道减去两个图像矩阵,然后将减法相加。如果所有通道的总和为 0 或在某个容差值内,则两个屏幕截图相同。 有没有其他方法看起来太耗时了。或任何其他方式来检测列表中是否添加了新项目 【参考方案1】:

有一个名为 iosSnapshotTestCase(FBSnapshotTestCase) 的库可以做到这一点。曾经是 Facebook 项目,现在是 Uber 项目。

iOSSnapshotTestCase

它设置为截取您的视图/视图控制器的屏幕截图,然后在随后的测试运行中,它将您的视图与保存的快照图像进行比较,并生成显示任何差异的输出图像。

我从https://www.objc.io/issues/15-testing/snapshot-testing/ 读到:

"它通过绘制视图或图层和 现有快照到两个 CGContextRefs 并进行内存比较 其中有 C 函数 memcmp()。"

【讨论】:

以上是关于Xcode swift UI 测试对比两张截图的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 11.7(12.4)/13.2的signing和sandbox配置截图对比

移动测试之appium+python 入门代码

Swift 中的 Xcode:导航栏未显示在 UI 集合视图(模拟器)中

尝试制作一个屏幕截图按钮,当单击按钮时将屏幕截图发送到我的相机胶卷。斯威夫特 3,Xcode 8,IOS

用于 UI 测试的 Xcode 自动化工具

音频播放错误 - XCODE 7 (Swift 2.0)