logo Parasoft C/C++test 使用教程 我也要发布文档

结合使用Parasoft C/C++test和CMake进行单元测试


结合使用Parasoft C/C++test和CMake进行单元测试

C/C++test 2020.1的更新引入了将C/C++test与CMake集成在一起以进行静态分析和单元测试的功能。这篇文章重点介绍如何在基于CMake的项目中使用Parasoft C/C++test进行单元测试。(查看结合使用Parasoft C/C++test和CMake进行静态分析

单元测试要集成到开发过程中要比静态分析要复杂得多。最后,必须创建可执行二进制文件。对于由多个库和可执行文件组成的大型项目而言,这尤其成问题。

我们用于静态分析的compile-info JSON文件还不够。它没有提供有关项目结构的重要信息-哪些文件包含在哪些二进制文件中,以及哪些文件应一起进行测试。


将单元测试集成到基于Cmake的项目中

为了使Parasoft C/C++test单元测试轻松集成到基于CMake的项目中,2020.1版本引入了CMake扩展,该扩展允许定义C/C++test的单元测试目标。这些目标会自动生成C/C++test项目文件,这些文件可用于创建,运行和维护单元测试。

此扩展旨在使用户能够定义Parasoft C/C++test单元测试所需的整个基础架构,以及其在CMake配置文件中的常规目标。


基于Cmake项目的单元测试示例


让我们使用一个基于C/C++test Professional的示例(基于Eclipse的工具)来查看其工作原理,该工具具有丰富的UI。下载并安装2020.1版本(如果尚未安装)


按照这些步骤

C/C++test Professional的主安装目录中,您可以找到带有示例的CMake扩展。请参阅以下目录:integration/cmake。

对于我们的实验,我建议将integration/cmake文件夹从安装中复制到您的首选位置。该示例的结构如下所示:

app文件夹包含“可执行”目标。具有三个子文件夹(mod1,mod2和mod3)的modules文件夹表示用于链接可执行文件的静态库。另外,cmake文件夹包含CMake的C/C++test扩展。您可能需要将此文件夹复制到实际项目中才能使用此扩展名。

这种简化的结构描绘了团队尝试实施单元测试工作时面临的典型挑战:如何将整个项目分为可测试的块,代表逻辑上属于同一组的文件。

在大多数情况下,开发人员将不希望针对通过编译整个项目中的所有文件而创建的一个Blob二进制文件执行单元测试。用户很可能会对在项目中定义的相同二进制目标(可执行文件和库)添加测试用例感兴趣。


如何为项目中定义的相同二进制目标添加测试用例

在讨论配置语法的详细信息之前,让我们使用提供的示例了解其工作方式。

1.在app文件夹所在的顶级目录中,创建一个构建目录,cd进入该目录,并调用生成脚本,如下所示:

2.使用生成脚本(makefile)生成CMake之后,调用make生成示例项目:

3.启动C/C++test专业版(安装文件夹中的cpptest可执行文件)。选择一个空的工作区,使用“文件菜单->导入...->现有项目到工作区”,然后选择“根目录”作为复制示例的主文件夹。向导将递归扫描选定的文件夹,并找到所有自动生成的项目。如果您看到类似下面的内容,则可以单击“完成”。

Eclipse将导入所有项目,您将拥有一个新的工作区,可以进行单元测试。您无需执行任何其他操作即可开始添加和运行测试用例,并努力提高代码覆盖率。

4.在项目导航器中,选择所有三个项目,右键单击并使用“Parasoft-> Test Using->内置->单元测试->生成单元测试”测试配置自动生成测试用例。生成测试后,请从同一位置执行“运行单元测试”配置。

通过这四个简单的步骤,您就为单元测试准备了项目基础结构。现在,团队已准备好开始处理测试用例。


它是如何工作的?

除了常规的构建目标外,CMakeLists.txt文件还包含单元测试目标。当使用cmake生成构建脚本时,也会自动生成C/C++test项目文件。稍后在构建过程中,会自动生成C/C++test项目所需的其他构建数据文件。

定义单元测试项目的结构所需的所有内容都保存在CMakeLists.txt文件中。该团队不需要维护任何其他配置文件。一切都很好,干净。可以检出项目,生成脚本和C/C++test项目,可以将测试与源代码一起添加和检入,并且可以在CI中执行完整的测试。


近距离观察

让我们仔细看看C/C++test CMake扩展,以及它如何帮助定义测试项目基础架构。 打开modules/mod1/CMakeLists.txt文件。您应该看到类似以下的内容:

在前六行中,您可以看到常规目标定义。在这里,我们定义了一个简单的库目标,其中包含一个源文件mod1.cpp和include文件目录。 这就是您通常在CMake项目中看到的内容。

在第11行中,我们有了C/C++test扩展提供的新CMake函数。此功能允许您定义单元测试目标,该目标将生成所有必需的C/C++test项目文件。您可以在integrations/cmake/README.md中找到此功能的完整说明。在此特定示例中,完成以下操作:

  • 11行定义了目标名称。默认情况下,它将用作Eclipse项目名称
  • 12行:为C/C++test指定了编译器配置,以便能够解析和检测代码。
  • 13行:添加了应包含在单元测试目标中的源文件
  • 14行:特定于目标的包含文件位置已添加到单元测试目标。这与您对常规目标所做的相同。

这个简单的目标定义足以为Parasoft C/C++test生成单元测试项目。项目文件将在CMakeLists.txt文件的位置生成,这可能是最方便的。如果愿意,可以在源代码树之外生成项目文件,并避免任何合并问题。这显示在app/CMakeLists.txt中:

  • 11行:定义了目标名称。默认情况下,它将用作Eclipse项目名称。
  • 12、13行:指定了C/C++test项目位置。在这里,我们在源代码树之外创建项目。
  • 14、15行:创建了一个与日食链接的文件夹。您需要指定文件夹的名称和将链接的位置。
  • 16、17行:添加了应该包含在单元测试目标中的源文件
  • 19行:为单元测试目标添加了三个库。C/C++test在构建测试可执行文件时将使用这些库。

有关更多详细信息,请从/integrations/cmake目录中查看以下文件:

  • README.mc
  • app/CMakeLists.txt
  • modules/mod1/CMakeLists.txt
  • tests/cpptest_modules/CMakeLists.txt


总结


这是有关扩展的要点。

可以在以下目录的C/C++test专业版安装中找到CMake扩展:/integrations/cmake/cmake。您可能需要将其复制到您的项目结构中。

要使用与C/C++test相关的扩展功能来启用CMake,您将需要使用以下命令在CMakeLists.txt文件结构中包括该扩展:

  • 包含(cmake / cpptest.cmake)
  • 请参阅integration/cmake/CMakeLists.txt中的示例。

您可以根据需要定义单元测试目标(这会影响C/C++test项目)。您可以为可执行文件、库、库的组合或文件的任意集合添加单元测试项目。

您需要确保所有必需的头文件和库都包含在目标定义中。CMake的常规规则在这里适用。如果包含该库或选项,则在全局级别设置。然后它将被包含在您的单元测试目标中。如果您有任何特定于目标的设置,则需要添加它们。

如果要为现有二进制目标(如库或可执行文件)添加单元测试目标,建议的过程是复制对原始目标完成的所有设置。、注意:您可以将整个目标添加到cpptest_add_executable函数,该函数会将所有源文件复制到新目标。

如果您不介意在源文件目录中创建C/C++test项目文件,则这是最简单且建议的设置。如果您希望将项目文件放置在源代码树之外的某个位置,则可以轻松实现。

您无需检入生成的C/C++test项目文件(.project和.parasoft)。将为每个新版本重新创建它们。但是,您应该检入所有测试用例和存根。

(查看结合使用Parasoft C/C++test和CMake进行静态分析