您可以捕获测试用例中的函数 snapshots 以进行回归测试。测试用例还可以识别可能导致异常的条件,这些异常可能导致系统和应用程序不稳定,安全漏洞(例如拒绝服务攻击),性能和应用程序响应时间差以及频繁停机。

内容包括:

关于自动测试用例生成

C++test 根据【测试配置】的【生成】标签中定义的参数自动生成测试用例。这些测试用例使用类似于适用的 CppUnit 格式的格式。

生成测试以验证新函数

如果要验证新代码的函数,建议您为每个函数自动生成 1-2 个测试以启动。

生成并执行这些测试之后,您可以按照扩展和修改测试套件所述使用用户定义的测试用例扩展测试套件。

生成测试以进行回归测试

如果要创建代码当前行为的 snapshot 以建立回归测试基线(例如,如果您确信代码的行为符合预期),则可以-在测试配置中使用构建的“单元测试>生成回归基础”来运行测试 。运行此测试配置时,C++test 将自动验证所有结果。

然后可以定期(例如,每 24 小时一次)自动运行这些测试,以验证代码修改是否更改或破坏了回归测试中捕获的函数。如果进行了任何更改,这些测试用例将失败,以提醒团队注意该问题。

在后续测试中,如果 C++test 检测到初始测试中捕获的行为发生变化,它将报告任务。不需要验证。

使用默认设置,C++test 为每个源/头文件生成一个测试套件。也可以将其配置为每个函数生成一个测试套件或每个源文件生成一个测试套件 (更多详细信息请参见 自定义生成选项 )。

安全桩函数定义会自动生成以替换“危险”函数,其中包括系统 I/O 例程,例如rmdir(), remove(), rename()等。此外,可以针对缺少的函数和变量定义自动生成桩函数。(有关详细信息,请参见了解和自定义自动桩函数生成 )。可以根据需要添加用户定义的桩函数(有关详细信息,请参见添加和修改桩函数)。

生成测试用例

生成测试用例的一般过程是:

  1. 使用您首选的测试生成设置来识别或创建测试配置。
  2. 运行测试配置
    • 有关从 GUI 测试的详细信息,请参见从图形用户界面测试
      有关从命令行进行测试的详细信息,请参见从命令行界面进行测试

      提示-从测试用例浏览器生成测试

      您可以直接从【测试用例浏览器】(可以通过选择 Parasoft>显示视图>测试用例浏览器打开)来为项目生成测试。只需在【测试用例浏览器】中右键单击项目节点,然后从 测试历史记录使用测试快捷菜单中选择所需的测试生成【测试配置】。


      有关【测试用例浏览器】的详细信息,请参见浏览 C++test 用户界面

  3. 查看生成的测试用例。
  4. (可选)根据需要微调测试生成设置。

自定义生成选项

您可以通过自定义【测试配置】的【生成】标签中的选项来控制许多生成选项。

控制【测试套件】的文件名,位置和布局

可以通过在【测试配置】的生成> 测试套件 选项卡中自定义选项来控制生成的测试套件的文件名,位置和粒度/布局。

要更改默认的测试套件输出设置,请首先从测试套件输出文件和布局框中选择以下三个预定义的输出和布局选项之一:

  • 每个函数创建一个测试套件
  • 每个源/头文件创建一个测试套件
  • 每个源文件创建一个测试套件

如果选择了按函数创建一个测试套件 选项,则为示例 ATM 项目(包括在 examples 目录中)生成的测试套件将如下所示:



如果选择 每个测试的源/标题创建一个测试套件 则示例 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-} 测试函数的唯一标识符(根据函数签名/ mangled name 计算得出的哈希码)。
  • ${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

  • No labels