2008-10-29 7 views
10

Estoy tratando de usar xcodebuild y OCUnit con mi servidor de integración continua (TeamCity).Cómo atrapo OCUnit test pass/failure messages/events

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 el OCUnit homepage no parece proporcionar ninguna documentación sobre el asunto.

Respuesta

5

Usted puede escribir su propio observador extendiendo la clase SenTestObserver e implementación de los oyentes de notificación

  • (void) testSuiteDidStart: (NSNotification *) aNotification
  • (void) testSuiteDidStop: (NSNotification *) aNotification
  • (void) testCaseDidStart: (NSNotification *) aNotification
  • (void) testCaseDidStop: (NSNotification *) aNotification
  • (void) caso_prueba DidFail: (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 estoy familiarizado con SenTestObserver es partes iguales 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.

2

He implementado un Adaptador de Teamcity simple, puede ver el gist here. SenTestObserver no se rompe exactamente, sino que simplemente no se adhiere a las mejores prácticas:

Esto es lo que hay que llamar en su subclase observador el que debidamente registrados:

+(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 SenTestObserver de inicializar miradas de esta manera:

+ (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 ayudará a otros por ahí en busca de un adaptador para TeamCity OCUnit/SenTestingKit.

Cuestiones relacionadas