如何使用XCUITest测试UIImageView是否包含具有特定名称的图像?

时间:2019-06-12 18:19:22

标签: ios swift xcode xctest xcuitest

我有一个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: )

我不知道identifier参数实际上使用的是图像名称,因此如果我传递图像名称,则可以断言该图像的存在。

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

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

我也忘记提及图像不是存储在资产中,而是通过json获取。

cesarmarch的回答是最接近的,因此我将其标记为正确。

3 个答案:

答案 0 :(得分:2)

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

在这种情况下,您应该编写单元测试以断言已为图像视图分配了正确的图像,因为单元测试将有权访问正确级别的信息,从而使您可以检查传递给视图表示的数据层和资产,分配的图像就是您期望的图像。

答案 1 :(得分:2)

我只使用

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

检查当前图像是否很好用,并且工作正常。

答案 2 :(得分:0)

在构建时,项目中的所有图像都将导出到应用程序捆绑包中。在“ 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.")

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