Cómo ejecutar y depurar pruebas unitarias para una aplicación de iPhone

NOTA: Las pruebas unitarias son mucho más fáciles de configurar hoy en día. Este tutorial no es realmente relevante para Xcode versión 5 y superior.

Me llevó bastante tiempo, pero finalmente logré que funcionara para mi proyecto. Para crear las pruebas "lógicas" seguíPautas de Apple sobre la creación de pruebas lógicas. Esto funciona bien una vez que comprenda que las pruebas lógicas se ejecutan durante la compilación.

Para poder depurar esas pruebas es necesario crear un ejecutable personalizado que llame a esas pruebas. El artículo deSean Miceli en el blog Grokking Cocoa proporciona toda la información para hacer esto. Sin embargo, seguirlo no produjo un éxito inmediato y necesitó algunos ajustes.

Voy a repasar los pasos principales presentados en el tutorial de Sean, proporcionando un esquema "para tontos" que me llevó un tiempo descubrir:

Configure un objetivo que contenga las pruebas unitarias pero NO las ejecuteConfigura el otro ejecutable para ejecutar las pruebasConfigure las otras variables de entorno para que otras puedan encontrar sus pruebas unitarias

Lo siguiente se realizó conXCode 3.2.5

Nota para XCode 4

En XCode 4 es posible depurar las pruebas de su unidad DIRECTAMENTE. Simplemente escriba su prueba, agréguela a su objetivo como una de las pruebas y establezca un punto de interrupción en ella. Eso es todo. Más vendrá.

Paso 1: configuración del objetivoDuplique su objetivo de pruebas unitarias ubicado debajo de los objetivos de su proyecto. Esto también creará un duplicado de su producto de pruebas unitarias (archivo .octest). En la figura siguiente, "LogicTest" es el objetivo original.Cambie el nombre del objetivo de pruebas unitarias y del producto de pruebas unitarias (archivo .octest) por el mismo nombre. En la figura siguiente, "LogicTestsDebug" es el objetivo duplicado.Eliminar la fase RunScript del nuevo objetivo

El nombre de ambos puede ser cualquier cosa, pero evitaría espacios.

Paso 2 - Configuración de otest

El punto más importante aquí es obtener la mejor opción, es decir, la de su iOS actual y no la versión predeterminada de Mac. Esto está bien descrito en el tutorial de Sean. Aquí hay algunos detalles más que me ayudaron a arreglar las cosas:

Ir Proyecto-> Nuevo ejecutable personalizado. Esto abrirá una ventana que le pedirá que ingrese un Nombre ejecutable y una Ruta ejecutable.Escriba lo que desee para el nombre.Copie y pegue la ruta a su otro ejecutable de iOS. En mi caso, esto fue /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk/Developer/usr/bin/otestPresione enter. Esto lo llevará a la página de configuración de su ejecutable.Lo único que debe cambiar en este momento es seleccionar "Tipo de ruta: Relativo al SDK actual". No escriba la ruta, esto se hizo en el paso 3.Paso 3: configuración de los demás argumentos y variables de entorno

Los otros argumentos son fáciles de configurar ... Pero este resultó ser mi mayor problema. Inicialmente había nombrado mi objetivo de prueba lógica "LogicTests Debug". Con este nombre y "LogicTests Debug.octest" (con comillas) como argumento a otest, seguía teniendo otros que terminaban con el código de salida 1 y NUNCA me detenía en mi código ...

La solución: sin espacio en su nombre de destino!

Los argumentos para otest son:

-SenTest Self (o All o un nombre de prueba - escriba man otest en la terminal para obtener la lista){LogicTestsDebug} .octest - Donde {LogicTestsDebug} necesita ser reemplazado por su nombre de paquete de prueba lógica.

Aquí está la lista de variables de entorno para copiar / pegar:

DYLD_ROOT_PATH: $ SDKROOTDYLD_FRAMEWORK_PATH: "$ {BUILD_PRODUCTS_DIR}: $ {SDK_ROOT}: $ {DYLD_FRAMEWORK_PATH}"IPHONE_SIMULATOR_ROOT: $ SDKROOTCFFIXED_USER_HOME: "$ {HOME} / Library / Application Support / iPhone Simulator / User"DYLD_LIBRARY_PATH: $ {BUILD_PRODUCTS_DIR}: $ {DYLD_LIBRARY_PATH}DYLD_NEW_LOCAL_SHARED_REGIONS: YESDYLD_NO_FIX_PREBINDING: YES

Tenga en cuenta que también probé el DYLD_FORCE_FLAT_NAMESPACE, pero esto simplemente provocó el bloqueo.

Paso 4 - Ejecuta tu otro ejecutable

Para ejecutar su ejecutable otest y comenzar a depurar sus pruebas, necesita:

Establezca su objetivo activo en el objetivo de prueba de su unidad (LogicTestsDebug en mi caso)Establezca su ejecutable activo en su otro ejecutable

Puede construir y ejecutar su ejecutable y depurar sus pruebas con puntos de interrupción.

Como nota al margen, si tiene problemas para ejecutar su otro ejecutable, puede estar relacionado con:

Camino defectuoso. Inicialmente tuve muchos problemas porque estaba apuntando a la mac otest. Seguí fallando en el lanzamiento con el código de terminación 6.Argumentos defectuosos. Hasta que eliminé el espacio del nombre del paquete (.octest) seguía teniendo otro bloqueo con el código de salida 1.Ruta incorrecta en las variables de entorno. El tutorial de Sean tiene muchas preguntas de seguimiento que dan una idea de lo que otras personas intentaron. El conjunto que tengo ahora parece funcionar, así que le sugiero que comience con esto.

Es posible que reciba algún mensaje en la consola que lo lleve a pensar que algo está mal con sus variables de entorno. Es posible que observe un mensaje sobre CFPreferences. Este mensaje no impide que las pruebas se ejecuten correctamente, así que no se concentre en eso si tiene problemas para ejecutar otras.

Por último, una vez que todo esté funcionando, podrá detenerse en los puntos de interrupción de sus pruebas.

Una última cosa...

He leído en muchos blogs que la principal limitación del XCode SenTestKit integrado es que las pruebas no se pueden ejecutar al compilar la aplicación. Pues resulta que esto es, de hecho, bastante fácil de administrar. Simplemente necesita agregar su paquete de pruebas lógicas como una dependencia a su proyecto de aplicación. Esto asegurará que su paquete de pruebas lógicas esté construido, es decir, todas las pruebas se ejecuten, antes de que se construya su aplicación.

Para hacer esto, puede arrastrar y soltar su paquete de prueba lógica en el destino de su aplicación.

Respuestas a la pregunta(2)

Su respuesta a la pregunta