【问题标题】:How do I trap OCUnit test pass/failure messages/events如何捕获 OCUnit 测试通过/失败消息/事件
【发布时间】:2008-10-29 17:05:03
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以通过扩展 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 实例,运行实例包含实际结果所需的信息。

    【讨论】:

      【解决方案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 适配器的人。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        相关资源
        最近更新 更多