10

我正在尝试将 xcodebuild 和 OCUnit 与我的持续集成服务器(TeamCity)一起使用。

JetBrains 为 boost::test 和 CppUnit 提供测试观察器实现,以 TeamCity 可以解释的方式格式化测试输出。如果我想使用 OCUnit,我需要为它做类似的事情。

OCUnit 中似乎有一个 SenTestObserver 类,但我不知道它应该如何使用,而且OCUnit 主页似乎没有提供任何有关此事的文档。

4

2 回答 2

5

您可以通过扩展 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)。

您可以使用通知的测试和运行属性来访问 SenTestSuite 和 SenTestSuiteRun 实例,运行实例包含实际结果所需的信息。

于 2008-12-01T00:25:34.963 回答
2

我已经实现了一个简单的 Teamcity 适配器,你可以在这里查看要点。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];
    }
}

我希望这将帮助其他寻找 OCUnit / SenTestingKit 的 teamcity 适配器的人。

于 2011-05-27T08:51:04.680 回答