如何使用 gcovr 和 `if / else if / else` 获得 100% 的分支覆盖
How to obtain 100% branch coverage with gcovr with `if / else if / else`
我是第一次使用 gcovr 并且遇到了一个令人困惑的问题:
for (int i = 0; i < 4; i++)
{
bool a = i & 1;
bool b = i & 2;
if (a && b)
printf("a and b\n");
else if (a && !b)
printf("a not b\n");
else
printf("the other two\n");
}
(代码如您所愿,所以我不打算粘贴输出。)
但是,gcovr 认为我没有完整的分支覆盖率:
✓✓ 5 for (int i = 0; i < 4; i++)
{
4 bool a = i & 1;
4 bool b = i & 2;
✓✓✓✓ 4 if (a && b)
1 printf("a and b\n");
✓✓✓✗ 3 else if (a && !b)
1 printf("a not b\n");
else
2 printf("the other two\n");
}
很明显,四个排列中的一个没有被 else if
处理,而只是因为它被第一个 if
.
处理了
我很生气,因为最终结果分支覆盖率低于 100%。这只是 "the way" 还是我误解了什么?
您可能想要重构:
if (a)
{
if (b)
{
std::cout << "a and b\n";
}
else
{
std::cout << "a and not b\n";
}
}
else
{
std::cout << "not a\n";
}
在您发布的代码中,a
在两个 if
语句中计算。
上面的示例删除了 else if
条件。
我找到了一个简单的替代大规模重构的方法:
for (int i = 0; i < 4; i++)
{
bool a = i & 1;
bool b = i & 2;
if (a && b)
printf("a and b\n");
else if (a /*&& !b*/) // <--- comment out second condition (but leave it in place)
printf("a not b\n");
else
printf("the other two\n");
}
我喜欢这种方法,因为它仍然封装了我想要的逻辑,没有多余的(因此有问题的)检查。
我是第一次使用 gcovr 并且遇到了一个令人困惑的问题:
for (int i = 0; i < 4; i++)
{
bool a = i & 1;
bool b = i & 2;
if (a && b)
printf("a and b\n");
else if (a && !b)
printf("a not b\n");
else
printf("the other two\n");
}
(代码如您所愿,所以我不打算粘贴输出。)
但是,gcovr 认为我没有完整的分支覆盖率:
✓✓ 5 for (int i = 0; i < 4; i++)
{
4 bool a = i & 1;
4 bool b = i & 2;
✓✓✓✓ 4 if (a && b)
1 printf("a and b\n");
✓✓✓✗ 3 else if (a && !b)
1 printf("a not b\n");
else
2 printf("the other two\n");
}
很明显,四个排列中的一个没有被 else if
处理,而只是因为它被第一个 if
.
我很生气,因为最终结果分支覆盖率低于 100%。这只是 "the way" 还是我误解了什么?
您可能想要重构:
if (a)
{
if (b)
{
std::cout << "a and b\n";
}
else
{
std::cout << "a and not b\n";
}
}
else
{
std::cout << "not a\n";
}
在您发布的代码中,a
在两个 if
语句中计算。
上面的示例删除了 else if
条件。
我找到了一个简单的替代大规模重构的方法:
for (int i = 0; i < 4; i++)
{
bool a = i & 1;
bool b = i & 2;
if (a && b)
printf("a and b\n");
else if (a /*&& !b*/) // <--- comment out second condition (but leave it in place)
printf("a not b\n");
else
printf("the other two\n");
}
我喜欢这种方法,因为它仍然封装了我想要的逻辑,没有多余的(因此有问题的)检查。