自动化测试工具Parasoft C/C++ test 自动化用户指南(二十四):代码覆盖运行时库

翻译|使用教程|编辑:李显亮|2021-07-28 10:29:08.227|阅读 32 次

概述:C/C++test 运行时库是一组由源代码检测使用的辅助函数和服务,用于在应用程序运行时发出覆盖率信息。

# 31款JAVA开发必备控件和工具 # 企业数字化建设合规无风险[专题]

相关链接:

Parasoft C/C++test针对C/C++开发的专业白盒自动化测试方案,能有效提高软件开发效率和代码质量。C++test 可以进行静态分析,全面代码审查,运行时错误检测,并在单元测试和组件测试中集成覆盖率分析。

Parasoft C/C++test申请免费试用


Parasoft C/C++test 运行时库是一组由源代码检测使用的辅助函数和服务,用于在应用程序运行时发出覆盖率信息。没有库就无法链接已检测的应用程序。根据测试的项目类型,运行时库可以通过多种方式链接到最终的可测试二进制文件。

除了为插装代码提供基本服务外,该库还用于使代码覆盖解决方案适应特定的开发环境,例如支持测试嵌入式设备和开发主机之间的覆盖结果的非标准传输。

预构建版本和自定义构建

C/C++test 附带运行时库的预构建版本,它们适合在安装 CCE 的同一平台上使用。在大多数情况下,从本地开发的应用程序(即 MS Windows 或 Linux x86 和 x86-64)收集代码覆盖率信息可以使用运行时库的预构建版本。

所有开发跨平台应用程序的用户都需要使用合适的交叉编译器和可能的链接器准备运行时库的自定义构建。代码覆盖运行时库的源代码随 CCE 一起提供。

准备运行时库自定义构建的过程通常仅限于运行时库源代码的编译。在某些情况下,您可能需要安装一些源代码片段以使代码覆盖率适应特定的开发平台。此过程将在以下部分中描述。

使用预构建的运行时库

C/C++test 包含以下二进制文件:

Windows(x86 和 x86-64) 

文件
描述
<INSTALL_DIR>/runtime/lib/cpptest.a 与 Cygwin GNU GCC 编译器一起使用的 32 位静态存档。要添加到链接命令行
<INSTALL_DIR>/runtime/lib/cpptest.lib 与 Microsoft CL 编译器一起使用的 32 位导入库。要添加到链接命令行
<INSTALL_DIR>/runtime/lib/cpptes64.lib 与 Microsoft CL 编译器一起使用的 64 位导入库。要添加到链接命令行
<INSTALL_DIR>/bin/cpptest.dll 与 Microsoft CL 编译器一起使用的 32 位动态链接库。[INSTALL_DIR]/bin应该添加到 PATH 环境变量中
<INSTALL_DIR>/bin/cpptest64.dll 与 Microsoft CL 编译器一起使用的 64 位动态链接库。[INSTALL_DIR]/bin应该添加到 PATH 环境变量中

Linux(x86 和 x86-64)

文件
描述
<INSTALL_DIR>/runtime/lib/libcpptest.so 32 位共享库。要添加链接命令行。[INSTALL_DIR]/runtime/lib应该添加到 LD_LIBRARY_PATH
<INSTALL_DIR>/runtime/lib/libcpptest64.so 64 位共享库。要添加链接命令行。[INSTALL_DIR]/runtime/lib应该添加到 LD_LIBRARY_PATH

如果您需要以未作为开箱即用解决方案提供的形式使用运行时库,请准备与特定开发环境要求相匹配的运行时库的自定义构建。有关更多详细信息,请参阅 自定义运行时库

与链接器命令行集成

将 C/C++test 运行时库与经过测试的应用程序链接过程集成通常需要修改链接器命令行,在某些情况下,还需要修改执行环境。本节介绍如何在使用 C/C++test 附带的预构建版本时修改链接过程。

Windows Cygwin GNU GCC 编译器的静态库:

  1. 在构建脚本中找到链接器命令行
  2. 修改构建脚本,以便在链接器命令行中的某处指定覆盖运行时库——最好在所有目标文件之后。

