ios - No ejecute el simulador cuando ejecute pruebas unitarias
xcode jenkins (5)
Algunos antecedentes:
Tengo una aplicación iOS con un objetivo configurado para ejecutar unitTests. Y estoy ejecutando la herramienta de automatización de compilación jenkins en mi MacBook que automáticamente crea esta aplicación y ejecuta todas las pruebas (usando la herramienta de línea de línea xcodebuild).
Todo funcionó bien con Xcode 4. Esta herramienta de automatización de compilación se ejecutaba bajo diferentes usuarios y estaba ejecutando todas estas pruebas.
Cambié a Xcode 5 recientemente y comenzó a fallar, porque no puede ejecutar Simulator.
El problema
Tengo un esquema UnitTests que está configurado para ejecutar pruebas (pruebas lógicas). AI ejecuta estas pruebas utilizando uno de dos métodos:
Comando U en Xcode
O línea de comando "/ usr / bin / xcodebuild -scheme UnitTests -sdk iphonesimulator -configuration Liberar compilación limpia TEST_AFTER_BUILD = YES"
En ambos casos, intenta iniciar el simulador. Sin embargo, según entiendo, no lo necesita. De todos modos, se ejecuta en la parte superior x86 y no parece que las aplicaciones estén instaladas en Simulator.
¿Hay alguna manera de deshacerse de este molesto inicio de simulador (porque rompe mi automatización de compilación)?
Actualización 1
Parece que encuentra una pregunta muy similar, pero no puede hacerlo funcionar: Ejecute pruebas lógicas en Xcode 4 sin iniciar el simulador
Actualización 2
Encontré preguntas / respuestas MUY relevantes e interesantes: Apple CI / Xcode Service y Jenkins
Solución:
La aplicación continuará #if
pero puede #if
definir lo que no desea ejecutar.
Enfoque:
- Cree una configuración de compilación personalizada llamada
Test
duplicandoDebug
(Proyecto> Información> Crear nueva configuración) - En
Build Settings
>Active Compilation Conditions
paraTest
añadaTESTING
- Editar esquema> Información> Configuración de compilación, establecer la configuración de compilación como Prueba
- Use
#if !TESTING
#endif
alrededor del código que no desea ejecutar durante la prueba.
Marcos de trabajo:
Si tiene marcos incorporados, cree la misma configuración de compilación en el marco, de modo que el binario del marco esté correctamente vinculado.
He hecho la misma pregunta a los ingenieros de Apple. Desafortunadamente, no parece que puedas lograr esto y quedarte con iOS al mismo tiempo. Hay algunos trucos que puede hacer para verificar si se están realizando pruebas. Puede poner este fragmento de código en su AppDelegate.h o en alguna otra clase global para decir que no cargue un controlador de vista raíz y evitar que cualquier cosa de wierdo ui corrompa las pruebas de su unidad:
static BOOL isTesting() {
BOOL isTesting = !isEmpty([[[NSProcessInfo processInfo] environment] objectForKey:@"XCInjectBundle"]);
return isTesting;
}
También he tenido un ingeniero de manzana para verificar que este es un cheque legítimo. Y para dar crédito donde se debe crédito, esto es de: Determinar programáticamente el objetivo actual (ejecución o prueba) en el proyecto de iOS
EDITAR: También he tenido éxito con esto y es un poco más directo:
static BOOL isTesting() {
return [[[NSProcessInfo processInfo] processName] isEqualToString:@"xctest"];
}
Puede crear una prueba de unidad Mac OSX en lugar de una prueba de unidad iOS. Sin embargo, esto requiere que no incluya bibliotecas específicas de iOS en las pruebas unitarias. Puedes hacer esto a través de lo siguiente:
- Seleccione el proyecto -> el menú desplegable de destino -> "Agregar destino ..."
- Seleccione "Mac OSX" -> "Otro" -> "Paquete de prueba de unidad de cacao"
- Cree el paquete de prueba como lo haría con un proyecto normal
Ahora puede agregar fuentes a la prueba unitaria y ejecutarla como una prueba de iOS sin iniciar el simulador.
Un objetivo de prueba de osx puede convertirse en una gran molestia porque debe gestionar el archivo de origen que desea incluir. Poner @testable import YourAppName
encima de tus archivos XCTest es mucho más conveniente. Así que solo evite que se inicie su aplicación en caso de una ejecución XCTest.
En tu AppDelegate put: (Solución Swift 3)
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
{
if ProcessInfo.processInfo.environment["XCInjectBundleInto"] != nil {
return false
}
...
Esto no evitará el lanzamiento del simulador, pero le ahorrará mucho tiempo.
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 para ejecutar sin una aplicación de host.
Seleccione su proyecto -> luego pruebe el objetivo -> Establezca la aplicación de host en ninguno.
2. Instale xctool, si no lo tiene.
brew install xctool
3. Ejecute las pruebas usando terminal con xctool.
xctool -workspace yourWorkspace.xcworkspace -scheme yourScheme run-tests -sdk iphonesimulator