如何使用if / else if / else`使用gcovr获得100%的分支覆盖率

时间:2020-01-29 16:58:47

标签: c++ gcov gcovr

我第一次使用 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%。这只是“方式”还是我致命地误解了某些东西?

2 个答案:

答案 0 :(得分:1)

您可能要重构:

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条件。

答案 1 :(得分:0)

我找到了批发重构的简单替代方法:

import "./App.scss";
import React from "react";
import StatelessComponent from "./components/stateless-component";
import StatefullComponent from "./components/statefull-component";

function App() {
  return (
    <div className="App">
      <StatefullComponent />
    </div>
  );
}

export default App;

我喜欢这种方法,因为它仍然封装了我想要的逻辑,没有多余的检查(因此有问题)。