本教程包含一组涵盖单元测试各个方面的练习。使用引言中提供的信息以及在练习中学习到的测试实践,您可以制定满足您特定要求的测试体系。有关在 C++test 中执行测试和覆盖率分析的详细信息,请参阅  C++test 用户指南的测试生成和执行部分。

章节目录:

先决条件

ATM 项目必须存在于您的工作空间。有关如何实现此操作的详细信息,请参阅教程 - 创建 C++test 项目 

C++test 单元测试简介

任何测试活动都需要定义和理解:

独立的单元测试与项目范围的单元测试

在选择测试方法时,需要考虑是独立进行单元测试还是在整个项目范围内执行 API 测试。

两种方法各有利弊,但具体选择通常取决于项目需求以及 SDLC 中确定的测试阶段。C++test 支持这两种方法以及两种方法的灵活组合。

独立单元测试注意事项

对于少量文件,独立单元测试通常需要较少的配置和运行工作。处理更小的文件集还可以显著减少 C++test 的整体测试准备时间和运行时间。当对较大文件集进行独立测试时,需要特别注意桩函数的定义以及桩函数文件的管理。

需注意,在独立测试期间开发的测试通常可以在后续测试周期的项目级测试中重复使用。通过定义用于测试的特定源文件、库和桩函数文件,可以调整测试代码与系统其余部分的耦合程度。这些都可以通过 C++test 测试配置中的各种设置完成。

项目(耦合)单元测试注意事项

在项目范围内测试意味着,测试范围将扩展为包括项目中除了被“user”桩函数显式打桩的符号以外的所有定义符号。

在 C++test 流程中,项目级单元测试可能会花费更多的时间来处理和准备——但这只是指挂钟时间。总体而言,设置项目级测试所需的工作量通常更少。

如果项目中的所有符号都已解析,项目能够成功链接,并且您的主要关注点是通过单元测试满足代码覆盖率要求,那么首先在项目范围内进行单元测试是最佳的方法。您仍然可以进行基于类的测试,但在提高所选类覆盖率的过程中,也会测试项目内的其他代码并报告覆盖率。

基本步骤 

步骤项目范围文件范围(独立)

阶段 1:设置测试配置

对于基于主机的测试,内建配置用于生成测试、生成桩函数和运行测试,通常无需修改即可正常使用。然而,为了确保环境一致性,建议将内建配置复制到用户自定义的文件夹中。始终为复制的配置命名,以便您能够轻松识别并记住其用途。两种方法相同
阶段 2:选择一个类或者多个类测试范围将扩大到包括所选项的整个项目。但是,将仅运行与所选代码关联的单元测试。可以通过在项目中选择一个或多个源文件来设置测试范围。为防止在运行单元测试时出现未定义的符号错误,应使用与生成桩函数相同的范围或范围子集。
阶段 3:生成单元测试运行 Generate Unit Tests 配置以设置测试基础结构并创建测试套件。测试生成并不特定于项目范围或文件范围,因此您可以生成测试并将其用于任意测试方案。创建测试后,您可以从项目树中打开测试套件的源代码,或使用 C++test 测试用例浏览器导航到生成的单元测试。在项目树中选择测试范围,然后运行Generate Unit Tests 配置。如果存在单元测试范围外的代码测试,则会忽略这些测试。如果测试范围内的代码缺少测试,则不会测试相应代码。创建测试后,您可以从项目树中打开测试套件的源代码,或使用 C++test 测试用例浏览器导航到生成的单元测试。
阶段 4:生成桩函数

桩函数视图中可以查看符号的使用。提供的一个内建配置可加载桩函数视图并显示符号、定义类型和位置。如果计划将此配置集成到流程中,建议复制并重命名该配置。在生成桩函数之前,桩函数视图将列出不可用或正在使用原始定义的符号(原始代码在范围中可用)。生成桩函数后,应能看到所有定义为 Original Auto 的符号。如果创建了用户桩函数,它们将显示为 User Definition

要自动生成桩函数,可在项目树中选择测试范围,然后运行桩函数生成配置。默认情况下,桩函数作为源代码创建在项目的 stubs/autogenerated 目录中。如果原始定义可用于所有符号,则不会生成任何桩函数。查看桩函数视图以确保定义了所有符号。

两种方法相同

阶段 5:运行单元测试

选择范围并执行配置以运行测试。测试配置将使用生成的测试基础结构、测试套件和可用的桩函数生成测试可执行文件。该可执行文件运行后会生成结果文件,并将其加载到 C++test GUI 中进行分析。

您还可以使用 C++test 测试用例浏览器来查看和选择一个或多个测试用例来运行。如果存在针对所选文件或测试之外的代码的测试,则会忽略这些测试。如果选择范围内的代码缺少测试,则不会测试相应代码。

两种方法的步骤相同。附加注释:选择测试范围时,必须选择与生成桩函数相同的范围或范围子集。

单元测试练习说明

以下练习按照项目测试过程中最有可能使用的顺序进行。该流程假设在代码尚未完成且所有功能尚不可用的情况下需要进行测试。最后的练习将介绍如何生成测试工作报告。

C++test 测试配置用于设置和管理测试。实际上,内建的测试配置用于创建模板。建议将它们复制到用户自定义文件夹,以便根据需求查看和修改。以下练习需要使用多个测试配置。我们将在各个练习中详细讲解每个测试配置。这里假设在完成前面的课程内容后,您已经熟悉测试配置的复制与修改过程。

练习设置

为了准备以下练习,您需要使用新的 ATM 示例代码副本进行项目设置,如教程 - 创建 C++ 测试项目中所述。

GNU 基于主机的测试步骤

  1. 使用 C++test ATM 示例代码创建用于单元测试的项目目录。

2. 将以下文件从 [C++test install directory]\examples\ATM 复制到新目录:


3. 创建一个 C:\C++test\Tutorial\ATMEclipseGnu\ATM\include 目录,然后将以下文件复制到 include 目录。

4. 确保您的 Windows 环境包含 gcc、g++、make 等的路径。

5. 启动 C++test 并在您创建的 ATM 父目录中创建一个新的工作空间。

6. 从 C++test 透视图选择文件> 新建> 项目

7. 展开 C++,选择 C++ 项目,然后点击下一步

8. 在项目名称字段中输入 ATM。

9. 清除使用缺省位置

10. 浏览到 ATM Makefile 的位置。

11. 在项目类型下选择 Makefile 项目> 空项目

12. 在工具链下选择 Cygwin GCC

13. 点击完成

14. 当您看到一个对话框询问是否要打开关联的透视图时,可根据您的偏好进行选择。您可以选择在 C/C++ 透视图或 C++test 透视图中工作。

15. 对 ATM.cxx 运行静态分析,作为对项目设置的合理性检验。有关更多信息或运行静态分析,请参阅教程 - 根据编码标准分析代码

练习