Как проверить, содержит ли UIImageView изображение с определенным именем, используя 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 ячейки. Может ли кто-нибудь предложить лучшее решение?

Некоторые ссылки, которые я посетил заранее:

Как протестировать элементы UIImageView в iOS XCTest?

XCUIElement - получить значение изображения

Прошу прощения, если этот вопрос задавали раньше, я ничего не нашел.

Изменить: я нашел решение.

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

Я не знал, что параметр идентификатора на самом деле использует имя изображения, поэтому, если я передаю имя изображения, я могу подтвердить существование изображения.

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

это работает. Поэтому, когда я просматриваю массив строк, содержащих имя изображения, я также могу проверить правильность ячейки с индексом, соответствующим индексу изображения.

Я также забыл упомянуть, что изображения не хранятся в активах, а загружаются через json.

Ответ cesarmarch ниже был самым близким, поэтому я отметил его как правильный.


person leedex    schedule 12.06.2019    source источник


Ответы (3)


Я просто использую что-то вроде

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

чтобы проверить, подходит ли текущее изображение для использования и работает ли оно нормально.

person cesarmarch    schedule 14.06.2019
comment
Благодарю за ваш ответ. Я нашел решение. Ваш был самым близким, поэтому я пометил вашу как решаемую. Спасибо! - person leedex; 15.06.2019
comment
У меня это не сработало ... :( Xcode 12.4 - person Ting Yi Shih; 15.04.2021

Тесты пользовательского интерфейса XCTest предназначены для написания функциональных тестов, а не для проверки правильности отображения. Поскольку изображение не демонстрирует поведения, которое может наблюдать тест пользовательского интерфейса, тест пользовательского интерфейса - не лучший инструмент для этой работы.

В этом случае вы должны написать модульные тесты, чтобы утверждать, что правильное изображение назначено вашим представлениям изображений, поскольку модульные тесты будут иметь доступ к нужному уровню информации, чтобы вы могли проверять данные, которые вы передаете на уровень представления вашего представления, и утверждать что назначенное изображение - именно то, что вы ожидаете.

person Oletha    schedule 13.06.2019
comment
Олета права насчет этого подхода; тестирование сети будет на порядки медленнее и нестабильнее. Это еще одна причина, по которой тест следует проводить на уровне модульного тестирования. - person ablarg; 14.09.2019

Все изображения в проекте экспортируются в пакет приложений во время сборки. Создайте папку в группе тестирования пользовательского интерфейса, в которой будут храниться все ожидаемые изображения для проверки и файл фиктивного изображения.

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.")

Приведенный выше код работает для меня. Надеюсь, это сработает и для вас.

person Prakash Saravanan    schedule 14.06.2019
comment
Благодарю за ваш ответ. Это интересный подход. Я не упомянул, что файлы изображений не хранятся в моих активах. Скорее изображения загружаются через json. - person leedex; 15.06.2019
comment
В порядке. Я думаю, вы также можете получать изображения через json в своем тесте. Или, если изображения не назначаются ячейкам случайным образом, вы можете попробовать добавить их в активы вашего проекта. - person Prakash Saravanan; 15.06.2019