【发布时间】: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 子句永远不会被触发。
因此我有以下问题:
- 根本问题是不支持我尝试使用新编译器执行的操作吗?
- 是user chown 对我上面链接的问题所描述的唯一解决方案吗?
- 如果我遵循 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 部分。然而,有一个小警告:
- 为了在
...<TargetName>.build/Objects-normal/i386/中创建“SomeClass.gcno”和“SomeClass.gcda”文件,我需要修改<TargetName>的构建设置(不是<TargetNameTest>所示的here)目录。
再次感谢您的帮助!
【问题讨论】:
标签: objective-c xcode4.2 code-coverage