您可以捕获测试用例中的函数快照,用于回归测试。测试用例还可以识别可能导致异常的条件,这些异常可能导致系统和应用程序不稳定、安全漏洞(例如拒绝服务攻击)、性能和应用程序响应时间不佳以及频繁停机。
内容包括:
关于自动测试用例生成
C++test 根据测试配置的生成选项卡中定义的参数自动生成测试用例。这些测试用例使用的格式类似于主流的 CppUnit 格式。
使用默认设置,C++test 为每个源/头文件生成一个测试套件。也可以将其配置为每个函数生成一个测试套件或每个源文件生成一个测试套件(详细信息请参阅自定义生成选项)。
安全桩函数定义会自动生成以替换“危险”函数,其中包括系统 I/O 例程,例如 rmdir()、
remove()、
rename()
等。此外,可以针对缺少的函数和变量定义自动生成桩函数。(详细信息,请参阅了解和自定义自动桩函数生成)。可以根据需要添加用户定义的桩函数(详细信息,请参阅添加和修改桩函数)。
生成测试用例
生成测试用例的一般过程:
- 根据您所需的测试生成设置来查找或创建测试配置。
- 有关预配置的测试配置的说明,请参阅内建测试配置
- 有关如何创建自定义测试配置的详细信息,请参阅配置测试配置和策略规则。有关 C++test 特定选项的详细信息,请参阅配置测试配置。
- 运行测试配置
有关从 GUI 进行测试的详细信息,请参阅从 GUI 进行测试。
有关从命令行进行测试的详细信息,请参阅从命令行界面进行测试。提示-从测试用例浏览器生成测试
您可以直接在测试用例浏览器(可以通过选择 Parasoft> 显示视图> 测试用例浏览器打开)中为项目生成测试。只需在测试用例浏览器中右键点击项目节点,然后从测试历史或测试执行快捷菜单中选择所需的测试生成测试配置。
有关测试用例浏览器的详细信息,请参阅浏览 C++test 用户界面。
- 查看生成的测试用例。
- 有关详细信息,请参阅查看自动生成的测试用例。
- (可选)根据需要调整测试生成设置。
- 有关详细信息,请参阅生成选项卡设置 - 定义测试用例的生成方式。
自定义生成选项
您可以通过自定义测试配置的生成选项卡中的选项来控制各种生成选项。
控制测试套件的文件名、位置和布局
可以通过在测试配置的生成> 测试套件选项卡中自定义选项来控制生成的测试套件的文件名、位置和粒度/布局。
要更改默认的测试套件输出设置,首先从测试套件输出文件和布局框中选择以下三个预定义的输出和布局选项之一:
- 为每个被测函数创建一个测试套件
- 为每个被测源/头文件创建一个测试套件
- 为每个被测源文件创建一个测试套件
如果选择了为每个被测函数创建一个测试套件选项,为示例 ATM 项目(包括在 examples 目录中)生成的测试套件如下所示:
选择这些选项之一后,您可以根据需要自定义模式(例如,将测试生成到源位置)。使用自定义模式时,可以使用以下变量:
- ${test_ext} - C++test 专用的测试套件文件扩展名(.cpp)。
- ${File_name-} 文件名。
- ${File_base_name-} 没有扩展名的文件名。
- ${File_ext-} 文件扩展名。
- ${File_loc-} 文件位置。
- ${file_loc_rel-} 相对于项目根目录的文件位置。
- ${File_uid-} 文件唯一标识符。
- ${Function_name-} 被测函数名称。
- ${function_uid-} 被测函数的唯一标识符(根据函数签名/重整名称计算得出的哈希码)。
- ${Src_file_name-} 上下文(源)文件的名称。(“上下文文件”是一个源文件,描述定义了指定被测函数的编译单元)。
- ${src_file_base_name-} 上下文(源)文件的名称,不带扩展名。
- ${Src_file_ext-} 上下文(源)文件的扩展名。
- ${Src_file_loc-} 上下文(源)文件位置。
- ${src_file_loc_rel-} 相对于项目根目录的上下文(源)文件位置。
- ${Src_file_uid-} 源(上下文)上下文文件唯一标识符(从源文件位置计算得出的哈希码)。
键
- file = 定义了被测函数的源/头文件。
- source file = 定义了定义被测函数的编译单元的源文件。
警告
删除一些变量可能导致测试套件重叠。C++test 将通过显示错误消息“测试套件的输出文件模式不明确”来提醒您。
针对更改生成测试位置的基本模式,C++test 使用以下内部检查和限制:
- 所有自动生成的测试都是“包含”类型(测试套件文件与指定的源文件/编译单元“粘合”在一起)。
- 尝试防止将来自不同编译单元的函数测试用例放入同一个测试套件文件的情况(因为无法将这样的测试套件文件与原始的源文件正确地“粘合”)。
- C++test 拥有不同的变量(根据被测文件、文件名、位置等来解析),可用于让测试套件的文件模式变得明确(就上述内容而言)。
- 一种常用的策略是将测试套件文件生成到包含原始文件名称/位置的文件或位置中。以下是默认的模式:
${project_loc}/tests/autogenerated/${file_loc_rel}/
TestSuite_${file_base_name}_${file_ext}.${test_ext}
这种模式更明确是因为使用了 ${file_loc_rel} 和 ${file_base_name} 变量(即使项目中有许多同名文件,它们的位置也会有所不同,并且该位置将成为套件文件名/位置的一部分)。 - 还有其他可用变量,例如 ${file_uid}、${src_file_uid},可以使用它们代替 ${file_loc_rel}/${file_base_name},同时保持模式明确。这些变量被解析为原始文件位置的哈希码。例如,像
${project_loc}/tests/autogenerated/
TestSuite_${file_base_name}_${file_uid}_${file_ext}.${test_ext}
这样的模式将会生成如下测试套件:
ATM/tests/autogenerated/TestSuite_Account_d7a5efc6_hxx.cpp
追加或替换现有测试
您还可以控制当生成的测试文件与现有的测试套件文件具有相同的名称和位置时,C++test 是追加测试还是替换现有测试。此行为由当为具有现存测试套件的代码生成测试设置决定,该设置提供以下选项:
- 为没有测试的函数添加测试:C++test 将为没有测试的函数生成测试用例。现有测试将不会受到影响或修改。
- 为所有函数添加测试:C++test 将为所有函数生成测试用例。现有测试将不会受到影响或修改。
- 替换现有的测试套件:C++test 将为所有函数生成测试用例。现有的测试套件将被删除,然后替换为新的套件。
C++test 如何判断指定函数是否存在现有的测试用例?
在测试套件文件中寻找 CPPTEST_CONTEXT 和 CPPTEST_TEST_SUITE_INCLUDED_TO 标记。
常见测试生成目标
下表说明了如何配置测试配置的生成选项以实现常见的测试生成目标。涵盖的选项包括生成> 常规选项卡的为代码生成测试选项和生成> 测试套件选项卡的当为具有现存测试套件的代码生成测试选项。
目标 | 设置 |
---|---|
生成一组初始测试 | 对于为代码生成测试,启用没有测试套件。指定其他参数(函数访问级别、输出文件位置/名称等)。 |
使用新函数的测试更新现有的自动生成的测试套件(不生成新的测试套件) | 对于为代码生成测试,启用具有最新的测试套件和具有过期的测试套件。 对于当为具有现存测试套件的代码生成测试,启用为没有测试的函数添加测试。 指定其他参数(函数访问级别、输出文件位置/名称等)。 |
将自动生成的测试与当前代码同步-追加缺失的测试,创建缺失的测试套件 | 对于为代码生成测试,启用没有测试套件、具有最新的测试套件和具有过期的测试套件。 对于当为具有现存测试套件的代码生成测试,启用为没有测试的函数添加测试。 指定其他参数(函数访问级别、输出文件位置/名称等)。 |
完全重置现有的自动生成的测试 | 对于为代码生成测试,启用没有测试套件、具有最新的测试套件和具有过期的测试套件。 对于当为具有现存测试套件的代码生成测试,启用替代现有的测试套件。 指定其他参数(函数访问级别、输出文件位置/名称等)。 |
选择符合您目标的布局选项
本部分说明如何配置测试套件输出文件和布局选项(在测试配置的生成> 测试套件选项卡中)以满足各种布局需求。为帮助您了解所讨论的每个选项如何转换为实际项目,我们展示了对以下示例项目的影响:
MyProject headers MyClass.h // contains foo() definition sources MyClass.cpp // contains bar() and goo() definitions
要为每个函数生成一个测试套件文件,将测试保存在单独的目录中
使用${project_loc}/tests/${file_loc_rel}/${file_name}/
TestSuite_${function_name}.${test_ext}
示例布局:
MyProject headers MyClass.h sources MyClass.cpp tests headers MyClass.h TestSuite_foo.cpp // contains tests for foo() sources MyClass.cpp TestSuite_bar.cpp // contains tests for bar() TestSuite_goo.cpp // contains tests for goo()
${project_loc}/tests/${file_loc_rel}/${file_name}/
TestSuite_${function_name}.${test_ext}
示例布局:
MyProject Header Files MyClass.h Source Files MyClass.cpp tests Header Files MyClass.h TestSuite_foo.cpp // contains tests for foo() Source Files MyClass.cpp TestSuite_bar.cpp // contains tests for bar() TestSuite_goo.cpp // contains tests for goo()
要为每个源/头文件生成一个测试套件文件,将测试保存在单独的目录中
使用 ${project_loc}/tests/${file_loc_rel}/
TestSuite_${file_base_name}_${file_ext}.${test_ext}
示例布局:
MyProject headers MyClass.h sources MyClass.cpp tests headers TestSuite_MyClass_h.cpp // contains tests for foo() sources TestSuite_MyClass_cpp.cpp // contains tests for bar() and goo()
要为每个源/头文件生成一个测试套件文件,将测试与被测文件保存在一起
使用 ${project_loc}/${file_loc_rel}/tests/
TestSuite_${file_base_name}_${file_ext}.${test_ext}
示例布局:
MyProject headers MyClass.h tests TestSuite_MyClass_h.cpp // contains tests for foo() sources MyClass.cpp tests TestSuite_MyClass_cpp.cpp // contains tests for bar() and goo()
将自动生成的测试套件文件与原始源文件保存在一起
使用${project_loc}/tests/${file_loc_rel}/${file_name}/
TestSuite_${function_name}.${test_ext}
示例布局:
MyProject module1 sources MyClass.cpp tests TestSuite_MyClass_cpp.cpp headers MyClass.h tests TestSuite_MyClass_h.cpp
将自动生成的测试文件保存在直观的结构中(与我的原始文件分开)
使用 ${project}/tests/${source_loc_rel:/MyProject/module1}/
TestSuite_${source_base_name}_${source_ext}.${test_ext}
示例布局:
MyProject module1 sources MyClass.cpp headers MyClass.h tests TestSuite_MyClass_cpp.cpp headers TestSuite_MyClass_h.cpp
将测试文件放在单个目录中(如果项目没有重复的名称)
使用 ${project}/tests/TestSuite_${source_base_name}_${source_ext}.${test_ext}
示例布局:
MyProject module1 sources MyClass.cpp headers MyClass.h tests TestSuite_MyClass_cpp.cpp TestSuite_MyClass_h.cpp
使用“每个函数一个测试套件”模式
使用 ${project}/tests/${source_base_name}_${source_ext}/
TestSuite_${function_name}_${function_uid}.${test_ext}
示例布局:
MyProject module1 sources MyClass.cpp headers MyClass.h tests MyClass_cpp TestSuite_foo_1234abcd.cpp TestSuite_foo_4321abcd.cpp TestSuite_goo_4321dcba.cpp MyClass_h TestSuite_bar_2143badc.cpp