此章节:
C/C++test 的多指标覆盖率分析使您可以在执行 C/C++test 之外的独立应用程序或库时监视代码覆盖率。
C/C++test 附带一个独立的覆盖程序包,该程序包包含以下组件:
[INSTALL_DIR]/cpptestcc
- A 将覆盖工具集成到您的构建过程中,可对您的应用程序进行检测以收集原始覆盖数据。[INSTALL_DIR]/engine/coverage/runtime
- A c需要与已检测应用程序集成的覆盖率运行时库。使用cpptestcc
收集覆盖率 涉及三个阶段:
cpptestcc
工具集成到构建中来对应用程序进行检测。cpptestcc
快速入门[INSTALL_DIR]
的路径添加到PATH
系统变量以启用cpptestcc
工具。cpptestcc
可执行文件作为编译器命令的前缀,并以--
作为分隔符。 示例:原始编译命令行
cc -I app/includes -D defines -c source.cpp |
更新编译命令行
cpptestcc -compiler gcc_7 -line-coverage -- cc -I app/includes -D defines -c source.cpp |
至少,cpptestcc 工具需要在命令行上配置以下参数:-编译器标识符: -覆盖率指标(例如, 有关其他选项的信息,请参见Command Line Reference for cpptestcc。 |
原始命令行
lxx -L app/lib app/source.o somelib.lib -o app.exe |
更新命令行
lxx -L app/lib app/source.o somelib.lib [INSTALL_DIR]/engine/coverage/runtime/lib/cpptest.lib -o app.exe |
如果覆盖率运行时库链接为共享(动态负载)库,则必须确保在启动检测的应用程序时可以加载它。这通常需要添加 |
C/C++test 为本地 Windows 和 Linux 应用程序提供了预先构建的覆盖率运行时库。对于跨平台和嵌入式测试,运行时库需要从[INSTALL_DIR]/engine/coverage/runtime中可用的源构建。有关详细信息,请参见Coverage Runtime Library 。 |
cpptestcc
将创建 .cpptest/cpptestcc
文件夹,其中存储了与覆盖率相关的重要数据(“覆盖图”)。默认情况下,该文件夹位于当前编辑的工作目录中。您可以使用-workspace <path>
选项更改默认位置;请参见 Command Line Reference for cpptestcc有关详细信息。 cpptest_results.clog
文件中。加载应用程序覆盖率测试配置假定 .cpptest/cpptestcc
文件夹和 cpptest_results.clog
文件都存储在默认位置。要自定义位置,请在测试配置中配置以下执行详细信息(执行> 常规> 执行详细信息):
- 覆盖图文件的根位置 - 默认:${project_loc}/.cpptest/cpptestcc
- 覆盖率日志文件 - 默认:${project_loc}/*.clog
默认情况下,加载应用程序覆盖率测试配置尝试加载有关所有受支持的覆盖率指标的信息。要自定义受支持的覆盖率指标列表,跳转到 执行> 常规> 执行细节> 检测模式> 检测功能> C/C++ 代码覆盖率指标 然后选择您想要报告的指标。
我们建议您与在编译命令行中为
cpptestcc
工具启用的度量指标保持一致。
cpptestcc
的命令行参考 您可以运行以下命令以将可用选项打印到控制台:
cpptestcc -help
提供以下选项:
-compiler <name|path>指定您想要用于代码分析和检测的编译器配置的名称。有关支持的编译器的列表,请参见编译器 或使用 示例:
配置文件格式(请参见 -psrc): -list-compilers打印出所有受支持的编译器配置的名称。 配置文件格式(请参见 -psrc): -include <文件|模式> 和 -exclude <文件|模式>将与指定模式匹配的所有文件包括在检测范围内或从检测范围中排除。 仅在按照其指定顺序指定了所有包含/排除条目之后,才确定最终过滤。 支持以下通配符:
为了防止外壳程序将
配置文件格式(请参见 -psrc): 示例 1:示例项目布局:
如果您的项目具有上述布局,则以下命令将从 instrumentation 范围中排除
示例 2:示例项目布局:
如果您的项目具有上述布局,则以下命令将仅检测头文件(不检测源文件):
-ignore <pattern>指定在处理期间将被忽略的源文件。符合指定模式的文件将被编译,但不会被解析或检测。
您可以使用 支持以下通配符:
为了防止外壳程序将
配置文件格式(请参见 -psrc): 示例:
-行-覆盖率启用收集行覆盖率。 执行代码时,会将运行时覆盖率结果写入到结果日志中。这在测试的代码执行时间上增加了一些开销,但是它使您即使在应用程序崩溃时也可以确保收集覆盖率数据。 配置文件格式(请参见 -psrc): -优化的-行-覆盖率启用 收集优化的行覆盖率。 运行时覆盖率结果存储在内存中,然后在应用程序完成后或应用户请求写入结果日志。这样可以提高性能,但是如果应用程序崩溃,结果可能会丢失。 配置文件格式(请参见-psrc): -函数-覆盖率启用收集 函数覆盖率。 配置文件格式(请参见 -psrc): -优化的-函数-覆盖率启用收集优化的函数覆盖率。配置文件格式(请参见 -psrc):
-语句-覆盖率启用收集 语句覆盖率。配置文件格式(请参见 -psrc):
-优化的-语句-覆盖率启用收集 语句覆盖率。 配置文件格式(请参见-psrc): -块-覆盖率启用收集 块覆盖率。 配置文件格式(请参见 -psrc): -优化的-块-覆盖率启用收集优化的块覆盖率。 配置文件格式(请参见-psrc): -路径-覆盖率启用收集路径覆盖率。 配置文件格式(请参见 -psrc): -决策-覆盖启用收集 决策覆盖率。 配置文件格式(请参见 -psrc): -优化的-决策-覆盖率启用 收集优化的决策覆盖率。 配置文件格式(请参见-psrc): -简单-条件-覆盖率启用收集简单的条件覆盖率。 配置文件格式(请参见-psrc): -优化的-简单-条件-覆盖率启用收集优化的简单条件覆盖率。 配置文件格式(请参见-psrc): -mcdc-覆盖率启用 收集 MC/DC 覆盖率。 配置文件格式(请参见 -psrc): -调用-覆盖率启用收集 调用覆盖率。 配置文件格式(请参见 -psrc): -优化的-调用-覆盖率启用 收集优化的调用覆盖率。 配置文件格式(请参见-psrc): -覆盖率-初始的-init在应用程序入口点的开头启用覆盖模块。 配置文件格式(请参见 -psrc): -覆盖率-auto-终止如果启用,将在应用程序退出时自动完成收集覆盖率。默认情况下启用此选项。 配置文件格式(请参见 -psrc): -优化的-覆盖率-损坏-检测启用损坏检测算法以优化覆盖率指标。 配置文件格式(请参见 -psrc): -模板-覆盖率启用对模板类和函数的收集覆盖率 配置文件格式(请参见 -psrc): -workspace <path>指定一个自定义目录,有关代码结构的信息将在代码分析和检测期间存储在该目录中。此 默认情况下,该信息存储在当前编辑的工作目录中。如果您的编译使用多个工作目录,建议您指定一个自定义目录,以确保所有覆盖率数据都存储在同一位置。 配置文件格式 (请参见 -psrc):
|
覆盖率运行时库是源代码检测用于在应用程序运行时发出覆盖率信息的帮助程序函数和服务的集合。没有该库,无法链接已检测的应用程序。运行时库可以根据测试的项目类型以多种方式链接到最终的可测试二进制文件。
除了为已检测代码提供基本服务外,该库还用于使代码覆盖解决方案适应特定的开发环境,例如支持非标准传输以在测试的嵌入式设备和开发主机之间提供覆盖结果。
C/C++test 附带了运行时库的预构建版本,这些版本适合在安装 C/C++test 的同一平台上使用。在大多数情况下,从本地开发的应用程序收集代码覆盖率信息可以使用运行时库的预构建版本。
开发跨平台应用程序的所有用户都需要使用合适的交叉编译器和可能的链接器来准备覆盖率运行时库的自定义版本。C/C++test 附带了代码覆盖率运行时库的源代码。
准备覆盖率运行时库自定义构建的过程通常仅限于覆盖率运行时库源代码的编译。在某些情况下,您可能需要安装一些源代码片段以使代码覆盖范围适应特定的开发平台。以下各节介绍了此过程。
C/C++test 包含以下二进制文件:
Windows (x86 和 x86-64)
File | 说明 |
---|---|
[INSTALL_DIR]/engine/coverage/runtime/lib/cpptest.a | Cygwin GNU GCC 编译器使用的 32 位导入库。要添加到链接命令行中。 |
[INSTALL_DIR]/engine/coverage/runtime/lib/cpptest64.a | 与Cygwin GNU GCC编译器一起使用的 64 位导入库。要添加到链接命令行中。 |
[INSTALL_DIR]/engine/coverage/runtime/lib/cpptest.lib | 与 Microsoft Visual C++ 编译器一起使用的 32 位导入库。要添加到链接命令行中。 |
[INSTALL_DIR]/engine/coverage/runtime/lib/cpptest64.lib | 与 Microsoft Visual C++ 编译器一起使用的 64 位导入库。要添加到链接命令行中。 |
[INSTALL_DIR]/engine/coverage/runtime/bin/cpptest.dll | 32 位动态链接库。[INSTALL_DIR]/engine/coverage/runtime/bin 应该添加到 PATH 环境变量中。 |
[INSTALL_DIR]/engine/coverage/runtime/bin/cpptest64.dll | 64 位动态链接库。[INSTALL_DIR]/engine/coverage/runtime/bin 应该添加到 PATH 环境变量中。 |
Windows (x86 和 x86-64)
File | 说明 |
---|---|
[INSTALL_DIR]/engine/coverage/runtime/lib/libcpptest.so | 32 位共享库。要添加链接命令行。[INSTALL_DIR]/engine/coverage/runtime/lib 应该添加到LD_LIBRARY_PATH |
[INSTALL_DIR]/engine/coverage/runtime/lib/libcpptest64.so | 64 位共享库。要添加链接命令行。[INSTALL_DIR]/engine/coverage/runtime/lib 应该添加到LD_LIBRARY_PATH |
如果需要以未作为即用型解决方案提供的形式使用运行时库,请准备一个符合特定开发环境要求的覆盖率运行时库的自定义版本。 更多详细信息请参见 自定义运行时库。
将覆盖率运行时库与经过测试的应用程序链接过程集成在一起,通常需要修改链接器命令行,在某些情况下还需要修改执行环境。本节介绍使用 C/C++test 附带的预构建版本时如何修改链接过程。
Windows Cygwin GNU GCC 编译器的静态库:
Microsoft Visual C++ 编译器的动态链接库:
修改构建脚本,以便在链接器命令行中的某个位置(最好在所有目标文件之后)指定覆盖率运行时库。示例:
$(LXX) $(PRODUCT_OBJ) $(OFLAG_EXE)$(PROJ_EXECUTABLE) $(LXXFLAGS) $(SYSLIB) $(EXECUTABLE_LIB_LXX_OPTS) [INSTALL_DIR]/engine/coverage/runtime/lib/cpptest.lib |
确保将[INSTALL_DIR]/engine/coverage/runtime/bin
目录添加到PATH
环境变量中,以便在启动被测试程序时可以找到该库。您还可以考虑将 cpptest.dll
(或cpptest64.dll
)文件复制到与可执行文件相同的目录中,或复制到在测试的应用程序启动过程中扫描动态链接库的其他位置。
Linux GNU GCC 编译器的共享库:
修改构建脚本,以便在链接器命令行中的某个位置(最好在所有目标文件之后)指定覆盖率运行时库。示例:
$(LXX) $(PRODUCT_OBJ) $(OFLAG_EXE)$(PROJ_EXECUTABLE) $(LXXFLAGS) $(SYSLIB) $(EXECUTABLE_LIB_LXX_OPTS) -L [INSTALL_DIR]/engine/coverage/runtime/lib -lcpptest |
注意添加了 -L [INSTALL_DIR]/engine/coverage/runtime/lib
和 -lcpptest
选项。
LD_LIBRARY_PATH
环境变量以使其包含[INSTALL_DIR]/engine/coverage/runtime/lib
位置,确保已测试的可执行文件可以找到共享库。 由于以下情况,您可能需要自定义运行时库:
[INSTALL_DIR]/engine/coverage/runtime
目录中的 C/C++test 附带了运行时库源代码。下表描述了结构:
部件 | 说明 |
---|---|
包括 | 包含库的目录包含文件。 |
src | 包含库源代码的目录。 |
生成文件 | 提供了用于构建运行时库的基本生成文件。 |
目标 | 包含一组 Makefile 的目录包括具有编译器特定选项的文件,用于为最流行的开发环境准备运行时库生成。 |
信道 | 包含一组 Makefile 的目录包含具有支持的通信信道配置的文件。 |
运行时库支持通过各种通信信道进行数据收集。使用的通信信道取决于开发环境。在大多数情况下,将结果存储在一个或多个文件中是适当的,但可能需要在其他 TCP/IP 套接字或 RS232 传输中进行。通过在cpptest.c
库源文件编译期间将值设置为专用宏,可以启用特定的通信通道。 将-D<MACRO>
添加到编译命令行以设置值。下表提供了通信通道控制宏的完整列表:
信道 | 说明 |
---|---|
CPPTEST_NULL_COMMUNICATION | 空实现。如果启用,将不发送任何结果。适用于初始测试构建和调试。 |
CPPTEST_FILE_COMMUNICATION | 基于文件的实现。使用 ANSI C 文件 I/O 接口。如果启用,结果将写入本地驱动器文件。 还提供以下附加配置宏:
|
CPPTEST_SPLIT_FILE_COMMUNICATION | 基于文件的实现。使用 ANSI C 文件 I/O 接口。如果启用,结果将被写入一系列本地驱动器文件中。 您可以使用以下宏配置此信道:
确保系列中的所有文件都放在同一目录中。
|
CPPTEST_UNIX_SOCKET_COMMUNICATION | 基于 TCP/IP 套接字的实现。使用 POSIX API。如果启用,结果将发送到指定的 TCP/IP 端口。提供了以下其他配置宏:
|
CPPTEST_WIN_SOCKET_COMMUNICATION | 如上所述,使用 Windows API。 |
CPPTEST_UNIX_SOCKET_UDP_COMMUNICATION | 如上所述,基于 UDP 的实现。 |
CPPTEST_RS232_UNIX_COMMUNICATION | 基于 RS232 的实现。使用 POSIX API。如果启用,则结果通过指定的 RS232 系统设备发送。提供了以下其他配置宏:
|
CPPTEST_RS232_WIN_COMMUNICATION | 如上。使用 Windows API。 |
CPPTEST_RS232_STM32F103ZE_COMMUNICATION | 基于 STM32F103x USART 的实现。使用 STM Cortex 库接口(ST/STM32F10x/stm32f10x.h 头文件是必需的) |
CPPTEST_HEW_SIMIO_COMMUNICATION | Renesas HEW 模拟器的特定实现。 |
CPPTEST_LAUTERBACH_FDX_COMMUNICATION | 基于 Lauterbach TRACE32 的实现(使用 FDX) |
CPPTEST_ITM_COMMUNICATION | 基于 ARM CoreSight ITM 单元的通信。需要 CMSIS 头文件。 |
CPPTEST_CUSTOM_COMMUNICATION | 为自定义实现启用空模板 |
如果使用提供的生成文件构建覆盖率运行时库,则可以使用[INSTALL_DIR]/engine/coverage/runtime/channel
目录中提供的 make 配置文件之一。
如果没有通信通道实现适合您的开发环境,则可以提供自定义实现。以下说明描述了如何自定义运行时库,以便它使用通信通道的自定义实现:
[INSTALL_DIR]/engine/coverage/runtime/src/cpptest.c
然后打开文件进行编辑。找到 1.13 节“自定义通信实现。
自定义通信实现部分包含用于四种不同方法的空模板:
函数 | 说明 |
---|---|
void cpptestInitializeStream(void) | 该函数负责初始化通信通道,例如创建并连接到套接字或初始化 UART 设备。 |
void cpptestFinalizeStream(void) | 此函数负责完成通信通道。例如,它可能负责关闭 TCP/IP 套接字。 |
| 该函数负责从数据缓冲区发送大小字节。 |
void cpptestFlushData(void) | 此函数负责刷新数据。其含义取决于特定的运输类型。在某些实现中,它的应用可能有限。在这种情况下,应将其保留为空。 |
cpptest.c
并在编译命令行中添加以下宏定义-DCPPTEST_CUSTOM_COMMUNICATION
运行时库包含对多线程应用程序的支持。支持 POSIX,Windows 和 VxWorks API。您可以通过在cpptest.c
编译期间将-D<MACRO>
添加到编译命令行来启用对特定多线程 API 的支持。下表描述了多线程 API 支持控制宏的完整列表:
宏 | 说明 |
---|---|
CPPTEST_NO_THREADS | 空实现。覆盖率运行时不准备与多线程应用程序一起使用 |
CPPTEST_WINDOWS_THREADS | Windows 多线程 API 实现 |
CPPTEST_UNIX_THREADS | POSIX 多线程 API 实现 |
CPPTEST_VXWORKS_THREADS | VxWorks 多线程 API 实现 |
如果将 C/C++test 的覆盖率引擎与不使用支持的多线程 API 的多线程应用程序一起使用,则可以自定义运行时库以与多线程 API 一起使用。需要执行以下步骤:
[INSTALL_DIR]/engine/coverage/runtime/src/cpptest.c
然后打开文件进行编辑找到 2.5 节“自定义多线程实现”
,自定义多线程实现一节包含用于两种不同方法的空模板:
函数 | 说明 |
---|---|
static int cpptestLock(void) | 此函数可确保覆盖率工具运行时库内的同步操作。如果线程锁定对运行时库服务的访问,则意味着正在进行原子操作,并且其他任何线程都不能使用运行时库服务。释放锁定后,其他线程可以使用运行时库服务 |
static int cpptestLock(void) | 释放对运行时库服务的锁定。 |
提供与您的环境要求相匹配的方法的实现。
编译cpptest.c
并在编译命令行中添加以下宏:-DCPPTEST_CUSTOM_THREADS
如果生成的目标文件不足,则可以进一步处理文件以满足您的需求(例如,创建共享库)。
C/C++test 附带了一个简单的生成文件(请参见Library Source Code Structure),该文件简化了构建运行时库的过程。但是在许多情况下,由于源代码已经针对构建过程进行了优化,因此不需要提供的 make 文件。始终唯一需要的步骤是主 cpptest.c
源文件的编译。 生成的目标文件的任何其他处理将取决于特定的开发环境及其要求,例如将运行时库提供为共享库。
[INSTALL_DIR]/engine/coverage/runtime
复制到本地目录。调用以下命令行以构建
一个包含单个对象cpptest.<OBJ_EXT>
的构建子目录,该目录可用于链接已检测的应用程序。
make TARGET_CFG=<target config file name> CHANNEL_FILE=<channel config file name> |
您的命令行可能类似于以下内容:
make TARGET_CFG=gcc-static.mk CHANNEL_FILE=channel/unix-socket.mk |
或者,您可以提供信道类型:
make TARGET_CFG=gcc-static.mk CHANNEL_TYPE=unix-socket |
若要设置覆盖运行时库的用户构建,请执行以下步骤:
[INSTALL_DIR]/engine/coverage/runtime/src/cpptest.c
将 cpptest.c 文件复制到您的首选位置。 -I
),值如下 :-I[INSTALL_DIR]/engine/coverage/runtime/include
-D)
,例如:-DCPPTEST_FILE_COMMUNICATION -DCPPTEST_NO_THREADS