Пример теста пользовательского интерфейса Xcode

Недавно я узнал о модульном тестировании в Xcode. Теперь я пробую Xcode 7 и вижу новую группу для тестов пользовательского интерфейса, когда создаю новый проект.

введите здесь описание изображения

Я посмотрел видео WWDC 2015, и оно было довольно хорошим, но у вас есть супер простой пример, который я мог бы пройти сам? Примеры видео были слишком сложными для меня.

Примечания


person Suragch    schedule 24.07.2015    source источник


Ответы (2)


Используйте модульные тесты для проверки правильности методов в ваших классах. Вы используете их для проверки кода, который вы написали. (См. другой мой пример для настройки простого модульного теста в Xcode.)

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

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

Пример

Это самая простая настройка и тест пользовательского интерфейса, которые я мог придумать: кнопка, которая при нажатии меняет текст метки.

Настраивать

  • Создайте новый проект в Xcode 7+ для iOS 9.0+.
  • Убедитесь, что установлен флажок Включить тесты пользовательского интерфейса.

введите описание изображения здесь

  • Если вы добавляете тесты пользовательского интерфейса в проект, созданный до Xcode 7, см. этот ответ. («Файл» > «Создать» > «Цель» > «Тест» > «Пакет тестирования пользовательского интерфейса Cocoa Touch»)

  • Добавьте UILabel и UIButton в раскадровку

введите описание изображения здесь

  • Создайте @IBOutlet и @IBAction в ViewController и измените текст label при нажатии button.

    import UIKit
    class ViewController: UIViewController {
        @IBOutlet weak var label: UILabel!
        @IBAction func button(sender: AnyObject) {
            label.text = "Hello"
        }
    }
    

Пройди тест

  • Откройте файл YourProjectUITests.

введите описание изображения здесь

  • Поместите курсор в метод testExample(). (Вы можете удалить комментарии)

введите описание изображения здесь

  • Нажмите красную кнопку записи

введите описание изображения здесь

  • В приложении (1) коснитесь ярлыка, (2) коснитесь кнопки, а затем (3) снова коснитесь ярлыка. (4) Нажмите кнопку записи еще раз, чтобы остановить запись. Следующий код должен быть автоматически сгенерирован для вас:

    func testExample() {
    
        let app = XCUIApplication()
        app.staticTexts["Label"].tap()
        app.buttons["Button"].tap()
        app.staticTexts["Hello"].tap()
    }
    
  • Используйте линии staticText в качестве отправной точки для создания XCTAssert. Теперь у вас должно быть:

    func testExample() {
    
        let app = XCUIApplication()
        XCTAssert(app.staticTexts["Label"].exists)
        app.buttons["Button"].tap()
        XCTAssert(app.staticTexts["Hello"].exists)
    }
    
  • Нажмите на ромб слева, чтобы запустить тест пользовательского интерфейса. Он должен стать зеленым, когда он пройдет.

введите описание изображения здесь

  • Вот и все! Это показало, что UIButton и UILabel существуют и что текст метки изменился. Если вы хотите, чтобы он потерпел неудачу (хорошая идея), вы можете изменить «Hello» на что-то другое.

Дальнейшее обучение

person Suragch    schedule 24.07.2015
comment
Как можно убедиться, что менялась именно метка? Если это кнопка, которая изменена на «Привет», тест также будет пройден. Одним из вариантов может быть проверка существования метки и кнопки, но это не является общим. Что, если мы захотим изменить метку на пустую строку вместо Hello? app.staticTexts[""].exists почти всегда верно. - person Kalicz; 31.10.2015
comment
Почему мы не можем использовать accessibilityIdentifer для идентификации элементов вместо жестко закодированного текста, такого как Hello. Это всегда помогает, даже если текст будет изменен в будущем. - person Sravan; 13.11.2015
comment
Я уверен, что это, вероятно, было бы лучше. Приведенный выше ответ был сделан мной, когда я пытался понять тестирование пользовательского интерфейса в отсутствие каких-либо других простых примеров. Не стесняйтесь добавить еще один ответ на этот вопрос, который улучшит мой ответ. - person Suragch; 14.11.2015
comment
Спасибо! Это сэкономило мое время. - person ssowri1; 04.11.2017
comment
Неужели нет официальной документации о том, как писать UI-тесты в iOS? Я нашел эту страницу developer.apple.com/documentation/xctest/user_interface_tests, но там нет примеры, и, конечно, не очевидно, что вы сказали бы что-то вроде XCTAsert(app.staticTexts[Label].exists). Где официальное руководство? - person Michael Vescovo; 17.09.2020

@Suragch +1 за ответ. Одна вещь, которую я заметил и хочу поделиться: каждая функция в тестовом примере пользовательского интерфейса должна начинаться с «тест». Вы можете добавить дополнительное имя после этого. Только так появляется кнопка (для нажатия на запуск теста).

person Himanshu Garg    schedule 16.11.2015
comment
Вы можете предложить для редактирования или комментирования. Отдельный ответ имеет смысл. - person Rohit Pradhan; 26.01.2018