Pregunta

Estoy en el proceso de migración de mi proyecto de Xcode 4.6.3 a Xcode 5.0.2.El proyecto de la unidad de pruebas se desarrollaron con SenTestingKit/OCUnit.Ahora, cuando estoy ejecutando las pruebas en Xcode 5, me sale un error de la RunUnitTests el script me dice que

RunUnitTests es obsoleto.

Posiblemente relacionado es esta nota en el Xcode 5 notas de la versión:

SenTestingKit y OCUnit están en desuso.Utilice el migrator para mover a XCTest.

Por desgracia, no he sido capaz de averiguar más acerca de este misterioso "migrator".Posiblemente mi google-fu falta [de nuevo], así que mi pregunta principal es:¿Cómo puedo migrar de la unidad de pruebas de SenTestingKit/OCUnit a la nueva XCTest (con o sin el "migrator")?

Una cuestión secundaria, en caso de que la migración es un asunto complicado:Es posible conseguir Xcode 5 para ejecutar las pruebas unitarias que aún se basan en los SenTestingKit/OCUnit?Después de todos estos, simplemente están en desuso, por lo que debe ser alrededor y funcional.

¿Fue útil?

Solución

Gracias a Shaggy de Rana respuesta sabemos que el misterioso "migrator" que se menciona en las notas de la versión de Xcode es un mago lanzó seleccionando "Editar > Refactor > Convertir A XCTest".Voy a escribir acerca de mi experiencia con este asistente en dos partes.La primera parte es una respuesta incompleta a la pregunta principal, la segunda parte responde a la cuestión secundaria.


Parte 1:Cómo migrar de OCUnit a XCTest

La primera cosa que usted necesita es darse cuenta de que para que el asistente de trabajo, usted necesita para seleccione una prueba de unidad de destino.Si usted tiene el principal objetivo seleccionado, el asistente simplemente no muestra ninguna lista de objetivos para convertir.

Una vez que me enteré de esto, yo era capaz de paso a través de la asistente, pero en mi caso el resultado final era todavía un fracaso espectacular!El asistente afirmó que no de origen de los cambios eran necesarios y que sólo opciones de generación necesitaba ser actualizada para migrar a XCTest.En la final, el asistente de no hacerlo correctamente:Es ¿ eliminar la referencia a la SenTestingKit marco, pero lo hizo no poner en una referencia a la XCTest marco.

De todos modos, lo que sigue es una lista de los cambios que tuve que hacer manualmente porque el asistente no pudo hacer por mí.Si el asistente funciona mejor para usted, usted no necesita hacer todas estas cosas.

  1. Quitar el "Ejecutar Script" fase de construcción de la prueba de la unidad de destino
  2. Cambiar la clase base de todos los casos de prueba clases de SenTestCase a XCTestCase
  3. Cambio de la importación de cabecera de <SenTestingKit/SenTestingKit.h> a <XCTest/XCTest.h>
  4. En la prueba del objetivo Construir la Configuración, cambio de Contenedor de Extensión de octest a xctest.
  5. Cambiar el nombre de todos afirman que las macros ST* a XCT* (por ejemplo, STAssertTrue se convierte en XCTAssertTrue)
  6. Excepción a lo anterior: STAssertEquals se necesita cambiar el nombre a XCTAssertEqual (observe que falta la "s" al final).Usted sabrá que usted ha olvidado esto si usted recibe esta advertencia del compilador: warning: implicit declaration of function 'XCTAssertEquals' is invalid in C99
  7. El nuevo XCTest afirmar macros no permiten nil pueden pasar como la descripción de error.Por ejemplo, XCTAssertNotNil(anObject, nil) no es posible y debe ser cambiado a XCTAssertNotNil(anObject).Usted sabrá que usted tiene este problema cuando usted recibe este error del compilador: error: called object type 'NSString *' is not a function or function pointer.
  8. Si ¿ es necesario pasar una descripción de error, el nuevo XCTest afirmar macros requieren una expresión de la constante para el especificador de formato, así como el NSString método de clase stringWithFormat: no.Usted sabrá que usted tiene este problema cuando usted recibe este error del compilador: error: expected ')'.Algunos ejemplos:
NSString* formatSpecifier = @"%@";
NSString* failureDescription = @"foo";
// These are OK
XCTAssertNotNil(anObject, @"foo")
XCTAssertNotNil(anObject, @"%@", failureDescription)
// These are not OK
XCTAssertNotNil(anObject, failureDescription);
XCTAssertNotNil(anObject, formatSpecifier, failureDescription);

Por último, pero no menos importante, como ya se ha mencionado más arriba, la referencia a la XCTest marco debe ser añadido a la prueba de la unidad de destino.Usted sabrá que usted ha olvidado de esto si usted consigue enlazador de errores tales como Undefined symbols for architecture i386: "_OBJC_CLASS_$_XCTestCase", referenced from: foo.

Xcode 6 actualización:La vinculación con XCTest que ya no es necesaria en Xcode 6 (de hecho XCTest no está en la lista como un marco más).En lugar de la compilación en la configuración de CLANG_ENABLE_MODULES para SÍ (expuesto en la interfaz de usuario como "Habilitar los Módulos C y Objective-C)").Esto hará que clang vincular automáticamente contra XCTest cuando se ve a un #import <XCTest/XCTest.h> declaración.Los detalles están disponibles en el Sección "módulos" de la clang documentación.


Parte 2:Cómo ejecutar OCUnit pruebas en Xcode 5

En este punto tengo un error del vinculador que me hizo darme cuenta de que mi misión para migrar a XCTest había fallado.La razón:XCTest no es parte de SDK 6.1, pero todavía estoy construyendo mi proyecto con base SDK de iOS 6.1 (este MODO de respuesta explica cómo integrar el SDK de 6.1 en Xcode 5).

Ya no puedo continuar con la migración, mi solución por el momento es por lo tanto para mantener mi unidad de pruebas basadas en SenTestingKit/OCUnit, hasta que encontrar el tiempo para actualizar mi aplicación para iOS 7.Esto es lo que tenía que hacer en el fin de conseguir la unidad de pruebas a ejecutar:

  1. Quitar el "Ejecutar Script" fase de construcción de la prueba de la unidad de destino.Esto es todo lo que se requiere para permitir que Xcode ejecutar pruebas unitarias a través de la "Prueba" de la acción ( + U) mientras que la prueba de la unidad de destino seleccionado.
  2. Esto no es lo ideal, sin embargo, porque yo no quiero cambiar de objetivos sólo para ejecutar las pruebas unitarias.En lugar de ello quiero ejecutar las pruebas unitarias mientras que el objetivo principal es seleccionado.El segundo paso es modificar el objetivo principal del Xcode sistema para que cuando ejecuto el "Test" de la acción, la prueba de la unidad de destino de las pruebas se ejecutan en su lugar.

La solución final no es tan bueno como en Xcode 4.x donde la unidad de pruebas se ejecuta automáticamente cada vez que me encontré con el objetivo principal de "Ejecutar" o "Construir" la acción.Por desgracia, parece que yo no puedo conseguir que esto funcione, sin una "Ejecutar Script" fase de construcción.

Otros consejos

Editar -> Refactor -> Convertir a XCTEST

Las pruebas de OCUNIT seguirán funcionando, pero también podría migrar.Los cambios terminan siendo bastante mínimos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top