在此阶段执行三个步骤:
- 源代码被检测。
- 检测的源代码被编译为目标文件。
- 所有检测和非检测对象都链接到代码覆盖工具库,以及形成最终可测试二进制工件所需的任何其他库。
这些步骤通常在构建过程中执行,并且要求覆盖工具与用户构建系统集成。该cpptestcc工具检测源代码并将其编译为目标文件。在cpptestcc被设计为用作汇编命令行编译器前缀。
原始编译命令行:
cc -I app/includes -D defines -c source.cpp
|
覆盖模式编译命令行:
cpptestcc -compiler gcc_3_4 -line-coverage -workspace /home/test/proj/cov -- cc -I app/includes -D defines -c source.cpp
|
当覆盖模式编译命令行执行时,cpptestcc执行以下操作:
- 编译命令行分析提取源文件信息
- 对所有检测到的源文件进行解析和检测以获取覆盖率指标
- 使用-workspace开关在指定位置重建插装文件;还存储了有关报告生成期间使用的代码结构的附加信息
- 编译命令行修改,原始源文件替换为插装版本
- 执行编译命令行,在与原始命令行相同的位置创建对象文件
您可以将[INSTALL_DIR]/bin目录添加到 PATH 变量中,这样在指定cpptestcc命令时就不必使用完整路径 。本文档中的所有示例均假设已完成此操作。
以下模式描述了覆盖检测的语法:
cpptestcc -compiler <compiler configuration> <coverage metric specification> -workspace <workspace directory> -- <compilation command line>
|
- <compiler configuration>指支持的编译器配置,例如 gcc_3_4;有关支持的编译器 列表,请参阅支持的编译器。
- <coverage metric specification>“覆盖”指的是支持的覆盖度量,例如,线路覆盖。有关支持的覆盖率指标列表,请参阅cpptestcc 的命令行参考。
- 该cpptestcc命令行从与编译器命令行分离--隔板。
链接检测代码
必须修改原始链接器命令以包含代码覆盖率检测所需的附加库。以下示例显示了这通常是如何完成的:
原始编译命令行:
lxx -L app/lib app/source.o -lsomelib -o app.exe
|
覆盖模式编译命令行:
lxx -L app/lib app/source.o somelib.lib <coverage tool>/runtime/lib/cpptest.lib -o app.exe
|
执行检测代码
执行环境的细节取决于应用程序的细节,但覆盖工具对执行施加了以下有限的依赖:
- 如果覆盖工具库被链接为共享(动态加载)库,那么您必须确保在启动检测的应用程序时可以加载该库。在 Windows 上,这通常需要将[INSTALL_DIR]/bin目录添加到 PATH 环境变量中。在 Linux 系统上,添加[INSTALL_DIR]/runtime/lib到 LD_LIBRARY_PATH 变量。
- 如果覆盖结果传输信道被修改,则必须满足由修改产生的所有要求。例如,如果结果是通过 TCP/IP 套接字或 rs232 发送的,则需要在检测的应用程序执行之前启动适当的侦听代理。
在检测的应用程序完成执行后,收集的结果必须存储在将用于生成报告的文件中。
生成报告
最终覆盖率报告由两种类型的信息生成:
- cpptestcc构建过程中生成的代码结构信息(存储在workspace中)
- 通过检测代码执行获得的覆盖结果
覆盖率报告可以 HTML 格式生成或发送到 DTP 服务器。以下示例显示了用于生成报告的命令:
cpptestcli -config builtin://Coverage -input cpptest_results.clog -workspace /home/test/proj/cov
|
为了在 DTP 中正确合并覆盖数据,您必须在命令行或 .properties 设置文件中指定一个或多个覆盖图像标签。覆盖图像会自动发送到连接的 DTP 服务器,在那里它可以与过滤器相关联。
您可以指定一组最多三个标签,这些标签可用于在 DTP 服务器中使用以下report.coverage.images属性创建覆盖图像:
report.coverage.images=[tag1; tag2; tag3]
|
在报告中心管理页面(管理> 项目> 过滤器> [单击过滤器])中的 DTP 中关联覆盖图像。
您还可以使用该report.coverage.limit属性指定较低的覆盖阈值:
report.coverage.limit=[value]
|
低于此值的覆盖率结果在报告中突出显示。默认值为40。
使用示例
在此示例中,以下代码来自名为 的 c++ 源文件main.c:
#include <iostream>
int main(int argc, char ** argv) {
if (argc > 1) {
std::cout << "Thank you for arguments" << std::endl;
} else {
std::cout << "Provide some arguments please !" << std::endl;
}
return 0;
}
|
正常的文件编译命令是gcc:
g++ -c main.c -o main.o
|
要检测此文件并将检测后的代码编译为目标文件,编译命令行必须包含cpptestcc命令前缀:
cpptestcc -compiler gcc_3_4 -line-coverage -workspace /home/test/proj/cov -- g++ -c main.c -o main.o
|
作为 cpptestcc 命令调用的结果,创建了两个工件:
- 带有检测代码的对象
- 代码结构信息存储在 -workspace选项指定的目录中
一旦源文件被检测并编译成目标文件,它就可以链接起来形成最终的可执行文件。通常这个简单的例子将与以下命令链接:
g++ main.o -o app.exe
|
覆盖率检测需要额外的库,因此链接命令行需要如下所示:
g++ main.o <coverage tool install dir>/runtime/lib/cpptest.a -o app.exe
|
在此示例中,使用了覆盖库的静态版本。还提供了动态/共享版本以及源代码,用于构建自定义版本。
一旦应用程序被链接,就可以执行它来收集有关代码覆盖率的信息。运行以下命令:
./app.exe
|
应用程序将cpptest_results.clog在当前工作目录中输出默认命名的覆盖率日志文件。
最后,使用以下命令生成报告:
cpptestcli -config builtin://Coverage -workspace /home/test/proj/cov -input cpptest_results.clog -report report_dir
|
将创建一个报告目录,其中包含带有代码覆盖率信息的 HTML 报告。