本节说明如何通过 Docker 容器提供的 C/C++ 工具链或测试环境,使用 C/C++test 运行分析和执行测试。

章节目录:

说明

C/C++test 内置在 Docker 容器中运行分析和执行测试的支持。在这种场景下,本地计算机上的 C/C++test 被配置为在包含测试环境或 C/C++ 工具链的容器中运行分析和执行测试。

用于 C/C++test 的 Docker 集成包括以下组件:

  • 位于 [INSTALL_DIR]/integration/docker 中用于在 Docker 容器中执行远程进程的脚本
    remote-gcc – gcc 命令包装器
    remote-g++ – g++ 命令包装器
    remote-exec – 通用命令包装器
  • builtin://Run Unit Tests in Container – 用于在 Docker 容器中运行单元测试的测试配置。

要求

  • Linux 64 位(主机)
  • Linux 64 位的 C/C++test Professional(安装在主机中)
  • 包含工具链和测试执行环境的 Docker 容器镜像,用于通过 C/C++test 运行分析和测试

配置和运行容器

要实现 C/C++test 和 Docker 容器之间的通信,必须确保容器能够访问主机上与您希望使用 C/C++test 测试的项目相关的所有目录,并确保 C/C++test 能通过容器的标识符或名称识别您要使用的容器。

  1. 将以下文件夹挂载到容器中:
    • Eclipse 工作空间位置。
    • Eclipse 项目位置 – 如果项目位于 Eclipse 项目或工作空间之外。
    • Eclipse 项目或工作空间之外的所有源文件的位置。
    • C/C++test 安装位置 – 仅在对项目进行单元测试时需要,以确保能够从容器内访问 C/C++test 运行时库。
  2. 将容器的 ID 或名称分配给 CPPTEST_CONTAINER_NAME 环境变量。为方便使用,建议为容器指定一个可读且有意义的名称。

示例

以下示例假设项目和所有源文件都在 Eclipse 工作空间中(/home/devel/workspace)并且 C/C++test 安装在 /opt/parasoft/cpptest。用 --name 选项指定的容器名称为“gcc9-test-container”以指示容器镜像包含 GCC 9 编译器。

docker run --rm -it -d -v /opt/parasoft/cpptest:/opt/parasoft/cpptest -v /home/devel/workspace:/home/devel/workspace --name gcc9-test-container gcc:9

将容器名称分配给环境变量:

export CPPTEST_CONTAINER_NAME=gcc9-test-container

配置 C/C++test 以在容器中运行分析和测试

创建用于单元测试的自定义编译器配置

在 Docker 容器中使用 C/C++test 执行测试需要创建自定义编译器配置,以确保可以在容器内构建 C/C++test 的运行时库。

  1. 复制与您的 Docker 编译器匹配的编译器配置(有关创建自定义编译器配置的详细信息,请参阅使用交叉编译器配置测试)。
  2.   修改 <CUSTOM_COMPILER_CONFIG>/gui.properties 文件以设置或删除以下选项:
    - 设置 autoBuildRuntimeLib=tru。
    - 从 linkerCmdLine 中删除 -lcpptestruntime64

如果仅运行静态代码分析,您可以跳过创建自定义编译器配置的操作。

设置用于在容器中进行测试的项目

您需要修改您的项目属性才能为项目配置远程工具链。

  1. 在您的 IDE 中打开项目属性。
  2. 找到 Parasoft> C/C++test> 构建设置> 编译器设置
  3. 选择与您的编译器配置匹配的编译器系列;请参阅创建用于单元测试的自定义编译器配置
  4. 用包装器脚本替换默认的 C/C++ 编译器和链接器命令:
    - C 编译器:<CPPTEST_INSTALL_DIR>/integration/docker/remote-gcc
    - C++ 编译器:<CPPTEST_INSTALL_DIR>/integration/docker/remote-g++
    - 链接器:<CPPTEST_INSTALL_DIR>/integration/docker/remote-g++

    或者,您可以将脚本从 <CPPTEST_INSTALL_DIR>/integration/docker 复制到您的项目中,并指定与您的项目相关的路径。这样即可将设置存储在源码管理系统中,并在团队中共享。例如:
    - C 编译器:${project_loc}/docker/remote-gcc
    - C++ 编译器:${project_loc}/docker/remote-g++
    - 链接器:${project_loc}/docker/remote-g++

在容器中运行静态分析

在运行静态分析之前,请确保您的 Docker 容器正在运行(请参阅配置和运行容器)。无需其他配置步骤。

您可以使用任何测试配置来分析代码。在分析期间,C/C++test 将使用通过您在项目属性中配置的包装器脚本访问的 Docker 容器中的 C/C++ 编译器(请参阅设置用于在容器中进行测试的项目)。

在容器中创建和执行单元测试

生成单元测试

在使用 C/C++test 创建单元测试之前,请确保 Docker 容器正在运行(请参阅配置和运行容器)。无需其他配置步骤。

您可以使用测试配置来生成单元测试(例如,builtin://Generate Unit Tests)。在测试生成期间,C/C++test 将使用通过您在项目属性中配置的包装器脚本访问的 Docker 容器中的 C/C++ 编译器(请参阅设置用于在容器中进行测试的项目)。

执行测试用例

  1. 在使用 C/C++test 运行单元测试之前,请确保您的 Docker 容器正在运行(请参阅配置和运行容器)。
  2. (可选)复制 Run Unit Tests in Container 内建测试配置并修改参数以创建自定义测试配置。例如,您可以在执行> 常规> 执行细节> Remote execution command 中修改执行包装器脚本的位置(默认为 ${cpptest:install_dir}/integration/docker/remote-exec)。
  3. 运行 Run Unit Tests in Container 内建或自定义测试配置。C/C++test 将:
    a) 使用项目属性中指定的远程工具链构建测试可执行文件(请参阅设置用于在容器中进行测试的项目)。
    b) 使用 remote-exec 包装器脚本在容器内执行测试。
    c) 自动收集测试结果和覆盖率信息。


  • No labels