2008-10-29 4 views
10

Я пытаюсь использовать xcodebuild и OCUnit с моим сервером непрерывной интеграции (TeamCity).Как улавливать сообщения об ошибках или события теста OCUnit

JetBrains предлагает реалистичные реализации наблюдателя для boost :: test и CppUnit, которые выводят формат теста таким образом, что TeamCity может интерпретировать. Мне нужно сделать что-то подобное для OCUnit, если я хочу его использовать.

В OCUnit существует класс SenTestObserver, но я не знаю, как именно его использовать, а OCUnit homepage, похоже, не предоставляет никакой документации по этому вопросу.

ответ

5

Вы можете написать свой собственный наблюдатель, расширив класс SenTestObserver и реализации слушателей уведомления

  • (аннулируются) testSuiteDidStart: (NSNotification *) aNotification
  • (аннулируются) testSuiteDidStop: (NSNotification *) aNotification
  • (аннулируются) testCaseDidStart: (NSNotification *) aNotification
  • (аннулируются) testCaseDidStop: (NSNotification *) aNotification
  • (аннулируются) TestCase DidFail: (NSNotification *) aNotification

затем добавьте запись в info.plist SenTestObserverClass с именем вашего класса.

По крайней мере, в версии OCUnit я знаком с SenTestObserver равными частями полезными/равными частями. Я просто пропустил его полностью и зарегистрировался для уведомлений сам в своем классе. (см. SenTestSuiteRun.h и SenTestCaseRun.h для определения имен уведомлений).

Вы можете использовать свойства теста и запуска уведомления для доступа к экземплярам SenTestSuite и SenTestSuiteRun, а экземпляр запуска содержит информацию, необходимую для фактических результатов.

2

Я внедрил простой адаптер Teamcity, вы можете просмотреть gist here. SenTestObserver не совсем сломан, она просто не придерживается лучших практик:

Это то, что вам нужно позвонить в подклассе наблюдателей, чтобы он должным образом зарегистрировано:

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

потому SenTestObserver инициализирует выглядит как это:

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

Я надеюсь, что это поможет другим там ищет адаптер Teamcity для OCUnit/SenTestingKit.

 Смежные вопросы

  • Нет связанных вопросов^_^