【问题标题】:Unable to see Code Coverage in Xcode 4.2在 Xcode 4.2 中看不到代码覆盖率
【发布时间】:2012-02-07 08:22:31
【问题描述】:

我正在 Xcode 4.2 中创建一个 iPhone 5.0 项目,并希望在执行单元测试时找到代码覆盖率。我对 Xcode 环境很陌生,我已经按照here 提供的步骤进行操作。我能够正确修改测试目标的构建设置,并很好地链接“libprofile_rt.dylib”文件。

此时,当我执行测试(使用 Command-U)时,代码编译并且测试通过。我没有遇到here 描述的问题。另外,我已经安装了CoverStory

第一个链接中的作者提到了"Just run your unit tests and view the code coverage data as usual";但是,我找不到.../Objects-normal/i386

为了让事情顺利进行,我创建了一个具有以下类的新项目:

#import "SomeClass.h"

@implementation SomeClass
@synthesize someValue;

-(void)performWork:(BOOL)now withValue:(int)value {
    if (now) {
        someValue = value;
    }
    else {
        someValue = value - 1;
    }
}

@end

和测试类:

#import "CodeCoverageTests.h"
#import "SomeClass.h"

@implementation CodeCoverageTests

- (void)testExample {
    SomeClass *obj = [[SomeClass alloc] init];
    [obj performWork:YES withValue:3];
    STAssertEquals(obj.someValue, 3, @"Value was not 3");
}
@end

理想情况下,我希望以某种方式通知我,当测试执行时,performWork 方法中的else 子句永远不会被触发。

因此我有以下问题:

  1. 根本问题是不支持我尝试使用新编译器执行的操作吗?
  2. user chown 对我上面链接的问题所描述的唯一解决方案吗?
  3. 如果我遵循 2) 中的解决方案,我是否能够使用 CoverStory(或类似的东西)?

更新: 经过一番努力,我终于能够找到“SomeClass.gcno”和“SomeClass.gcda”文件的位置(感谢@bjhomer - 请参阅this link),他们精美地描绘了条件的if部分performWork 中的语句被覆盖(else 没有)。为了确保,我将测试修改如下:

- (void)testExample
{
    SomeClass *obj = [[SomeClass alloc] init];
    [obj performWork:NO withValue:3];
    STAssertEquals(obj.someValue, 2, @"Value was not 2");
}

在重新构建并重新执行单元测试后,我重新加载了 .gcno 和 .gcda 文件。 CoverStory 显示覆盖更改为performWork 方法的else 部分。然而,有一个小警告:

  1. 为了在...<TargetName>.build/Objects-normal/i386/ 中创建“SomeClass.gcno”和“SomeClass.gcda”文件,我需要修改<TargetName> 的构建设置(不是<TargetNameTest> 所示的here)目录。

再次感谢您的帮助!

【问题讨论】:

    标签: objective-c xcode4.2 code-coverage


    【解决方案1】:

    听起来您的主要问题是找不到Build/Intermediates/<SchemeName>.build/<ConfigurationName>-<PlatformName>/<TargetName>.build/Objects-normal/<ArchitectureName> 目录。该目录在构建时始终使用,无论您是否进行代码覆盖。这是存储编译器生成的所有中间文件的地方,也是如果您进行代码覆盖,最终的.gcno.gcda 文件应该存在的地方。如果找不到该目录,则问题与覆盖率无关,问题是您需要找到该目录。

    回答您的问题。

    1. 从 Xcode 4.2 开始,LLVM 编译器支持代码覆盖。它不适用于 LLVM-GCC,因此请确保您没有使用它。
    2. 不,没有必要在 Xcode 4.2 中破解对 GCC 4.2 的支持。我现在正在使用 Xcode 4.2 运行代码覆盖,没有完成上述任何操作。
    3. 无论哪种方式,您都应该能够使用 CoverStory;破解对 GCC 4.2 的支持不会改变构建产品的去向。

    【讨论】:

    • 感谢您的回复。我能够找到如何this response找到文件。
    猜你喜欢
    • 1970-01-01
    • 2017-06-10
    • 2012-02-02
    • 2016-11-29
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多