objective-c xcode tdd ios-simulator ocunit

objective c - Ejecutar pruebas lógicas en Xcode 4 sin iniciar el simulador



objective-c tdd (7)

Quiero ejecutar pruebas en Xcode 4 usando OCUnit sin iniciar el simulador. Por favor, no intente convencerme de que estoy haciendo una prueba de unidad mal o algo así. Me gusta hacer TDD de la manera tradicional: escriba la API para la clase en las pruebas, luego haga que la clase pase las pruebas. Escribiré pruebas separadas que son de extremo a extremo que se ejecutan en el simulador.

Si no hay manera de hacer esto, ¿puede alguien decirme cómo hacer que el arnés de prueba no ejemplifique toda la aplicación? Mi aplicación está dirigida a eventos, y envía un montón de eventos a través de cuándo comienza ese desastre con mis pruebas.


¿Alguien puede decirme cómo hacer que el arnés de prueba no ejemplifique toda la aplicación? Mi aplicación está dirigida a eventos, y envía un montón de eventos a través de cuándo comienza ese desastre con mis pruebas.

Yo uso las pruebas incorporadas de Xcode 4. La creación de instancias de aplicaciones puede parecer una molestia, pero mientras escribo en Xcode Unit Testing: Lo bueno, lo malo, lo feo , hace posible escribir pruebas sin distinguir entre pruebas lógicas y pruebas de aplicaciones. Específicamente, me permite escribir pruebas unitarias para controladores de vista.

Esto es lo que hago para evitar mi secuencia de inicio completa:

Editar el esquema

  • Seleccione la acción de prueba
  • En "Prueba" selecciona la pestaña Argumentos.
  • Deshabilitar "Usar las opciones de la acción Ejecutar"
  • Agregue una variable de entorno, configurando runningTests en YES

Edita el delegado de tu aplicación

  • Agregue lo siguiente a -application:didFinishLaunchingWithOptions: tan pronto como tenga sentido:

    #if DEBUG if (getenv("runningTests")) return YES; #endif

  • Haga lo mismo para -applicationDidBecomeActive: pero simplemente return .

Actualización: He cambiado mi enfoque. Vea Cómo cambiar fácilmente su delegado de aplicación para pruebas .


En la última versión de xcode (5.0.2) puedes hacerlo de una manera muy fácil. Elija su objetivo de prueba, pestaña "General". Establezca "Ninguno" en el campo "Objetivo". Luego toque la pestaña "Fases de la construcción" y elimine su objetivo principal de "Dependencias de destino".


En su situación, asumo que tiene un objetivo de Pruebas lógicas y Pruebas de aplicación (si no es así, debe hacerlo). En la configuración de sus esquemas, usted define qué objetivos se construyen para el esquema ''Prueba''. Si las pruebas de la aplicación no se están ejecutando, el simulador no se iniciará.

Sospecho que podría estar intentando ejecutar ''pruebas lógicas'' en un objetivo ''Pruebas de aplicación'' (como el creado por defecto por Xcode). Vea más sobre esta diferencia here (y cómo configurarla).


He usado GHUnit para crear suites de prueba compatibles con osx / ios. hay algunos problemas, pero encontré que era más confiable / compatible / directo que OCUnit.

GHUnit proporciona proyectos de plantillas básicas para OS X y iOS, lo que simplifica la configuración inicial.

Nota: generalmente solo uso mi propio kit para la mayoría de mis pruebas.


Se señaló en una respuesta anterior que las pruebas lógicas son lo correcto para este escenario. Me costó mucho conseguir que las pruebas lógicas funcionaran con XCode versión 4.3.2 (4E2002). Mirar el proyecto de prueba de unidad de muestra de Apple me ayudó a entender cómo hacerlo con una separación clara. En ese ejemplo, la lógica prueba los archivos de prueba del destino de la biblioteca, no el objetivo de la aplicación. El modelo se encapsuló en una biblioteca que luego se vinculó con el objetivo principal y el objetivo de las pruebas lógicas. El objetivo de la aplicación contenía solo vistas y controladores.

Basado en este modelo, esto es lo que hice para que mis pruebas lógicas funcionen correctamente. Cree un nuevo objetivo (Cocoa Touch Static Library) y mueva todos los archivos para que sean probados lógicamente (generalmente todos sus modelos) a este nuevo objetivo. En la configuración de "Fases de compilación", agregue esta nueva biblioteca en "Vincular binarios con bibliotecas" de su objetivo de aplicación y su objetivo de pruebas lógicas.

Puedo imaginar que estas instrucciones son un poco confusas. Si analiza el proyecto de muestra que se menciona anteriormente, tendrá una mejor idea.


Nota, no probado en Xcode 5.

Utilicé la respuesta de @jon-reid, pero descubrí que Xcode agrega variables de entorno a la parte de xcuserstated de XcodeProjects, y éstas son específicas del usuario y no suelen estar comprometidas con el repositorio. Por lo tanto, elijo mi AppDelegate para anular su carga:

@implementation MyAppDelegate (Testing) + (void)initialize { SEL new = @selector(application:didFinishLaunchingWithOptions:); SEL orig = @selector(swizzled_application:didFinishLaunchingWithOptions:); Class c = [self class]; Method origMethod = class_getInstanceMethod(c, orig); Method newMethod = class_getInstanceMethod(c, new); if (class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))) { class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod)); } else { method_exchangeImplementations(origMethod, newMethod); } } - (BOOL)swizzled_application:(id)app didFinishLaunchingWithOptions:(id)opts { return YES; } @end

Tenga en cuenta que lo siguiente es más simple y aún funciona, aunque no estoy seguro de que sea confiable:

@implementation MyAppDelegate (Testing) - (BOOL)application:(id)app didFinishLaunchingWithOptions:(id)opts { return YES; } @end

Esto funciona porque las categorías de métodos en componentes cargados dinámicamente (como el paquete de prueba) tienen prioridad. Aunque Swizzling se siente más seguro.


Usando xCode 7 y xctool

xctool es capaz de ejecutar pruebas unitarias sin el simulador.

Para que esto funcione,

1. Actualice la configuración de destino ejecutada sin una aplicación de host.

Seleccione su proyecto -> luego pruebe el objetivo -> Establezca la aplicación host en ninguna.

2. Instala xctool, si no lo tienes.

brew install xctool

3. Ejecute las pruebas utilizando el terminal con xctool.

xctool -workspace yourWorkspace.xcworkspace -scheme yourScheme run-tests -sdk iphonesimulator