Загрузите контроллер с раскадровки, используя Cucumberish с UI Testing - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь реализовать тестирование пользовательского интерфейса с BDD, используя Cucumberish framework.Я хорошо понимаю систему разбора файлов Feature, и мне удалось протестировать некоторые элементы пользовательского интерфейса на главном экране.

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

Вот мой код инициализации:

@objc class CucumberishSwiftInit: NSObject {
@objc class func CucumberishSwiftInit()
{
    var application : XCUIApplication!
    //A closure that will be executed just before executing any of your features
    beforeStart { () -> Void in
        application = XCUIApplication()
    }
    //A Given step definition
    Given("the app is running") { (args, userInfo) -> Void in
        application.launch()
        let bundle = Bundle.main

        // I double checked the storyboard name and I can access it in my Unit Tests target
        // application crashes here
        let storyboard = UIStoryboard(name: "Main", bundle: bundle)

        // never executed 
        Swift.print("storyboard \(storyboard)")
    }
    let bundle = Bundle(for: CucumberishSwiftInit.self)

    Cucumberish.executeFeatures(inDirectory: "Features", from: bundle, includeTags: nil, excludeTags: ["skip"])
}
}

Файл некоторых функций:

@run @welcome
Feature: Some feature
Some feature desc

Scenario: Can load screen
    Given the app is running
    ...

Приложение упало в операторе инициализации UIStoryboard, перехватило «NSInvalidArgumentException», «Не удалось найтиРаскадровка с именем 'Main' в комплекте NSBundle (загружено). Я понятия не имею, почему, поскольку она работает с моими модульными тестами.

1 Ответ

0 голосов
/ 17 февраля 2019

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

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

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

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

...