我正在使用Visual Studio 2015 Update 3
。
我无法在这个简单的Unit Test
上获得100%的代码覆盖率:
TEST_METHOD(New)
{
int* test = new int(4); //shows the line as partially covered
int* test2 = new int; //shows line as 100% covered
}
如果语句也在测试函数调用的代码中,则会发生这种情况。
从项目的默认设置更改的唯一设置是/profile
开关,这对于首先使代码覆盖率起作用是必要的。
我注意到new
在没有initializer
的情况下使用时显示100%
覆盖率,但对于类我通常会立即初始化它们,我想找到一种方法来实现它而不会减少代码覆盖率。
代码反汇编
int* test = new int(4); //shows the line as partially covered
0F951D53 push 4
0F951D55 call operator new (0F9512B2h)
0F951D5A add esp,4
0F951D5D mov dword ptr [ebp-0ECh],eax
0F951D63 cmp dword ptr [ebp-0ECh],0
0F951D6A je UnitTest1::UnitTest1::New+56h (0F951D86h)
0F951D6C mov eax,dword ptr [ebp-0ECh]
0F951D72 mov dword ptr [eax],4
0F951D78 mov ecx,dword ptr [ebp-0ECh]
0F951D7E mov dword ptr [ebp-100h],ecx
0F951D84 jmp UnitTest1::UnitTest1::New+60h (0F951D90h)
0F951D86 mov dword ptr [ebp-100h],0
0F951D90 mov edx,dword ptr [ebp-100h]
0F951D96 mov dword ptr [test],edx
int* test2 = new int; //shows line as 100% covered
0F951D99 push 4
0F951D9B call operator new (0F9512B2h)
0F951DA0 add esp,4
0F951DA3 mov dword ptr [ebp-0F8h],eax
0F951DA9 mov eax,dword ptr [ebp-0F8h]
0F951DAF mov dword ptr [test2],eax
查看代码,我猜测jmp
语句会导致代码覆盖率分析工具看到某些语句未被命中。
答案 0 :(得分:2)
您似乎有一个选项,这意味着new
始终表现为new(nothrow)
(换句话说,如果分配失败,new
会返回nullptr
。
程序集正在检查operator new
是否返回了nullptr(如果是,则不在返回的地址处存储4)。您需要测试分配失败的情况才能完全覆盖。在C ++中,程序集如下所示:
int * test;
int * tmp = operator new(sizeof(int));
if (tmp != nullptr) {
*tmp = 4;
test = tmp;
} else {
test = nullptr;
}
修改强>
啊哈哈!在this blog post Microsoft解释说,生成的new代码一直在测试null返回,以防你链接到nothrow
版本。使用VC2015,他们提供了一个选项,说“不要这么做,new
会抛出,它永远不会返回nullptr
。
因此,为避免不必要的分支,请在编译选项中添加:/Zc:throwingNew
。 (这也有助于提高性能。)