2

我最近在我们的代码库中添加了测试覆盖率分析,幸运的是,我期望得到很好覆盖的类的覆盖率超过了 95%。我喜欢那些达到 100% 的课程,因为这显然是目标,但是我的一些课程被困在 96-98%,因为一条线没有被击中。那一行就是@implementation ClassName那一行,我觉得这很令人困惑。

示例错过的实施行

从逻辑上讲,如果执行了该类的所有可执行行,则该类显然已实例化。

我使用标准 Xcode 方法 ( __gcov_flush()) 来生成.gcda.gcno使用数据,我使用 CoverStory 进行分析和 HTML 生成。

这不是什么大不了的事。@implementation显然这门课被很好地覆盖了,但是因为无论出于何种原因错过了当线,所以对那些不是 100% 的课程进行心理记录是很烦人的。

我找不到@implementation行命中的文件和错过行的文件之间的模式。有没有其他人经历过这种情况和/或知道我可以尝试缓解什么?也许它甚至可能是 CoverStory 的一个错误?

4

2 回答 2

3

我当前的项目也遇到了同样的问题,您可以使用以下方法修复它:

编辑:对于 XCText,它应该是 XCTAssertEqualObjects 因为 NSString * 是对象

猕猴桃:

[NSStringFromClass([[YourClass new] class]) should] equal:NSStringFromClass[YourClass class])]

或者

XCTAssertEqualObjects(NSStringFromClass([[YourClass new] class]), NSStringFromClass([YourClass class]));
于 2014-07-16T09:38:38.007 回答
0

@implementation YourClass将在该类的实例被释放时命中。

您可以确认,通过创建一个空的演示类,在 上放置一个检查点@implementation DemoClass,然后调用 [DemoClass new],调试器将在调用 [DemoClass .cxx_destruct] 时停止,这意味着该实例的 retainCount 为零并且将被释放编。

也可以通过查看 XcodeCoverage 创建的代码覆盖率 html 文件来确认;选择一个文件,单击“功能”,它将列出该文件的所有功能覆盖率报告,您将看到[DemoClass .cxx_destruct]绿色或红色的功能列表。

换句话说,如果@implementation YourClass没有被调用,则很有可能您在类实现中保留了循环/静态变量,从而阻止了您的类解除分配。(例如包含NSURLSession对象但忘记调用finishTaskAndInvalidate,或包含重复NSTimer但未调用invalidate,或者它是包含静态变量的单例类等)

于 2015-04-15T00:41:54.680 回答