Xcode5代码覆盖率(来自CI构建的cmd-line)

Jas*_*ues 14 code-coverage objective-c lcov xcode5

如何使用Xcode 5和iOS7生成代码覆盖?

在升级之前,我得到的代码覆盖率很好.现在我看不到正在生成任何*.gcda文件.

我正在使用的cmd-line是:

xcodebuild -workspace ${module.name}.xcworkspace test -scheme ${module.name} -destination OS=${module.sdk.version},name=iPad -configuration Debug
Run Code Online (Sandbox Code Playgroud)

适用于AppCode

  • 当我通过AppCode执行测试时,我可以看到在〜/ Library/Caches/appCode20/DerivedData中生成*.gcda文件...我需要这个来为我的持续集成构建工作.

适用于Xcode IDE

  • 也适用于Xcode IDE...是否有一个cmd-line会产生覆盖,或者这是一个Xcode错误?

Sul*_*han 15

以下是一个修复SenTestKit- 只需将此类添加到您的测试目标.应该可以做类似的事情XCTest

@interface VATestObserver : SenTestLog

@end

static id mainSuite = nil;

@implementation VATestObserver

+ (void)initialize {
    [[NSUserDefaults standardUserDefaults] setValue:@"VATestObserver" forKey:SenTestObserverClassKey];

    [super initialize];
}

+ (void)testSuiteDidStart:(NSNotification*)notification {
    [super testSuiteDidStart:notification];

    SenTestSuiteRun* suite = notification.object;

    if (mainSuite == nil) {
        mainSuite = suite;
    }
}

+ (void)testSuiteDidStop:(NSNotification*)notification {
    [super testSuiteDidStop:notification];

    SenTestSuiteRun* suite = notification.object;

    if (mainSuite == suite) {
        UIApplication* application = [UIApplication sharedApplication];
        [application.delegate applicationWillTerminate:application];
    }
}
Run Code Online (Sandbox Code Playgroud)

并添加

extern void __gcov_flush(void);

- (void)applicationWillTerminate:(UIApplication*)application {
    __gcov_flush();
}
Run Code Online (Sandbox Code Playgroud)

这为什么有效?

测试和测试的应用程序是单独编译的.测试实际上是注入到正在运行的应用程序中,因此__gcov_flush()必须在应用程序内部而不是在测试内部调用.

小魔术与观察者只能使我们能够检查时,测试将要结束,我们触发__gcov_flush()内部应用程序被调用.

  • 在某些库或标题中定义了__gcov_flush?我收到链接错误 (5认同)
  • 刚尝试从+ testSuiteDidStop调用__gcov_flush():没有-applicationWillTerminate:.它适用于单元测试. (3认同)

Jas*_*ues 0

更新:新接受的答案

在某些情况下,覆盖范围刷新需要在应用程序本身内部完成。该问题中的解决方案大纲提供了详细信息。