ios - tutorials - test swift
¿Cómo puede mi prueba XCode UI detectar que la pantalla ha cambiado? (3)
Asumiendo que le ha dado a sus controladores de vista los identificadores adecuados (para que pueda distinguir entre ellos), puede agregar esto a los controladores de vista involucrados:
#ifdef UITESTING
- (void) viewDidAppear: animated
{
[super viewDidAppear: animated];
// do your checking here
}
#endif
En el objetivo de prueba de su proyecto, debajo de la configuración de compilación hay una sección Proprocesador. Allí puede establecer macros Preprocesador. Simplemente agregue ''UITESTING = 1'' a la configuración de depuración y / o liberación. El efecto es que en su construcción de prueba se definirá UITESTING, de modo que todo el código bajo #ifdef UITESTING será incluido por el preprocesador.
Intento crear un "tree walker" utilizando la funcionalidad XCTest UI testing de XCode 7 que explora sistemáticamente un árbol determinista de vistas de tabla a una profundidad específica. Casi funciona, excepto que no puedo detectar de manera confiable si el toque en cualquier elemento dado realmente ha activado una transición a una nueva pantalla. Tengo un método hacky que funciona la mayor parte del tiempo, que es detectar que la etiqueta de la barra de navegación ha cambiado O que la cantidad de elementos del menú ha cambiado.
La primera prueba tiene falsos negativos, porque las pantallas sucesivas pueden tener etiquetas de barra de navegación idénticas (la base de código que estoy caminando no es mía). La segunda prueba tiene falsos positivos, porque a veces al hacer clic en un elemento de la tabla no pasa a otra tabla / pantalla, sino que agrega elementos adicionales a la pantalla actual.
Después de leer un poco, parecía que usar etiquetas de accesibilidad podría ser el camino a seguir. Así que establecí un UID para la etiqueta de accesibilidad de la barra de navegación en el código de la aplicación (en viewDidAppear) y luego lo compruebo en el código de la prueba UI. Parece que esto debería funcionar, pero solo obtengo un valor nulo en el código de prueba.
Confieso libremente que soy un novato en lo que respecta a las pruebas de UI y principalmente estoy cortando / pegando / adaptando el código de otras personas sin tener una comprensión clara de lo que estoy haciendo. Así que probablemente estoy cometiendo algún tipo de error ingenuo, en el código de la etiqueta de accesibilidad y posiblemente en el nivel conceptual para detectar que la pantalla ha cambiado; tal vez haya algo mucho más simple / más idiomático que podría estar haciendo.
En la aplicacion:
- (void)viewDidAppear: (BOOL)animated {
[super viewDidAppear: animated];
//...
UINavigationBar* navBar = self.navigationController.navigationBar;
if( navBar )
{
static NSInteger s_UID = 0;
navBar.topItem.accessibilityLabel = [NSString stringWithFormat:@"UID-%ld", s_UID++];
}
}
En la prueba de UI de XCTest:
- (NSString*) navBarAccessibilityLabel: (XCUIApplication*) app
{
NSString* result = NULL;
XCUIElementQuery *navBars = app.navigationBars;
XCUIElement* firstElem = [navBars.staticTexts elementBoundByIndex:0];
if( firstElem )
{
result = (NSString*)firstElem.accessibilityLabel; // This is always nil
}
return result;
}
Tenga en cuenta que firstElem IS se encuentra, y que puedo extraer, por ejemplo, firstElem.label de él muy felizmente.
Cualquier ayuda apreciada.
Puedes probar si los elementos son accesibles:
Haga clic con el botón izquierdo dentro de una prueba de UI y comience a grabar, se iniciará el simulador y podrá hacer clic en el elemento dentro del simulador. Si el elemento es accesible, Xcode escribirá el código de prueba dentro del método testExample.
O ejecute su aplicación en el simulador y abra el Inspector de Accesibilidad, y desplace el cursor sobre el elemento ya que los detalles aparecerán en el Inspector.
Además de eso, creo que en su caso podría verificar esto agregando un título de elemento de navegación para cada pantalla, es decir self.navigationItem.title = @"myScreen";
Y luego verifique la pantalla con una aserción, es decir,
// let app = XCUIApplication() // Swift
UIApplication *app = [UIApplication alloc] init]; // Objective-C
XCTAssertEqual(app.navigationBars.element.identifier, "myScreen") // Don''t forget to import class XCTest
Usaría la prueba de instantáneas usando la biblioteca de prueba Snapshot de Facebook .
Las pruebas basadas en la vista significan que lo que el usuario ve es lo que desea que el usuario vea. Hacer esto significa poder garantizar que las diferentes versiones de sus vistas, o diferentes estados de sus vistas, sigan teniendo el mismo aspecto. Las pruebas basadas en la vista se pueden usar para proporcionar una prueba de alto nivel que cubre una gran cantidad de casos de uso que rodean un objeto.
Puede encontrar un gran artículo con más detalles aquí.