无法在Xcode 4.2中看到代码覆盖率

时间:2012-01-10 22:30:09

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

我正在Xcode 4.2中创建一个iPhone 5.0项目,并希望在执行单元测试时找到代码覆盖率。我对Xcode环境很陌生,并且我遵循了here提供的步骤。我能够正确修改测试目标的Build Settings,并将“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

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

因此我有以下问题:

  1. 根本问题是不支持我尝试用新编译器做什么?
  2. 唯一的解决方案是user chown在回答上面提到的问题时所描述的解决方案吗?
  3. 如果我按照2)的解决方案,我是否可以使用CoverStory(或类似的东西)?

  4. 更新 经过一番努力,我终于找到了“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显示覆盖范围已更改为else方法的performWork部分。然而,有一个小警告:

    1. 我需要修改<TargetName>(不是<TargetNameTest>所示here)的构建设置,以便将“SomeClass.gcno”和“SomeClass.gcda”文件修改为在...<TargetName>.build/Objects-normal/i386/目录中创建。
    2. 再次感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

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

回答你的问题。

  1. 自Xcode 4.2起,LLVM编译器支持代码覆盖率。它不适用于LLVM-GCC,因此请确保您没有使用它。
  2. 不,没有必要在Xcode 4.2中支持GCC 4.2。我现在正在使用Xcode 4.2运行代码覆盖,没有完成上述任何操作。
  3. 您应该能够以任何方式使用CoverStory;黑客支持GCC 4.2不会改变构建产品的位置。