我正在尝试将xcodebuild和OCUnit与我的持续集成服务器(TeamCity)一起使用。
JetBrains为boost :: test和CppUnit提供测试观察器实现,以TeamCity可以解释的方式格式化测试输出。如果我想使用它,我需要为OCUnit做类似的事情。
在OCUnit中似乎有一个SenTestObserver类,但我不知道应该如何使用它,OCUnit homepage似乎没有提供任何关于此事的文档。
答案 0 :(得分:5)
您可以通过扩展SenTestObserver类并实现通知侦听器来编写自己的观察者
然后使用您的类名称向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适配器。