Подтвердить что ты не робот

Как я reset данные приложения после каждого теста с тестированием интерфейса Xcode 7?

Apple представила новый тестовый интерфейс UI Test Xcode 7, но у меня есть борьба, когда тесты запускаются в приложении, и начинается с данных, которые ранее были в приложении. Это означает, что тесты не могут быть независимыми и на них могут влиять другие тесты.

Невозможно получить доступ к настройкам по умолчанию и другим данным, поскольку приложение, на котором выполняются тесты, не имеет доступа к набору тестируемого приложения. Сценарии также не могут быть рассмотрены, потому что их можно запустить до или после тестирования. И нет способа выполнить NSTask на iOS для запуска script перед каждым набором тестов.

Есть ли способ, как reset данные приложения перед каждым набором тестов?

4b9b3361

Ответ 1

Не в прямой форме. Но есть некоторые обходные пути.

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

Простой пример вашего файла main.m:

int main(int argc, char * argv[]) {
#if DEBUG
    // Reset all data for UI Testing
    @autoreleasepool {
        for (int i = 1; i < argc; ++i) {
            if (0 == strcmp("--reset-container", argv[i])) {
                NSArray *folders = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
                NSFileManager *fm = [[NSFileManager alloc] init];
                for (NSString *path in folders) {
                    [fm removeItemAtPath:path error:nil];
                }
                // Also remove documents folder if necessary...
            }
        }
    }
#endif
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil,
                                 NSStringFromClass([AppDelegate class]));
    }
}

И в -[XCTestCase setUp] добавить:

XCUIApplication *app = [[XCUIApplication alloc] init];
app.launchArguments = @[@"--reset-container"];
[app launch];

Ответ 2

При подготовке приложения для UITests внутри application:didFinishLaunchingWithOptions: в вашем случае будет нормально, вы можете сделать следующее:

В setUp() метод вашего тестового класса, расширяющий XCTestCase, добавьте следующий код:

let application = XCUIApplication()
application.launchEnvironment = ["UITESTS":"1"]
application.launch()

Затем в application:didFinishLaunchingWithOptions: вы можете проверить флаг, используя следующий код:

func application(_ application: UIApplication,
                 didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {

    let env = ProcessInfo.processInfo.environment
    if let uiTests = env["UITESTS"], uiTests == "1" {
        // do anything you want
    }
    // further set up code
}

Конечно, если это вариант для вас.

ПРИМЕЧАНИЕ. Вместо того, чтобы устанавливать "1" в качестве аргумента для флага "UITESTS", вы можете указать разные значения для разных тестовых случаев - или даже методы тестирования (но в этом случае вы должны запустить приложение из метода тестирования, а не setUp())

ПРИМЕЧАНИЕ 2. Я предлагаю обернуть код, связанный с флагом, в блок #if DEBUG.

Ответ 3

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

Сначала я добавил фазу Run script, чтобы удалить ее при запуске тестов:

/usr/bin/xcrun simctl uninstall booted com.mycompany.bundleId

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

Ответ 4

В моем случае мне также необходимы разрешения reset. И есть возможность удалить ваше приложение и reset системные разрешения, просто сделав тест, удалив приложение и перейдите к настройкам.

Уже ответил в этом S.O. thread: Есть ли способ reset приложения между тестами в Swift XCTest UI в Xcode 7?