Сброс приложения в настройке XCUITest с Cucumberish - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь начать работу с XCUITests для приложения для iOS, которое в настоящее время разрабатывает моя компания. Кроме того, я использую Cucumberish для организации тестов и использования наших уже существующих файлов функций.

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

Автоматизация Springboard для переустановки приложения не работает (данные не удаляются), я не могу вызывать классы, определенные в приложении, используя "@testable import" (поэтому я могу очищать данные программно), там не похоже на способ вызова команды оболочки между тестами для полной перезагрузки симулятора.

У меня есть выбор? Или мне нужно вручную запускать пользовательский интерфейс для выхода из системы после каждого теста? (что для меня звучит очень ненадежно - особенно если тесты не пройдены)

1 Ответ

0 голосов
/ 31 августа 2018

Да, есть способ добиться этого, я использую его и в своих тестах.

Вы должны поговорить со своим приложением, используя launchArguments (или, в конечном итоге, launchEnvironment). Во-первых, в своем методе setUp() сообщите приложению, что оно находится в режиме UI-TESTING:

override func setUp() {
    super.setUp()
    continueAfterFailure = true
    app.launchArguments += ["UI-TESTING"]
}

Затем в каждом тесте, в котором вы ожидаете выхода из системы, сообщайте вашему приложению, что оно должно выйти из системы, прежде чем вызывать XCUIApplication.launch() метод:

let app = XCUIApplication()

func testWithLoggedOutUser() {
    app.launchArguments += ["logout"]
    app.launch()
    // Continue with the test
}

Затем в файле AppDelegate.swift прочитайте аргументы и действуйте соответственно:

class AppDelegate: UIResponder, UIApplicationDelegate {
    static var isUiTestingEnabled: Bool {
        get {
            return ProcessInfo.processInfo.arguments.contains("UI-TESTING")
        }
    }
    var shouldLogout: Bool {
        get {
            return ProcessInfo.processInfo.arguments.contains("logout")
        }
    }

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        if AppDelegate.isUiTestingEnabled {
            if shouldLogout {
                 // Call synchronous logout method from your app
                 // or delete user data here
            }
        }
    }
}

Я написал пост в блоге о настройке локального состояния в приложении, вы можете проверить его здесь .

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