Xcode 7: пропасть между испытаниями приложений и несовместимыми с UI-тестами?

Xcode 7 † имеет новый способ протестировать ваш пользовательский интерфейс напрямую, в том числе новую целевую аудиторию "Пакет тестирования iOS UI" (или "OS X" ).

enter image description here

В целевом тестировании пользовательского интерфейса отсутствует встроенный доступ к модели или классам, которые составляют ваше приложение. Например. [UIApplication sharedApplication] не будет вызываться из ваших тестов пользовательского интерфейса. Это подразумевает, что "тесты приложений" и "тесты UI" существуют во всей, возможно, непреодолимой пропасти.

Как указано здесь:

Проблема в том, что тестирование Xcodes UI не позволяет получить доступ к фактическому приложению.

Вопросы:

  • Может ли эта пропасть перекрыться? Если да, то, как подробно, с настройками сборки и компоновщика и, возможно, рабочим xcodeproj на github.
  • Где можно было бы найти четкую формулировку этого разрыва в документах Apple.

† На момент написания бета-версии.

Ответ 1

Тестирование Black-box

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

Например, вы должны заботиться только об изменении значения на метке, а не о том, что контроллер передал нужные данные в представление. Вы можете думать о тестировании пользовательского интерфейса от пользователя вашего приложения. Ей все равно, как работает ваш ItemsViewController (или даже тот, что он существует), поэтому зачем тестировать пользовательский интерфейс?

Как это сделать "Работа"

Говоря, я понимаю ваше разочарование. Было бы здорово, если бы вы могли развернуть контроллер вида, а затем использовать его с помощью тестирования пользовательского интерфейса и принятия утверждений. Однако с Beta 5 это невозможно.

Интересно, что вы можете создать экземпляры объектов приложения с помощью простого @testable import ModuleName в верхней части ваших пользовательских интерфейсов. Обратите внимание, что вы не можете взаимодействовать с ним с помощью методов .tap() -like, так как это класс UI*, а не XCUI*.

Рассмотрим Donut как имя модуля приложения.

import XCTest
@testable import Donut

class DonutUITests: XCTestCase {
    let app = XCUIApplication()

    override func setUp() {
        continueAfterFailure = false
        app.launch()
    }

    func testItemsViewController() {
        let controller = ItemsViewController()
        controller.addItemButton.tap() // <---- UIButton does not respond to tap()!
    }
}