如何捕获OCUnit测试通过/失败消息/事件

时间:2008-10-29 17:05:03

标签: objective-c unit-testing continuous-integration ocunit

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

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

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

2 个答案:

答案 0 :(得分: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实例,运行实例包含实际结果所需的信息。

答案 1 :(得分:2)

我已经实现了一个简单的Teamcity Adapter,您可以查看gist here。 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适配器。