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

4
我正在使用Xcode 4.2创建一个iPhone 5.0项目,并希望在执行单元测试时查找代码覆盖率。我对Xcode环境很陌生,但已按照此处提供的步骤进行了操作。我能够正确地修改测试目标的构建设置,并成功链接"libprofile_rt.dylib"文件。
此时,当我执行测试(使用Command-U)时,代码编译并测试通过。我没有遇到这里描述的问题。此外,我已安装了CoverStory
第一个链接中的作者提到"只需运行您的单元测试,然后像往常一样查看代码覆盖数据"; 然而,我找不到.../ 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),它们很好地描绘了performWork中条件语句的if部分被覆盖了(而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. 为了创建"SomeClass.gcno"和"SomeClass.gcda"文件在...<TargetName>.build/Objects-normal/i386/目录下,我需要修改<TargetName>的构建设置(而不是像这里所示的<TargetNameTest>)。

再次感谢您的帮助!

1个回答

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的支持不会改变构建产品的位置。

谢谢您的回复。我能够从这个回答中找到如何查找文件的方法。 - Meesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接