2015-09-02 1 views
21

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

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

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

ответ

20

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

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]; 
+0

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

+0

@ TomášLinhart: можете ли вы поделиться своим решением? – Peacemoon

+3

Как я могу использовать это в Swift? –

6

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

В setUp() метод вашего тестового класса, распространяющийся XCTestCase add follow ИНГ код:

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.

4

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

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

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

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

0

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

Уже ответил в этом S.O. thread: Is there a way to reset the app between tests in Swift XCTest UI in Xcode 7?