本主题说明如何从测试会话生成覆盖率信息以及如何调整设置以最小化执行开销

启用和禁用覆盖率分析

执行选项卡中的插桩设置必须配置为收集代码覆盖率信息。C++test 提供了一个选项,用于设置在测试代码执行期间应收集哪些覆盖率指标。详细信息,请参阅了解覆盖率类型

考虑到嵌入式测试等性能要求较高的情况,您也可以禁用所有代码覆盖率监控。有关控制覆盖率分析的更多信息,请参阅执行选项卡设置 - 定义测试的执行方式

代码覆盖率信息可以从单元测试执行中收集,也可以从由 C++test 专门为覆盖率监控构建的应用程序上执行的手动测试中收集。

了解代码覆盖率分析成本

默认情况下,测试代码执行过程中生成的代码覆盖率信息会立即发送到 C++test,从而确保结果准确。例如,如果测试执行导致崩溃,那么直到崩溃发生点的所有覆盖率信息都是有效的。这种方法的缺点是执行时间开销相对较高。然而,在大多数情况下,单元测试的执行时间可以忽略不计。因此,建议使用默认覆盖率模式。

但是,与即时覆盖率数据传输(默认模式)相关的执行时间开销,可能不适用于从应用级测试(应用功能测试)中收集覆盖率信息的情况。例如,覆盖率插桩通常会影响应用程序的时序依赖性,从而影响嵌入式系统中的应用程序逻辑。

如果不接受默认的代码覆盖率执行时间开销,用户可以启用专用的优化模式,从应用程序级功能测试中收集覆盖率。在优化模式中:

  • 使用专用内存缓冲区来存储有关已覆盖的 C/C++ 语言构造的信息
  • 覆盖率数据在应用程序完成时发送;不在功能测试执行期间发送
  • 代码插桩执行最少的必要机器指令来存储有关所已覆盖的 C/C++ 语言语句的信息。
  • 因此,无需确保主机和目标之间的快速链接,从而最小化所需开销。

优化应用程序覆盖率监控的覆盖率指标

专用的覆盖率插桩优化模式仅适用于应用程序级测试,不适用于单元测试。使用测试配置的执行选项卡“插桩功能”面板中的“高级选项”来启用覆盖率优化模式。这些设置在执行选项卡设置 - 定义测试的执行方式中进行了描述。

“高级选项”部分允许:

  • 选择更低的测试代码执行时间开销或更低的 RAM 内存开销。
  • 初始化覆盖率内存缓冲区
  • 防止覆盖率数据缓冲区损坏

必须调用专用的初始化和终结函数来运行优化的代码覆盖率监控会话:

void CppTest_InitializeRuntime(void)
void CppTest_FinalizeRuntime(void)

默认情况下,这些函数在主函数的开头和结尾调用(C 语言应用程序)或通过为此目的添加的特殊全局对象的构造函数和析构函数进行调用(C++ 语言应用程序)。

如果您的应用程序没有“main”函数或不支持全局对象的构造/析构,您可以在应用程序启动和终结时,在适当位置将调用手动注入初始化和终结函数中。

  • No labels