【问题标题】:Remove auto generated exception code from coverage report从覆盖率报告中删除自动生成的异常代码
【发布时间】:2018-03-04 04:18:07
【问题描述】:

让我们从一个最小的工作示例开始:
ma​​in.cpp:

#include <iostream>
#include <string>

int main() {
    std::cout << "hello " + std::to_string(42);
    return 0;
}

我使用以下标志编译此代码:

[g++/clang++] -std=c++11 -g -Og --coverage -Wall -o main main.cpp

叮当 4.0.1
gcc 4.8.5。

我只得到了 50% 的代码覆盖率,因为编译器会生成不执行的异常代码,正如 in another stackoverflow question 所解释的那样。

问题是通过-fno-exceptions 禁用异常对我来说不是一个选项。我正在为使用异常编写单元测试的代码,因此禁用所有异常不是一种选择。

为了生成报告,我使用gcovr,如果是clang++,另外llvm-cov gcov 来转换它。但我不受这些工具的约束,所以如果您有其他工具不显示这种行为,请推荐它们!

基本上,我需要一种方法来编译/编写此代码的单元测试,并在启用异常的情况下获得 100% 的分支/条件覆盖。有什么办法吗?

【问题讨论】:

    标签: c++ gcc code-coverage gcov gcovr


    【解决方案1】:

    好吧,我相信你的意图并不是真正测试这小段代码,而是在项目中使用这个概念......

    您输入的代码引发异常 - 当您没有剩余内存来存储将使用 std::to_string 创建的字符串时,将引发 bad_alloc。为了 100% 安全,std::to_string 应该被 try-catch 包围,您可以在其中处理您的异常。

    要构建 100% 的代码覆盖率单元测试,您需要强制异常发生 - 在这种特定情况下,几乎不可能保证,因为参数是一个常数。但是,在您的项目中,您可能需要分配一些大小可变的数据 - 在这种情况下,您可以在代码中隔离分配内存的方法,以单独测试它们。然后在测试函数中传递给这些方法,将分配大量用于评估您在 catch 块上放置的内容(并检查您是否正确处理它)。

    例如,这段代码应该抛出异常,您可以在构建测试时使用它来激励自己 (source):

    // bad_alloc.cpp
    // compile with: /EHsc
    #include<new>
    #include<iostream>
    using namespace std;
    
    int main() {
       char* ptr;
       try {
          ptr = new char[(~unsigned int((int)0)/2) - 1];
          delete[] ptr;
       }
       catch( bad_alloc &ba) {
          cout << ba.what( ) << endl;
       }
    }
    

    但是,如果您不打算处理代码中的所有 bad_alloc 异常(或绝对是所有异常),则无法获得 100% 的覆盖率 - 因为它不会被 100% 覆盖...大多数不过,在这些案例中,真正的 100% 覆盖是不必要的。

    【讨论】:

      猜你喜欢
      • 2021-06-26
      • 2021-09-27
      • 1970-01-01
      • 2011-03-09
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      相关资源
      最近更新 更多