objective-c unit-testing continuous-integration ocunit

objective c - ¿Cómo atrapo OCUnit test pass/failure messages/events?



objective-c unit-testing (2)

Puede escribir su propio observador extendiendo la clase SenTestObserver e implementando los oyentes de notificación

  • (void) testSuiteDidStart: (NSNotification *) aNotification
  • (void) testSuiteDidStop: (NSNotification *) aNotification
  • (void) testCaseDidStart: (NSNotification *) aNotification
  • (void) testCaseDidStop: (NSNotification *) aNotification
  • (void) testCaseDidFail: (NSNotification *) aNotification

luego agregue una entrada a la info.plist SenTestObserverClass con el nombre de su clase.

Al menos en la versión de OCUnit que estoy familiarizado con SenTestObserver, hay partes iguales de partes útiles / iguales rotas. Simplemente lo omito por completo y me registro para las notificaciones en mi propia clase. (Consulte SenTestSuiteRun.hy SenTestCaseRun.h para conocer las definiciones de los nombres de las notificaciones).

Puede usar las propiedades de prueba y ejecución de la notificación para acceder a las instancias SenTestSuite y SenTestSuiteRun, y la instancia de ejecución contiene la información necesaria sobre los resultados reales.

Estoy tratando de usar xcodebuild y OCUnit con mi servidor de Integración Continua ( TeamCity ).

JetBrains ofrece implementaciones de observadores de prueba para boost :: test y CppUnit que dan formato a la salida de prueba de una manera que TeamCity puede interpretar. Necesito hacer algo similar para OCUnit si quiero usarlo.

Parece que hay una clase SenTestObserver en OCUnit, pero ignoro exactamente cómo debería usarse, y la página principal de OCUnit no parece proporcionar ninguna documentación sobre el asunto.


Implementé un Adaptador Teamcity simple, puedes ver la esencia aquí . SenTestObserver no está exactamente roto, simplemente no se adhiere a las mejores prácticas:

Esto es lo que necesita llamar en su subclase Observer para que esté correctamente registrada:

+(void)initialize { [[NSUserDefaults standardUserDefaults] setValue:@"TeamCityAdapter" forKey:@"SenTestObserverClass"]; // we need to force SenTestObserver to register us as a handler // SenTestObserver is properly guarding against this invocation so nothing bad will hapen // but this is required (bad design on SenTestObserver''s side)... [super initialize]; }

porque la inicialización de SenTestObserver se ve así:

+ (void) initialize { if ([self class] == [SenTestObserver class]) { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSDictionary *registeredDefaults = [NSDictionary dictionaryWithObjectsAndKeys: @"SenTestLog" , @"SenTestObserverClass", nil]; [defaults registerDefaults:registeredDefaults]; [NSClassFromString ([defaults objectForKey:@"SenTestObserverClass"]) class]; // make sure default observer is loaded } if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"SenTestObserverClass"] isEqualToString:NSStringFromClass(self)]) { [self setCurrentObserver:self]; } }

Espero que esto ayude a otros que buscan un adaptador teamcity para OCUnit / SenTestingKit.