Как перехватить сообщения / события прохождения / отказа теста OCUnit - PullRequest
10 голосов
/ 29 октября 2008

Я пытаюсь использовать xcodebuild и OCUnit с моим сервером непрерывной интеграции ( TeamCity ).

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

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

Ответы [ 2 ]

5 голосов
/ 01 декабря 2008

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

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

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

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

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

2 голосов
/ 27 мая 2011

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

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

+(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.

...