我正在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
子句永远不会被触发。
因此我有以下问题:
更新
经过一番努力,我终于找到了“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
部分。然而,有一个小警告:
<TargetName>
(不是<TargetNameTest>
所示here)的构建设置,以便将“SomeClass.gcno”和“SomeClass.gcda”文件修改为在...<TargetName>.build/Objects-normal/i386/
目录中创建。 再次感谢您的帮助!
答案 0 :(得分:1)
听起来您的主要问题是找不到Build/Intermediates/<SchemeName>.build/<ConfigurationName>-<PlatformName>/<TargetName>.build/Objects-normal/<ArchitectureName>
目录。无论您是否正在进行代码覆盖,该目录在构建时都会始终使用。这就是存储编译器生成的所有中间文件的位置,如果您正在进行代码覆盖,那么也应该存在最终的.gcno
和.gcda
文件。如果找不到该目录,则该问题与coverage无关,问题是您需要找到该目录。
回答你的问题。