MS CL 编译器的动态链接库:

  1. 在构建脚本中找到链接器命令行
  2. 修改构建脚本,以便在链接器命令行中的某处指定覆盖运行时库——最好在所有目标文件之后。例如:

    $ (LXX) $ (PRODUCT_OBJ) $ (OFLAG_EXE) $ (PROJ_EXECUTABLE) $ (LXXFLAGS) $ (SYSLIB) $ (EXECUTABLE_LIB_LXX_OPTS) <安装> /runtime/lib/cpptest.lib
  3. 确保将该[INSTALL_DIR]/bin目录添加到您的 PATH 环境变量中,以便在启动测试程序时可以找到该库。您还可以考虑将文件复制cpptest.dll(或cpptest64.dll)到与可执行文件相同的目录中,或者复制到在测试应用程序启动期间扫描动态链接库的其他位置。

Linux GNU GCC 编译器的共享库:

  1. 在构建脚本中找到链接器命令行
  2. 修改构建脚本,以便在链接器命令行中的某处指定覆盖运行时库——最好在所有目标文件之后。例如:

    $(LXX)$(PRODUCT_OBJ)$(OFLAG_EXE)$(PROJ_EXECUTABLE)$(LXXFLAGS)$(SYSLIB)$(EXECUTABLE_LIB_LXX_OPTS)-L<INSTALL>/runtime/lib-lcpptest

    请注意添加了 -L [INSTALL_DIR]/runtime/lib-lcpptest选项。

  3. 通过修改 LD_LIBRARY_PATH 环境变量以包含 [INSTALL_DIR]/runtime/lib 位置,确保可以通过测试的可执行文件找到共享库。

自定义运行时库

由于以下情况,您可能需要自定义运行时库:

  • 需要不同形式的二进制文件
  • 为结果传输启用非默认通信通道
  • 安装用于结果传输的通信通道的自定义实现
  • 启用对多线程应用程序的非默认支持
  • 安装支持多线程应用程序的自定义实现

库源代码结构

运行时库源代码随[INSTALL_DIR]/runtime目录中的 C/C++test 一起提供下表描述了结构: 

成分
描述
include

