2008-10-29 12 views
10

Próbuję użyć xcodebuild i OCUnit z serwerem Continuous Integration (TeamCity).Jak przechwytywać komunikaty/niepowodzenia testu OCUnit/

JetBrains oferuje testowe implementacje obserwatorów dla boost :: test i CppUnit, które testują wyjście testowe w sposób, który może zinterpretować TeamCity. Potrzebuję zrobić coś podobnego dla OCUnit, jeśli chcę go użyć.

Wygląda na to, że w OCUnit znajduje się klasa SenTestObserver, ale nie wiem, jak dokładnie powinna ona być używana, a OCUnit homepage nie wydaje żadnych dokumentów na ten temat.

Odpowiedz

5

Możesz napisać własny obserwatora poprzez rozszerzenie klasy SenTestObserver i wdrażanie słuchaczy powiadomień

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

następnie dodaj wpis do info.plist SenTestObserverClass z nazwą klasy.

Przynajmniej w wersji OCUnit, którą znam SenTestObserver jest równy częściom użyteczne/równe uszkodzone. Po prostu pomijam go i rejestruję się w powiadomieniach w mojej klasie. (patrz SenTestSuiteRun.h i SenTestCaseRun.h dla definicji nazw powiadomień).

Można użyć właściwości testu i uruchomienia powiadomienia, aby uzyskać dostęp do instancji SenTestSuite i SenTestSuiteRun, a instancja uruchomienia zawiera informacje potrzebne do rzeczywistych wyników.

2

Mam zaimplementowany prosty adapter Teamcity, możesz zobaczyć gist here. SenTestObserver nie jest dokładnie złamana, to po prostu nie przywiera do najlepszych praktyk:

To co trzeba zadzwonić w Observer podklasy, aby to poprawnie zarejestrowany:

+(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]; 
} 

ponieważ SenTestObserver na zainicjować wygląd tak:

+ (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]; 
    } 
} 

mam nadzieję, że to pomoże innym tam szuka adaptera TeamCity dla OCUnit/SenTestingKit.