本教程包含一组涉及单元测试的各个方面的练习。使用引言中提供的信息以及在练习中学习到的测试实践,您可以制定出满足您特定要求的测试原理。有关在 C++test 中执行测试和覆盖率分析的详细信息,请参阅《 C++test 用户指南》的测试生成和执行部分。
此章节:
先决条件
ATM 项目必须在您的工作空间中可用解决方案资源管理器。有关如何实现此操作的详细信息,请参见 教程 - 创建一个 C++test 项目 。
C++test 单元测试简介
任何测试活动都需要定义和理解:
- 测试目标/要求
- 测试指标
- 测试策略
- 测试预算
独立的 Versus 项目范围的单元测试
选择一种方法时,要考虑的一个因素是单独执行单元测试还是在整个项目范围内执行 API 测试。
- 独立地进行单元测试意味着创建通常不使用在测试文件外部定义的功能的测试,出于测试目的,这些测试将被桩函数替换。
- 具有项目范围的单元或 API 测试将创建完全耦合的测试,这些测试使用了被测单元可用的所有外部功能。结果是所需桩函数的数量减少,并且集合中的每个测试都可以执行一个或多个功能,因此,相对于测试数量而言,可以获得更大的总体测试覆盖率。
两种方法都需要权衡取舍,但是项目要求和 SDLC 确定的测试阶段通常决定单元测试方法。C++test 支持两种方法,以及两种方法的创造性结合。
隔离单元测试注意事项
- 项目测试需求要求独立进行单元测试(目的是在代码集成之前验证底层功能)。
- 测试必须与新开发的源代码一起提交。有问题的文件编译后,可以立即进行隔离测试。
- 该项目是从头开始开发的,在许多情况下,大多数依赖项组件或类都不可供开发人员编写测试使用。
对于少量文件,隔离的单元测试通常需要较少的工作来配置和运行。处理小得多的文件也可能会大大减少 C++test 的总体测试准备和运行时间。测试更大的文件隔离集时,在定义桩函数和管理桩函数文件时应格外注意。
请注意,在隔离测试中开发的测试通常可以在以后的测试周期中重新用于项目级别的测试。可以通过定义特定的源文件、库和桩函数文件来调整已测试代码与系统其余部分的耦合,以供测试目的使用或忽略。所有这些都可以通过 C++test 测试配置中的各种设置来完成。
项目(耦合)单元测试注意事项
- 该项目是对现有代码库的增量修改。
- 验证整个项目的功能/用例比实现 100% 的代码覆盖率更为重要。
在项目范围内进行测试意味着,除非您使用"user”桩函数将其明确桩函数,否则您选择进行测试的对象的范围将扩大到包括项目中定义的所有符号。
在 C++test 流程中,项目级别的单元测试可能会花费更多的时间来处理和准备-但这只是挂钟时间。设置基于项目的测试的总体工作通常较少。
如果解决了项目中的所有符号,则可以成功链接到项目,并且您最关心的是单元测试达到代码覆盖率要求,那么最好的方法是在项目范围内进行初始单元测试。您仍然可以进行基于类的测试,但是当您对选定的类进行覆盖时,还将测试项目中的其他代码并报告覆盖率。
基本程序
步骤 | 项目范围 | 文件范围(隔离) |
---|---|---|
阶段 1:设置测试配置 | 对于基于主机的测试,用于生成测试、生成存根和运行测试的内建配置应该可以正常工作。但是,将内建配置复制到用户定义的文件夹以确保一致的环境是一个好习惯。始终复制配置,以便您可以轻松识别它并记住其用途。 | 两种方法都相同 |
阶段 2:选择一个类或者多个类 | 测试范围将扩大到包括整个项目以供选择。但是,将仅运行与所选代码关联的单元测试。 | 可以通过在项目中选择一个或多个源文件来设置测试范围。为防止在运行单元测试时出现未定义的符号错误,应使用与生成桩函数相同的作用域或作用域的子集。 |
阶段 3:生成单元测试 | 运行【生成单元测试】配置以设置测试基础结构并创建测试套件。测试生成不是特定于项目范围或文件范围的,因此您可以生成测试并将其用于任一测试方案。创建测试后,您可以从项目树中打开测试套件的源代码,或使用 C++test 测试用例浏览器导航到生成的单元测试。 | 在项目树中选择测试范围,然后运行【生成单元测试】配置。如果存在针对单元测试范围之外的代码的测试,则将忽略它们。如果缺少该范围内的代码的测试,则不会对该代码进行测试。创建测试后,您可以从项目树中打开测试套件的源代码,或使用 C++test 测试用例浏览器导航到生成的单元测试。 |
阶段 4:生成桩函数 | 桩函数视图提供了符号用法的可见性。提供了一个内建配置,该配置将加载桩函数视图并显示符号,定义类型和位置。如果计划将此配置集成到您的过程中,则应复制并重命名该配置。在生成桩函数之前,桩函数视图将列出不可用或正在使用原始定义的符号(原始代码在作用域中可用)。生成桩函数后,您应该看到所有定义为“原始”或“自动”的符号。如果创建了用户桩函数,它们将显示为“用户定义”。 要自动生成桩函数,请在项目树中选择测试范围,然后运行桩函数生成配置。默认情况下,在项目 stubs/autogenerated 目录中将创建桩函数为源代码。如果原始定义可用于所有符号,则不会生成任何桩函数。查看“桩函数”视图以确保定义了所有符号。 | 两种方法都相同 |
阶段 5:运行单元测试 | 选择范围并执行配置以运行测试。测试配置将使用生成的测试基础结构、测试套件和可用的存根生成测试可执行文件。该可执行文件将运行、创建结果文件,并将其加载到 C++test GUI 中进行分析。 您还可以使用 C++test 测试用例浏览器来查看和选择一个或多个测试用例来运行。如果存在针对所选文件或测试之外的代码的测试,则将忽略它们。如果选择中的代码缺少测试,则该代码将不执行。 | 两种方法的步骤相同。附加注释:选择测试范围时,必须选择与生成存根相同的范围或范围的子集。 |
单元测试练习说明
以下练习按在项目测试中最喜欢使用的顺序进行说明。该流程假定您必须在代码完成且所有功能可用之前进行测试。最后的练习包括如何生成有关测试工作的报告。
C++test 测试配置用于设置和管理测试。实际上,内建的测试配置用于创建模板。您应该将它们复制到用户定义的文件夹中,以便可以对其进行检查和修改以符合您的要求。以下练习需要几种测试配置。我们将在各个练习中介绍每个测试配置的详细信息。从前面的教程中可以假定您已经熟悉复制和修改测试配置。
练习设置
为了准备以下练习,您需要使用新的 ATM 示例代码副本进行项目设置,如教程 - 创建 C++ 测试项目中所述。
练习
- 练习 1 - 生成单元测试
- 练习 2 - 使用测试用例浏览器
- 练习 3 - 查看桩函数信息
- 练习 4 - 生成缺少或未定义函数的桩函数
- 练习 5 - 对项目范围内的文件执行单元测试
- 练习 6 - 对独立文件(文件范围)执行单元测试
- 练习 7 - 查看单元测试结果并修复单元测试问题
- 练习 9 - 对所有项目文件进行单元测试
- 练习10 - 检查和验证测试结果并创建回归测试
- 练习 11 - 生成单元测试报告
- 练习 12 - 在单元测试中使用数据源
- 练习 13 - 使用工厂函数生成单元测试
- 练习 14 - 在 C++test 下执行现有的 CppUnit 测试