Estoy tratando de escribir un caso de prueba usando la nueva Prueba de IU disponible en Xcode 7 beta 2. La aplicación tiene una pantalla de inicio de sesión donde realiza una llamada al servidor para iniciar sesión. Hay un retraso asociado con esto, ya que es una operación asincrónica.
¿Hay alguna forma de causar un retraso o mecanismo de espera en XCTestCase antes de continuar con los pasos?
No hay documentación adecuada disponible y revisé los archivos de encabezado de las clases. No pude encontrar nada relacionado con esto.
¿Alguna idea / sugerencia?
ios
ios9
xcode-ui-testing
xcode7-beta2
xctwaiter
Tejas HS
fuente
fuente
NSThread.sleepForTimeInterval(1)
debería funcionardispatch_after
,dispatch_queue
stuff)Respuestas:
Asynchronous UI Testing se introdujo en Xcode 7 Beta 4. Para esperar una etiqueta con el texto "¡Hola, mundo!" para aparecer puede hacer lo siguiente:
Se pueden encontrar más detalles sobre las pruebas de IU en mi blog.
fuente
waitForExpectationsWithTimeout
automáticamente fallará su prueba, lo cual es bastante desafortunado.app.launch()
parece simplemente relanzar la aplicación. ¿Es necesario?Además, solo puedes dormir:
Como los UITests se ejecutan en otro proceso, esto funciona. No sé qué tan aconsejable es, pero funciona.
fuente
usleep
iOS 11 / Xcode 9
¡Este es un gran reemplazo para todas las implementaciones personalizadas en este sitio!
Asegúrese de echar un vistazo a mi respuesta aquí: https://stackoverflow.com/a/48937714/971329 . ¡Allí describo una alternativa a la espera de solicitudes que reducirá en gran medida el tiempo de ejecución de sus pruebas!
fuente
XCTestCase
y funciona de maravilla. No entiendo por qué los enfoques comosleep(3)
se votan tan alto aquí, ya que extiende el tiempo de prueba artificialmente y realmente no es una opción cuando crece su conjunto de pruebas.Xcode 9 introdujo nuevos trucos con XCTWaiter
El caso de prueba espera explícitamente
Delegados de instancia de camarero para probar
La clase de camarero devuelve el resultado
uso de muestra
Antes de Xcode 9
C objetivo
USO
Rápido
USO
o
FUENTE
fuente
A partir de Xcode 8.3, podemos usar
XCTWaiter
http://masilotti.com/xctest-waiting/Otro truco es escribir una
wait
función, el crédito va a John Sundell por mostrármelo.y úsalo como
fuente
Basado en la respuesta de @ Ted , he usado esta extensión:
Puedes usarlo así
También permite esperar que un elemento desaparezca o que cambie cualquier otra propiedad (utilizando el bloque apropiado)
fuente
Editar:
En realidad, se me ocurrió que en Xcode 7b4, las pruebas de IU ahora tienen
expectationForPredicate:evaluatedWithObject:handler:
Original:
Otra forma es hacer girar el ciclo de ejecución durante un período de tiempo determinado. Realmente solo es útil si sabe cuánto tiempo (estimado) necesitará esperar
Obj-C:
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow: <<time to wait in seconds>>]]
Rápido:
NSRunLoop.currentRunLoop().runMode(NSDefaultRunLoopMode, beforeDate: NSDate(timeIntervalSinceNow: <<time to wait in seconds>>))
Esto no es súper útil si necesita probar algunas condiciones para continuar su prueba. Para ejecutar comprobaciones condicionales, use un
while
bucle.fuente
El siguiente código solo funciona con el objetivo C.
Simplemente llame a esta función como se indica a continuación.
fuente
En mi caso
sleep
creó efectos secundarios, así que uséwait
fuente
De acuerdo con la API para XCUIElement,
.exists
se puede usar para verificar si existe una consulta o no, por lo que la siguiente sintaxis podría ser útil en algunos casos.Si está seguro de que su expectativa se cumplirá eventualmente, puede intentar ejecutar esto. Cabe señalar que el bloqueo podría ser preferible si la espera es demasiado larga, en cuyo caso se
waitForExpectationsWithTimeout(_,handler:_)
debe utilizar la publicación de @Joe Masilotti.fuente
dormir bloqueará el hilo
"No se procesa el ciclo de ejecución mientras el hilo está bloqueado".
puedes usar waitForExistence
fuente
Esto creará un retraso sin poner el hilo a dormir o lanzar un error en el tiempo de espera:
Debido a que la expectativa se invierte, expirará en silencio.
fuente