我正在使用Xcode 4.2创建一个iPhone 5.0项目,并希望在执行单元测试时查找代码覆盖率。我对Xcode环境很陌生,但已按照此处提供的步骤进行了操作。我能够正确地修改测试目标的构建设置,并成功链接"libprofile_rt.dylib"文件。
此时,当我执行测试(使用Command-U)时,代码编译并测试通过。我没有遇到这里描述的问题。此外,我已安装了CoverStory。
第一个链接中的作者提到"只需运行您的单元测试,然后像往常一样查看代码覆盖数据"; 然而,我找不到
此时,当我执行测试(使用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
子句从未触发。
因此,我有以下问题:
- 根本问题是新编译器不支持我尝试做的事情吗?
- 唯一的解决方案是上面链接的问题中 user chown 描述的那个吗?
- 如果我遵循 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
部分。不过需要注意以下小细节:
- 为了创建"SomeClass.gcno"和"SomeClass.gcda"文件在
...<TargetName>.build/Objects-normal/i386/
目录下,我需要修改<TargetName>
的构建设置(而不是像这里所示的<TargetNameTest>
)。
再次感谢您的帮助!