包含库包含文件的目录。
include/cpptest.h- 库公共接口
include/cpptest/* - 库私有接口
包含目录的内容不是为环境特定的修改而设计的。

src

包含库源代码的目录。
src/cpptest.c- 运行时库的主要和单一源文件
该文件专为修改和定制而设计。

Makefile 为构建运行时库提供的基本 Makefile。
target 包含一组 Makefile 的目录包含带有编译器特定选项的文件,用于为大多数流行的开发环境准备运行时库构建。
channel 包含一组 Makefile 的目录包含具有支持的通信通道配置的文件。

交换通信通道支持

运行时库支持通过各种通信渠道收集数据。使用的通信渠道取决于开发环境。在大多数情况下,将结果存储在一个或多个文件中是合适的,但在其他 TCP/IP 套接字或 RS232 传输中可能需要。通过在cpptest.c库源文件编译期间将值设置为专用宏,可以启用特定的通信通道将 -D<MACRO> 添加到编译命令行以设置值。下表提供了通信通道控制宏的完整列表:  

渠道
描述
CPPTEST_NULL_COMMUNICATION 空执行。如果启用,则不会发送任何结果。适用于初始测试构建和调试。
CPPTEST_FILE_COMMUNICATION

基于文件的实现。使用 ANSI C 文件 I/O 接口。如果启用,结果将写入本地驱动器文件。

还提供了以下附加配置宏:

CPPTEST_LOG_FILE_NAME:结果文件的名称;默认cpptest_results.clog

CPPTEST_LOG_FILE_APPEND:创建新的结果文件或附加到现有的。默认值为1 -> append,替代0 -> create new

CPPTEST_SPLIT_FILE_COMMUNICATION

基于文件的实现。使用 ANSI C 文件 I/O 接口。如果启用,结果将写入一系列本地驱动器文件。

您可以使用以下宏配置此通道:

CPPTEST_LOG_FILE_NAME: 系列中第一个结果文件的名称;默认为cpptest_results.clog. 其他文件将依次命名,例如cpptest_results.clog.0001.

要将系列传递给cpptestcli,请确保系列中的所有文件都位于同一目录中,并且仅提供第一个文件的名称作为输入。当您运行该cpptestcli命令时,其他文件将与系列中的第一个文件合并并从目录中删除。

CPPTEST_MAX_ALLOWED_NUMBER_OF_BYTES_PER_FILE: 指定系列中一个文件的最大大小;默认 2000000000 字节 (2 GB)。

CPPTEST_UNIX_SOCKET_COMMUNICATION

基于 TCP/IP 套接字的实现。使用 POSIX API。如果启用,结果将发送到指定的 TCP/IP 端口。提供了以下附加配置宏:

CPPTEST_LOG_SOCKET_HOST: 指定主机 IP 地址字符串

CPPTEST_LOG_SOCKET_PORT: 指定端口号

CPPTEST_GETHOSTBYNAME_ENABLED: 如果设置为1,可以通过域名指定主机(需要gethostbyname函数存在)

CPPTEST_WIN_SOCKET_COMMUNICATION 如上所述,使用了 MS Windows API。
CPPTEST_UNIX_SOCKET_UDP_COMMUNICATION 如上,基于UDP的实现。
CPPTEST_RS232_UNIX_COMMUNICATION

基于 RS232 的实现。使用 POSIX API。如果启用,则结果将通过指定的 RS232 系统设备发送。提供了以下附加配置宏:

CPPTEST_RS232_DEVICE_NAME: 系统设备名称

CPPTEST_RS232_BAUD_RATE: 传输波特率

CPPTEST_RS232_BYTE_SIZE: 字节大小

CPPTEST_RS232_PARITY: 奇偶校验控制

CPPTEST_RS232_STOP_BIT: 停止位使用

CPPTEST_RS232_TIMEOUT: 传输超时值

CPPTEST_RS232_WIN_COMMUNICATION 如上。使用 MS Windows API。
CPPTEST_RS232_STM32F103ZE_COMMUNICATION 基于 STM32F103x USART 的实现。使用STM Cortex库接口(ST/STM32F10x/stm32f10x.h需要头文件)
CPPTEST_HEW_SIMIO_COMMUNICATION 瑞萨 HEW 模拟器特定实现。
CPPTEST_LAUTERBACH_FDX_COMMUNICATION 基于劳特巴赫 TRACE32 的实现(使用 FDX)
CPPTEST_ITM_COMMUNICATION 基于 ARM CoreSight ITM 单元的通信。需要 CMSIS 头文件。
CPPTEST_CUSTOM_COMMUNICATION 为自定义实现启用空模板

如果使用提供的 Makefile 构建运行时库,则[INSTALL_DIR]/runtime/channel可以使用目录中提供的 make 配置文件之一有关详细信息,请参阅 与基于 Make 的构建系统集成

安装对自定义通信通道的支持

如果没有任何通信通道实现适合您的开发环境,则可以提供自定义实现。以下说明描述了如何自定义运行时库,以便它使用通信通道的自定义实现: 

  1. 复制<INSTALL_DIR>/runtime/src/cpptest.c并打开文件进行编辑。
  2. 找到第 1.13 节“自定义通信实现。
    自定义通信实现部分包含四种不同方法的空模板:

    功能
    描述
    void cpptestInitializeStream(void) 该函数负责初始化通信通道,例如创建并连接到套接字或初始化 UART 设备。
    void cpptestFinalizeStream(void) 该函数负责最终确定通信通道。例如,它可能负责关闭 TCP/IP 套接字。

    int cpptestSendData(const char *data, unsigned size)

    该函数负责从数据缓冲区发送大小字节。
    void cpptestFlushData(void) 该函数负责刷新数据。它的含义取决于特定的传输类型。它在某些实现中可能具有有限的应用。在这种情况下,它应该留空。
  3. 提供与您的环境要求相匹配的这些方法的实现。
  4. 编译cpptest.c与添加到编译命令行下面的宏定义:
    "-DCPPTEST_CUSTOM_COMMUNICATION"
  5. 如果生成的目标文件不足,您可以进一步处理该文件以满足您的需要(例如,创建共享库)。

切换多线程 API 支持

运行时库包含对多线程应用程序的支持。支持 POSIX、MS Windows 和 VxWorks API。您可以通过-D<MACRO>在编译期间添加到编译命令行来启用对特定多线程 API 的支持cpptest.c下表描述了多线程 API 支持控制宏的完整列表:

描述
CPPTEST_NO_THREADS 空执行。Coverage 运行时不准备与多线程应用程序一起使用
CPPTEST_WINDOWS_THREADS MS Windows 多线程 API 实现
CPPTEST_UNIX_THREADS POSIX 多线程 API 实现
CPPTEST_VXWORKS_THREADS VxWorks 多线程 API 实现

安装对自定义线程 API 的支持

如果您将 C/C++test 与不使用受支持的多线程 API 的多线程应用程序一起使用,您可以自定义运行时库以使用您的多线程 API。需要以下步骤:

  1. 复制[INSTALL_DIR]/runtime/src/cpptest.c并打开文件进行编辑
  2. 找到第 2.5 节“自定义多线程实现”
    自定义多线程实现部分包含两种不同方法的空模板:

    功能
    描述
    static int cpptestLock(void) 此函数可确保覆盖工具运行时库内的同步操作。如果一个线程锁定了对运行时库服务的访问,则意味着正在进行原子操作,并且没有其他线程可以使用运行时库服务。一旦锁定被释放,其他线程就可以使用运行时库服务
    static int cpptestUnlock(void) 释放对运行时库服务的锁定。
  3. 提供与您的环境要求相匹配的方法的实现。

  4. 编译cpptest.c与添加到编译命令行下面的宏:
    "-DCPPTEST_CUSTOM_THREADS"

  5. 如果生成的目标文件不足,您可以进一步处理该文件以满足您的需要(例如,创建共享库)。

构建运行时库

C/C++test 附带一个简单的 Makefile(请参阅库源代码结构),它简化了构建运行时库的过程。但是,在许多情况下,不需要提供的 make 文件,因为源代码已经针对构建过程进行了优化。始终需要的唯一步骤是编译主cpptest.c源文件。对生成的目标文件的任何额外处理将取决于特定的开发环境及其要求,例如提供运行时库作为共享库。

使用提供的 Makefile 构建运行时库

  1. 将目录更改为<INSTALL_DIR>/runtime.
  2. 如果需要修改编译标志(例如,添加特定的特定交叉编译器或定义以强制执行运行时库重新配置),请在目标子目录中提供一个新的 make 配置文件。为方便起见,复制现有的目标配置文件之一并修改其内容以满足您的需要。

  3. 调用以下命令行以创建build包含单个对象子目录,该对象cpptest.<OBJ_EXT>可用于与检测的应用程序链接。

    make TARGET_CFG=<目标配置文件名> CHANNEL_FILE=<通道配置文件名>

    您的命令行可能类似于以下内容:

    make TARGET_CFG=gcc-static.mk CHANNEL_FILE=channel/unix-socket.mk

    或者,您可以提供频道类型:

    make TARGET_CFG=gcc-static.mk CHANNEL_TYPE=unix-socket
  4. 如果需要从共享库、动态链接库或任何其他类型的二进制文件链接覆盖运行时库,则需要为此目的自定义 Makefile 或需要设置自定义构建。

运行时库的用户构建

要设置覆盖工具运行时库的用户构建,请执行以下步骤:

  1. 将 cpptest.c 文件复制<INSTALL_DIR>/runtime/src/cpptest.c到您的首选位置。
  2. 引入自定义运行时库中所述的任何自定义
  3. 设置您喜欢的构建系统(例如,IAR Embedded Workbench 项目或任何其他类型的源代码构建器)。
  4. 修改编译标志以包含编译器包含 -I具有以下值的标志(通常为):
    -I<INSTALL_DIR>runtime/include
  5. 添加任何必需的配置定义(通常-D),例如:
    -DCPPTEST_FILE_COMMUNICATION -DCPPTEST_NO_THREADS
  6. 调用命令来运行您的构建器(例如,在 IDE 中选择构建命令)。
  7. 找到生成的对象文件并使用它与您的检测应用程序链接。

Parasoft——领先的自动化测试工具,满足绝大多数行业标准

Parasoft是一家专门提供软件测试解决方案的公司,帮助企业打造无缺陷的软件。

从开发到质量检查,Parasoft的技术通过集成静态和运行时分析,单元、功能和API测试,以及服务虚拟化,在不牺牲质量和安全性的情况下加快软件交付,节约交付成本。

强大的报告和分析功能可帮助用户快速查明有风险的代码区域,并了解新代码更改如何影响其软件质量,而突破性的技术将人工智能和机器学习添加到软件测试中,使组织更容易采用和扩展跨开发和测试团队的有效的软件测试实践。

Parasoft针对C/C++、Java、.NET和嵌入式的开发测试都有着30多年的深入研究,很多全国500强企业使用Parasoft的产品实现了软件快速、高质量的交付。


申请Parasoft测试试用



自动化测试工具Parasoft C/C++ test 自动化用户指南(十一):Visual Studio设置



标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至hey@evget.com


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
在线咨询
联系我们
TOP
在线客服系统
live chat