Удаление класса XCUITest не приводит к удалению приложения. Но работает, если его экземпляр снести. Что я делаю неправильно? - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть разрыв класса, который пытается удалить приложение, но он не распознает app.terminate ().

class DeviceSettingsUtilities : UITestUtilities {
func removeApp(productName:String){
        print("in teardown")
        let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard")
        XCUIApplication().terminate() // this does nothing
        XCUIApplication(bundleIdentifier: "com.xxx.xxxx").terminate()//this does nothing too, but this works when called as an instance teardown
        sleep(5)
        springboard.activate()
        let icon = springboard.icons.matching(identifier: productName).firstMatch
// icon.exists is false when called as a class teardown
// icon.exists is true when called as an instance teardown
        if icon.exists {
            let iconFrame = icon.frame
            let springboardFrame = springboard.frame
            icon.press(forDuration:1.3)
            springboard.coordinate(withNormalizedOffset: CGVector(dx: ((iconFrame.minX + 3) / springboardFrame.maxX), dy:((iconFrame.minY + 3) / springboardFrame.maxY))).tap()
            sleep(5)
            springboard.buttons["Delete"].firstMatch.tap()
            sleep(5)
        }
        XCUIApplication().terminate()
    }

}

Это вызывается в методе разрыва класса тестового примера, как показано ниже

override class func tearDown() {
    super.tearDown()
    let deviceSettings = DeviceSettingsUtilities()
    deviceSettings.removeApp(productName: ProductName.rawValue)
}

Это просто не удаляет приложение, но если я изменю класс func tearDown () на func tearDown (), приложение удаляется без проблем. Не уверен, что мне не хватает. Есть предложения?

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

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

Из Документация Apple :

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

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

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

class BaseClass: XCTestCase {

        static var LastTestCaseName: String = ""

        override class func setUp() {
            LastTestCaseName = defaultTestSuite.tests.last!.name
            super.setUp()
        }

        override func tearDown() {
            let app = XCUIApplication()
            if BaseClass.LastTestCaseName == testRun?.test.name {
                app.terminate()
            }
        }
    }
0 голосов
/ 07 ноября 2018

Это похоже на ошибку в последнем XCode 10. XCUIApplication.terminate() не работает в tearDown(), когда объявлено как class.

Это можно решить двумя способами:

1 / использование:

override func tearDown() {
    XCUIApplication().terminate()
    super.tearDown()
}

вместо выключенного:

override class func tearDown(){...} 

2 / по-другому завершить приложение (нажмите кнопку «Домой», откройте другое приложение ...). Однако я бы использовал первый способ.

Также рассмотрите возможность сообщения об этом Apple, чтобы они могли это исправить.

Редактировать: Это не имеет никакого отношения к состоянию приложения (XCUIApplication().state.rawValue), поскольку оно одинаково в тесте и в tearDown() (4 = running foreground). Кроме того, в официальной документации говорится, что .terminate() завершит работу приложения, которое имеет сеанс отладки с XCode, но сеанс отладки также активен в tearDown(). Так что это действительно вероятно ошибка в XCode.

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