Как сбросить данные приложения после каждого теста с помощью Xcode 7 UI Testing?

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

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

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


person Tomáš Linhart    schedule 02.09.2015    source источник


Ответы (4)


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

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];
person Mats    schedule 02.09.2015
comment
Да, я тоже думал об этом, но надеялся на лучшее решение. В конце концов я решил расширить ваше решение, включив в него другие места и пользовательские настройки по умолчанию. - person Tomáš Linhart; 02.09.2015
comment
@TomášLinhart: не могли бы вы поделиться своим решением? - person Peacemoon; 11.09.2015
comment
Как я могу использовать это в Swift? - person Paul van Roosendaal; 02.12.2015

Если подготовка приложения для 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.

person manicaesar    schedule 30.01.2016

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

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

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

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

person odm    schedule 23.08.2016

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

Уже ответили в этом S.O. поток: Есть ли способ сбросить приложение между тестами в пользовательском интерфейсе Swift XCTest в Xcode 7?

person Eli Kohen    schedule 20.06.2017