如何使用 XCUITest 测试 UIImageView 是否包含具有特定名称的图像?
How to test if a UIImageView contains an image with a specific name using XCUITest?
我有一个 collectionView,它有一堆单元格,每个单元格中包含一个 UIImageView。我想在每个单元格中测试 imageView 的图像是否匹配正确的图像名称。
在生产代码中,我向 UIImageView 示例添加了一个可访问性标识符:"My Image View"。我遍历包含图像名称的字符串数组,并根据索引设置单元格的图像,例如:["image0.png"、"image1.png"、"image2.png"] 因此索引 0-2 处的单元格将分别有那些图像。
在我的 XCUITest 文件中,我正在尝试这样的事情:
XCTAssert(cells.images["My Image View"].exists, "message here")
但这不会检查单元格的 imageView 是否有正确的图像。谁能提出更好的解决方案?
我之前访问过的一些参考文献:
如果之前有人问过这个问题,我很抱歉,我找不到任何东西。
编辑:
我找到了解决方案。
let image = cells.element(matching: , identifier: )
我不知道标识符参数实际上使用了图像名称所以如果我传递图像名称,我可以断言图像的存在。
let image = cells.element(matching: .image, identifier: "myImage.png")
这行得通。因此,当我循环遍历包含图像名称的字符串数组时,我还可以检查与图像索引对应的索引处的单元格是否正确。
我还忘了说图片没有存储在资产中,而是通过 json 获取的。
cesarmarch 下面的答案最接近,所以我将其标记为正确。
XCTest UI 测试旨在作为功能测试编写,而不是检查显示是否正确。由于图像没有表现出供 UI 测试观察的行为,因此 UI 测试不是完成这项工作的最佳工具。
在这种情况下,您应该编写单元测试来断言已将正确的图像分配给您的图像视图,因为单元测试将可以访问正确级别的信息,以允许您检查传递给您的数据查看表示层并断言分配的图像是您期望的图像。
项目中的所有图像在构建时都导出到应用程序包中。在您的 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.")
上面的代码对我有用..希望这对你也有用
我只是用
XCTAssert(cells.images["Image_Name_In_Resource_Directory"].exists, "message here")
检查当前图像是否好用并且工作正常。
我有一个 collectionView,它有一堆单元格,每个单元格中包含一个 UIImageView。我想在每个单元格中测试 imageView 的图像是否匹配正确的图像名称。
在生产代码中,我向 UIImageView 示例添加了一个可访问性标识符:"My Image View"。我遍历包含图像名称的字符串数组,并根据索引设置单元格的图像,例如:["image0.png"、"image1.png"、"image2.png"] 因此索引 0-2 处的单元格将分别有那些图像。
在我的 XCUITest 文件中,我正在尝试这样的事情:
XCTAssert(cells.images["My Image View"].exists, "message here")
但这不会检查单元格的 imageView 是否有正确的图像。谁能提出更好的解决方案?
我之前访问过的一些参考文献:
如果之前有人问过这个问题,我很抱歉,我找不到任何东西。
编辑: 我找到了解决方案。
let image = cells.element(matching: , identifier: )
我不知道标识符参数实际上使用了图像名称所以如果我传递图像名称,我可以断言图像的存在。
let image = cells.element(matching: .image, identifier: "myImage.png")
这行得通。因此,当我循环遍历包含图像名称的字符串数组时,我还可以检查与图像索引对应的索引处的单元格是否正确。
我还忘了说图片没有存储在资产中,而是通过 json 获取的。
cesarmarch 下面的答案最接近,所以我将其标记为正确。
XCTest UI 测试旨在作为功能测试编写,而不是检查显示是否正确。由于图像没有表现出供 UI 测试观察的行为,因此 UI 测试不是完成这项工作的最佳工具。
在这种情况下,您应该编写单元测试来断言已将正确的图像分配给您的图像视图,因为单元测试将可以访问正确级别的信息,以允许您检查传递给您的数据查看表示层并断言分配的图像是您期望的图像。
项目中的所有图像在构建时都导出到应用程序包中。在您的 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.")
上面的代码对我有用..希望这对你也有用
我只是用
XCTAssert(cells.images["Image_Name_In_Resource_Directory"].exists, "message here")
检查当前图像是否好用并且工作正常。