ios - ¿Cómo restablezco los datos de la aplicación después de cada prueba con Xcode 7 UI Testing?
xcode7 ui-testing (4)
Apple introdujo en Xcode 7 nuevas pruebas de interfaz de usuario, pero tengo problemas cuando las pruebas inician la aplicación, comienza con los datos que la aplicación tenía antes. Significa que las pruebas no pueden ser independientes y pueden ser influenciadas por otras pruebas.
No es posible acceder a los valores predeterminados del usuario ni a otros datos porque la aplicación que está ejecutando pruebas no tiene acceso al paquete de la aplicación probada. Los scripts también están fuera de discusión porque se pueden ejecutar antes o después de la prueba. Y no hay forma de ejecutar NSTask en iOS para ejecutar un script antes de cada prueba.
¿Hay alguna manera de restablecer los datos de la aplicación antes de cada conjunto de pruebas?
En mi caso he requerido también restablecer los permisos. Y hay una opción para eliminar su aplicación y restablecer los permisos del sistema simplemente haciendo que la prueba elimine la aplicación y navegue a la configuración.
Ya respondí en este hilo SO: ¿Hay una manera de restablecer la aplicación entre las pruebas en Swift XCTest UI en Xcode 7?
No de una manera directa hacia adelante. Pero hay algunas soluciones alternativas.
La aplicación XCUIApplication
puede establecer argumentos de línea de comando y variables de entorno que pueden alterar el comportamiento de su aplicación.
Un ejemplo simple de su archivo 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]
agregue:
XCUIApplication *app = [[XCUIApplication alloc] init];
app.launchArguments = @[@"--reset-container"];
[app launch];
Pude restablecer los datos de la aplicación utilizando algunos encabezados privados para acceder al trampolín y la aplicación de configuración.
Primero agregué una fase de ejecución de script para eliminarla cuando se inician las pruebas:
/usr/bin/xcrun simctl uninstall booted com.mycompany.bundleId
Y después de eso, uso la solución que escribí here para eliminarla usando un script de prueba que se ejecuta en las llamadas tearDown
para restablecerla después de cada prueba.
Si está preparando la aplicación para UITests dentro de la application:didFinishLaunchingWithOptions:
está bien en su caso, entonces puede hacer lo siguiente:
En el método setUp()
de su clase de prueba extendiendo XCTestCase
agregue el siguiente código:
let application = XCUIApplication()
application.launchEnvironment = ["UITESTS":"1"]
application.launch()
Luego, en la application:didFinishLaunchingWithOptions:
puedes verificar la bandera usando 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 prueba, o incluso métodos de prueba (pero en tal caso, debe iniciar la aplicación desde el método de prueba, no setUp()
)
NOTA 2: sugiero que incluya el código que trata la bandera en el bloque #if DEBUG
.