【问题标题】:How to test if a UIImageView contains an image with a specific name using XCUITest?如何使用 XCUITest 测试 UIImageView 是否包含具有特定名称的图像?
【发布时间】:2019-10-27 07:44:13
【问题描述】:

我有一个 collectionView,它有一堆单元格,每个单元格中都包含一个 UIImageView。我想在每个单元格中测试,imageView 的图像是否与正确的图像名称匹配。

在生产代码中,我为 UIImageView 示例添加了一个可访问性标识符:“我的图像视图”。我遍历包含图像名称的字符串数组并根据索引设置单元格的图像,例如: ["image0.png", "image1.png", "image2.png"] 所以索引 0-2 处的单元格将分别有那些图像。

在我的 XCUITest 文件中,我正在尝试这样的事情:

XCTAssert(cells.images["My Image View"].exists, "message here")

但这不会检查单元格的 imageView 是否有正确的图像。任何人都可以提出更好的解决方案吗?

我之前访问过的一些参考资料:

How to test UIImageView elements in iOS XCTest?

XCUIElement - Obtain Image value

如果以前有人问过这个问题,我很抱歉,我找不到任何东西。

编辑: 我找到了解决办法。

let image = cells.element(matching: , identifier: )

我不知道标识符参数实际上使用了图像名称,所以如果我传递图像名称,我可以断言图像的存在。

let image = cells.element(matching: .image, identifier: "myImage.png")

这行得通。所以当我遍历包含图像名称的字符串数组时,我还可以检查与图像索引对应的索引处的单元格是否正确。

我还忘了提到图像没有存储在资产中,而是通过 json 获取。

cesararch 下面的答案是最接近的,所以我将其标记为正确。

【问题讨论】:

    标签: ios swift xcode xctest xcuitest


    【解决方案1】:

    XCTest UI 测试旨在编写为功能测试,而不是检查显示是否正确。由于图像没有表现出供 UI 测试观察的行为,因此 UI 测试并不是这项工作的最佳工具。

    在这种情况下,您应该编写单元测试来断言为您的图像视图分配了正确的图像,因为单元测试将可以访问正确级别的信息,以允许您检查传递给视图演示的数据层并断言分配的图像是您期望的图像。

    【讨论】:

    • Oletha 对这种方法是正确的;网络的测试将慢几个数量级,并且更加不稳定。这也是为什么应该在单元测试级别进行测试的另一个原因。
    【解决方案2】:

    我只是使用类似的东西

    XCTAssert(cells.images["Image_Name_In_Resource_Directory"].exists, "message here")

    检查当前图像是否可以使用并且工作正常。

    【讨论】:

    • 感谢您的回复。我找到了解决方案。你的是最接近的,所以我将你的标记为已解决。谢谢!
    • 这对我不起作用... :( Xcode 12.4
    【解决方案3】:

    项目中的所有图像都在构建时导出到应用程序包中。在您的 UI 测试组下有一个文件夹,其中包含所有要验证的预期图像和一个虚拟图像文件。

    var url = Bundle(for: AnyClass.self).url(forResource: "<ExpectedImageName>", withExtension: "<imageExtension png/jpg/etc>")!
    let expectedImage = NSImage(contentsOf: url)!.tiffRepresentation!
    url = Bundle(for: AnyClass.self).url(forResource: "<NameOfDummyImageFile>", withExtension: "png")!
    try? cells.images["My Image View"].screenshot().pngRepresentation.write(to: url)
    let actualImage = NSImage(contentsOf: url)!.tiffRepresentation!
    XCTAssert(actualImage.elementsEqual(expectedImage), "Images are not same.")
    

    上面的代码对我有用。希望这对你也有用

    【讨论】:

    • 感谢您的回复。这是一个有趣的方法。我没有提到图像文件没有存储在我的资产中。相反,图像是通过 json 获取的。
    • 好的。我认为您也可以在测试中通过 json 获取图像。或者,如果图像不是随机分配给单元格的,您可以尝试将它们添加到您的项目资产中。
    猜你喜欢
    • 1970-01-01
    • 2010-09-19
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 2015-06-07
    相关资源
    最近更新 更多