2012-09-06 14 views
27

He visto personas publicando sobre esto aquí y en otros lugares, pero no he encontrado ninguna solución que funcione. Estoy usando XCode 4.4 y tengo un conjunto de pruebas unitarias configuradas. Los he analizado todos antes en este proyecto, así que sé que pasan/fallan cuando se supone que deben hacerlo si realmente se ejecutan.Algunas de las pruebas de mi unidad no están finalizando en XCode 4.4

Tengo alrededor de 15 suites de prueba, y cada una contiene 1-7 pruebas. En la mayoría de los intentos, todas las suites de prueba terminaron (y pasaron) a excepción de 1 (FooTests). Da la advertencia:

FooTests did not finish 
    testFoo did not finish 

XCode informará que la prueba fue exitosa, independientemente de lo que ocurra en las pruebas sin terminar. Otra cosa a tener en cuenta, a veces es una prueba diferente que no terminará y, a veces, varias suites no terminarán. No he notado un caso donde todas las pruebas terminan, pero a juzgar por este comportamiento aparentemente aleatorio, creo que es posible.

Entonces, ¿esto es un error en XCode? No puedo pensar en ninguna otra razón por la que las pruebas al azar no finalicen y luego haga que XCode informe que todo fue exitoso. ¿Hay alguna solución?

+0

Han encontrado el mismo problema. Limpiar el objetivo y ejecutar la prueba parece resolver el problema cuando aparece. Creo que es un error. – timthetoolman

+0

La limpieza no funcionó para mí:/ –

+0

Tuve este problema también, pero me parece que solo parece suceder cuando no estoy ejecutando todas mis pruebas a la vez. Si edito el esquema y desactivo algunas pruebas, termino obteniendo esta advertencia de "no terminó" cuando de otra manera no lo haría. – Cruinh

Respuesta

4

Acabo de tener este problema con XC4.5DP4.

Tuve una prueba que hace un poco de trabajo en un bucle, y no hace nada más cuando se sale del bucle, y estaba recibiendo el error "no terminó".

En un intento de demostrar que la prueba estaba terminando, he añadido esto como la última línea:

NSLog(@"done"); 

No sólo el "hecho" se imprimen a la salida - ahora Xcode dice que la prueba tiene terminado.

Parece ser una solución ... vaya figura.

+0

Esto se reproduce de manera confiable para mí: si retiro nuevamente la línea de registro, Xcode vuelve a decir "no terminó". Su kilometraje, sin embargo, puede variar ... –

+0

Esto no hizo nada por mí. La prueba que no termina para mí implica una solicitud web, y es posible que no esté esperando hasta que se complete la solicitud para ejecutar el resto de la prueba. Pero tengo otras pruebas usando una solicitud web que funciona bien ... –

+0

Estoy viendo esto también ... extraño. – seanicus

2

Tenía las mismas advertencias en el Navegador de registros. Lo arreglé para mí.

En mi proyecto tengo 2 esquemas, uno para ejecutar el proyecto y otro para las pruebas unitarias.

  1. Ir a productos -> Editar Esquema ...
  2. seleccionar el esquema de unittest en el selector de esquema
  3. Seleccione el símbolo "de prueba" en la izquierda
  4. Cambiar el depurador de LLDB a GDB y presione OK
  5. Las pruebas deberían finalizar ahora. (Para mí funcionó bien)
+4

Eso me ha funcionado en el pasado, pero no funciona en este caso. –

4

Estoy usando XCode46-DP3 y acabo de resolver este problema en mis pruebas. Tengo varias pruebas que inician un servidor web y luego ejecutan una llamada http; al final de la prueba, el servidor web se detiene. En la semana pasada, estas pruebas comenzaron a tener la advertencia "no terminó". Para mí ha sido suficiente para agregar el siguiente sueño al final de estas pruebas (precisamente he añadido en el tearDown):

- (void)tearDown { 
    [self.httpServer stop]; 
    [NSThread sleepForTimeInterval:1.0]; 
    self.httpServer = nil; 
    self.urlComposer = nil; 
} 
+0

+1 por mencionar que lo pones en "tearDown". solo un comentario: ¿no deberías llamar a [Super TearDown] aquí? –

17

estoy en XCode 4.5.2. Para la prueba de unidad de aplicación, si sus suites de prueba finalizan tan rápido que la aplicación principal no está cargada correctamente antes de eso, recibirá la advertencia. Simplemente puede evitar el problema agregando un descanso al final de la prueba como sigue. No sucede para la prueba de unidad lógica.

[NSThread sleepForTimeInterval:1.0]; 
+1

He encontrado que realmente puedes hacer esto '0.0' y funciona igual de bien (y no ralentiza tus pruebas). –

+2

En una suite rápida, todavía la veo con 0.0.He puesto este código en mi función tearDown: '- (void) tearDown { static int loaded = FALSE; si (cargado!) { [NSThread sleepForTimeInterval: 1,0]; loaded = TRUE; } [super tearDown]; } ' – AlexChaffee

+0

Me acabo de enterar de esto hoy, pensé que me estaba volviendo loca, ¡gracias por la explicación! – Zhang

0

que tenían el mismo problema al ejecutar con XCode 4.6, la razón de que, en mi caso, era la inconsistencia entre el régimen y las pruebas unitarias reales en los trajes de prueba. En el esquema tuve algunos trajes marcados pero en su archivo .m se comentaron algunas pruebas unitarias.

para resolver el problema: o bien elimine el comentario de la prueba o deseleccionar el archivo/el juego en el esquema y todo se convirtió en verde de nuevo :)

para gente como yo que se olvidaron de cómo llegar al esquema de estos son los pasos necesarios :

  1. clic derecho sobre el nombre del proyecto en la sección de esquema (derecha hasta el botón de parada)
  2. elegir esquema de editar
  3. elegir la depuración prueba
  4. clic en el triángulo situado junto al proyecto de prueba de unidad y junto a cada archivo tiene una casilla de verificación
  5. archivos desactive los que ha colocado prueba de unidad en los comentarios

esperanza esto ayuda

3

El problema parece que se Sus pruebas terminan demasiado rápido para que Xcode reciba y analice los mensajes de registro que indican falla o éxito. Dormir durante 1 segundo en la última prueba del caso de prueba funcionó de manera confiable para mí, donde 0.0 no lo hizo. Para ver qué caso de prueba es el último caso de prueba, verifique la acción de prueba en el cuadro de diálogo Esquema.

he creado un caso de prueba WorkaroundForTestsFinishingTooFast separada, de un solo método:

- (void)testThatMakesSureWeDontFinishTooFast 
{ 
    [NSThread sleepForTimeInterval:1.0]; 
} 

El problema es que a medida que agrega más casos de prueba, usted tiene que asegurarse de que esta prueba es el último desarrollo del método. Eso significa eliminar y agregar esta clase de la acción Prueba, ya que no se permite reordenar casos de prueba. Por otro lado, solo estás demorando tu paquete de prueba completo en 1 segundo.

+0

Agregué el retraso en 'tearDown', no hay necesidad de preocuparse. –

2

Para mí, la solución fue adelgazar la salida de registro de las partes de la aplicación que las pruebas estaban probando. Creo que xcode no pudo analizar el resultado de las pruebas a tiempo debido a la otra salida que tuve en toda la aplicación.

Cuestiones relacionadas