¿Cómo reinicio los datos de la aplicación después de cada testing con Xcode 7 UI Testing?

Apple introdujo en Xcode 7 nuevas testings de interfaz de usuario pero tengo problemas cuando las testings inician la aplicación, comienza con los datos que la aplicación tenía antes. Significa que las testings no pueden ser independientes y pueden ser influenciadas por otras testings.

No es posible acceder a los valores por defecto del usuario ni a otros datos porque la aplicación que ejecuta las testings no tiene acceso al package de la aplicación probada. Los scripts también están fuera de discusión porque pueden ejecutarse antes o después de las testings. Y no hay forma de ejecutar NSTask en iOS para ejecutar un script antes de cada set de testings.

¿Hay alguna forma de cómo restablecer los datos de la aplicación antes de cada set de testings?

No de una manera directa. Pero hay algunas soluciones.

XCUIApplication puede establecer arguments de línea de command y variables de entorno que pueden alterar el comportamiento de su aplicación.

Un ejemplo simple de su file 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])); } } 

Y en -[XCTestCase setUp] agrega:

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

Si prepara la aplicación para UITest dentro de la application:didFinishLaunchingWithOptions: está bien en su caso, puede hacer lo siguiente:

En el método setUp() de su class de testing que extiende XCTestCase agregue el siguiente código:

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

Luego, en la application:didFinishLaunchingWithOptions: puede verificar la bandera con el siguiente código:

 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 } 

Por supuesto, si esa es una opción para ti.

NOTA: en lugar de establecer "1" como argumento para el "UITESTS" , puede especificar diferentes valores para diferentes casos de testing, o incluso methods de testing (pero en tal caso, debe iniciar la aplicación desde el método de testing, no setUp() )

NOTA 2: Sugiero envolver el código que se ocupa de la bandera en #if DEBUG bloque #if DEBUG .

Conseguí restablecer los datos de la aplicación usando algunos encabezados privados para acceder al trampolín y la aplicación de configuration.

Primero agregué una fase de script Run para eliminarla cuando comienzan las testings:

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

Y después de eso utilizo la solución que escribí aquí para eliminarla usando un script de testing que se ejecuta en las llamadas de tearDown para restablecerlo después de cada testing.

En mi caso, también tuve que restablecer los permissions. Y hay una opción para eliminar su aplicación y restablecer los permissions del sistema simplemente haciendo que la testing elimine la aplicación y navegue a la configuration.

Ya respondido en este hilo SO: ¿Hay alguna manera de reiniciar la aplicación entre las testings en la interfaz de usuario Swift XCTest en Xcode 7?