本主题说明如何使用 C++test 执行自动生成的和/或用户定义的 C++test 或旧版 CppUnit 测试用例。
内容包括:
执行测试用例
C++test 可以运行并报告任何有效 C++test 或旧版 CppUnit 测试用例的覆盖率信息。
运行执行测试用例的一般过程是:
- 如 生成测试用例以进行回归测试和异常查找中所述生成测试用例。
- (可选)如果要自动生成缺少函数和变量定义的桩函数,请运行内置的【生成桩函数】测试配置或基于该测试配置的自定义测试配置。不建议将其用于定期计划的命令行测试。
- 请参见添加和修改桩函数 以获取有关如何生成桩函数的信息,以及有关自定义 C++test 桩函数生成的说明。
- (可选)如果要在执行测试之前检查自动生成的桩函数和测试是否可编译,请通过运行内置的“构建测试可执行文件”测试配置或基于该配置的自定义测试配置来执行尝试构建。不建议将其用于定期计划的命令行测试。
- 有关试用版本的信息,请参见了解试用版本。
使用内置的“运行单元测试”测试配置或基于该测试配置的自定义测试配置来启动测试。
提示-从测试用例浏览器执行测试
您可以直接从【测试用例浏览器】(可以通过选择Parasoft> 显示视图> 测试用例浏览器打开)执行测试。只需为要测试的资源(项目、文件夹、测试套件或测试用例)选择【测试用例浏览器】节点,右键单击所选内容,然后从测试历史记录或使用测试快捷菜单中选择所需的测试执行测试配置。
所执行的测试将以颜色标记以指示其结果状态。测试失败将以红色标记。测试失败将以红色标记。
- 通过的测试将以绿色标记。
- 有关详细信息,请参见查看测试执行结果。
- (可选)根据需要微调测试执行设置。
- 有关详细信息,请参见执行选项卡设置-定义测试的执行方式。
使用 cpptestcli 配置批处理模式回归测试执行
定期计划的批处理模式回归测试应仅执行内置的“运行单元测试”测试配置,或基于该测试配置的自定义测试配置。
示例:
cpptestcli -solution “C:\temp\*.sln” –config team://ExecuteTests -publish
了解试用版
C++test 可以执行测试可执行文件的试用版,其中包括测试用例和用户桩函数,而无需执行测试。此功能可用于检查是否可以编译自动生成的桩函数和测试。即使已测试项目中还没有任何测试用例,您也可以执行试用版本。
推荐的执行试用版本的方法是运行内置的“构建测试可执行文件”测试配置。
了解和自定义自动桩函数生成
当您运行内置的“生成桩函数”测试配置(或基于它的自定义测试配置)时,C++test 将自动为缺少的功能和变量定义生成可自定义的桩函数(或桩函数模板)。如Executing Test Cases中所述,我们建议您在执行测试用例执行之前先生成测试用例,然后运行【生成桩函数测试配置】,然后运行【构建测试可执行的测试配置】。
当使用【测试配置】集运行测试以生成桩函数时,C++test 将在指定位置创建一个桩函数文件。如果 C++test 无法自动生成完整的桩函数定义,它将创建一个您可以自定义的桩函数模板(通过输入适当的 return 语句,添加 include 指令等)。完整桩函数之前,桩函数模板将保存在桩函数文件中。
仅当没有其他定义(用户桩函数或原始桩函数)可用时,才使用自动生成的桩函数。
可以按照以下添加和修改桩函数说明自定义自动生成的桩函数和桩函数模板。如果自定义桩函数或桩函数模板,则需要重新运行分析以提示 C++test 使用它们。
要创建自定义桩函数生成测试配置:
- 通过选择 Parasoft> 测试配置打开【测试配置】面板。
- 右键单击内置> 单元测试> 生成桩函数 测试配置, 然后选择 复制 新的【生成桩函数测试配置】将添加到【用户定义】类别中。
- 选择用户定义>生成桩函数。
- 打开执行>符号 选项卡。
- (可选)如果不希望将生成的桩函数保存在默认位置(${project_loc}/stubs/autogenerated),请在 自动生成的桩函数输出位置字段中输入您的首选位置。
- 点击 应用,然后 关闭。
定义自定义测试单元
默认情况下,C++test 通过以下方式计算已测试文件(要测试的项目文件)和测试套件的列表:
- 选中所有的测试套件并且符合执行中指定的标准。将执行执行> 常规 选项卡的 测试套件文件搜索模式选项。如果测试套件文件使用 CPPTEST_CONTEXT 和/或 CPPTEST_INCLUDED_TO 宏,则相应的源文件和头文件将成为测试文件。
- 所选的所有项目源文件和头文件都将成为测试文件。另外,C++test 将在 CPPTEST_CONTEXT 设置为这些测试文件之一的情况下,在测试套件文件搜索模式位置中搜索测试套件文件;如果找到任何这样的测试套件文件,它们也将被执行。
如果您希望 C++test 使用任何其他项目源文件来解析测试文件中的原始定义,则可以在【测试配置】的使用其他项目文件中的符号选项中指定此选项(在执行> 符号 选项卡中可用)。 此外,您可以使用使用文件中 的多余符号选项来指定使用哪个桩函数,并使用为每个经过测试的上下文创建单独的测试可执行文件选项来指定您是否想要 C++test 为每个文件创建单独的测试可执行文件上下文(单个源/头文件或项目)。
有关如何指定要使用的其他项目文件和桩函数以及如何准备测试可执行文件的更多详细信息,请参见符号选项卡 。
单独测试单个文件
在某些情况下,测试策略要求将单元测试应用于其他单独相关组件。C++test 允许您通过使用桩函数执行此类测试。
要单独测试单个文件(在不同的“测试台”上,包括自定义和自动桩函数):
- 选择您想要测试的文件。
- 使用内置的“单元测试>文件范围>运行单元测试(文件范围)”测试配置运行测试。这通常会导致错误状态(详细信息显示在控制台视图中),因为 C++test 无法找到许多功能的定义。
- 通过以下方式提供缺少的函数或变量定义:
- 手动创建用户桩函数 (请参见 添加和修改桩函数)。
- 使用 C++test 使用内置的“单元测试>文件范围>生成桩函数(文件范围)”测试配置自动创建桩函数(请参见了解和自定义自动桩函数生成),然后根据需要修改其源(请参见添加和修改桩函数)。
- 运行内置的“单元测试>文件范围>构建可执行文件测试(文件范围)”测试配置以执行测试可执行文件的试用版。建议这样做以确保正确解析所有必要的符号,并且自定义桩函数代码不会引起编译错误。
- 运行内置的“单元测试>文件范围>运行单元测试(文件范围)”以执行测试。这次,运行应该成功完成。
忽略库和目标文件
在单独测试单个文件时,您可能希望使用对象和库文件过滤器来防止测试指定的库和对象。在【测试配置】的 忽略对象/库文件 字段中(在【执行】>【符号】选项卡中),您可以指定以分号分隔的命令行选项模式列表。仅忽略链接程序命令行中的选项。不过滤标准编译器库和实用程序随附的库进行。
单独测试功能
您可以通过多种方式隔离测试功能。本节介绍了经常用于测试安全性至关重要的源代码的方法。这种测试的基本要求是,测试模块不应修改被测试的函数源代码。这是为了确保测试结果能够反映实际生产环境中的函数执行情况。这是为了确保测试结果能够反映实际生产环境中的函数执行情况。
为确保未检测到已测试的函数,应在测试配置中验证检测设置:
- 打开测试配置,然后选择执行> 常规选项卡
- 启用单元测试执行模式,然后在【检测模式】字段的【执行详细信息】部分中单击编辑。
在【经过测试的来源】类别中,仅应启用以下功能:
- 访问私有成员
- 函数桩函数(具有桩函数检测模式的适当配置)
- 重命名 main() 函数
下面几节将提供关于配置桩函数模式、每个测试套件配置管理桩函数以及单独测试功能的测试可执行配置的其他详细信息。
配置桩函数检测
您必须启用桩函数检测并选择桩函数模式才能将函数桩函数用于测试的代码。启用桩函数检测激活桩函数引擎。选择桩函数模式定义了桩函数调用的应用方式。有两种可用的桩函数模式:
- 检测函数调用
- 检测桩函数函数(未修改函数调用)
以下示例说明了这些模式在桩函数函数或方法的调用方式上有何不同。
/* Original definition of function to be stubbed */ int Func(void) { // Function body } /* tested function definition */ int testedFunction(void) { int val = Func (); /* tested function body */ return val; }
下表显示了两种桩函数模式的示例源代码的检测版本:
检测函数调用 | 检测桩函数函数 |
---|---|
/* Stub function definition */ int CppTest_Stub_StubbedFunc(void) { // Stub body return 0 } /* Original definition of stubbed function */ int Func(void) { // Function body } /* tested function definition */ int testedFunction(void) { int val = CppTest_Stub_StubbedFunc(); /* tested function body */ return val; } |
/* Stub function definition */ int CppTest_Stub_StubbedFunc(void) { // Stub body return 0 } /* Original definition of stubbed function */ int Func(void) { return CppTest_Stub_StubbedFunc(); // Function body removed } /* tested function definition */ int testedFunction(void) { int val = Func (); /* tested function body */ return val; } |
在测试安全关键代码时,通常首选【检测桩函数函数】模式,因为它不会更改测试函数的主体。设置桩函数模式:
- 打开测试配置,然后选择执行> 常规选项卡
- 单击 检测方式 下拉菜单旁边的编辑,然后启用【桩函数模式】
以这种方式配置检测设置会带来一些限制:
- 如果一个已测试的函数需要另一个函数的桩函数,则该桩函数的函数在同一测试会话中变得不可测试(如果在已测试的源代码中定义)
- 测试套件应将具有相同桩函数配置的功能或方法的测试用例分组
- 单个测试二进制文件不能包含桩函数配置冲突的测试套件。当一个测试套件假设在另一个测试套件中有一个被测试函数的桩函数时,这是正确的
以下各节描述如何使用这些限制。
配置测试可执行构建
- 打开测试配置,然后选择执行> 常规选项卡
- 在【单元测试设置】部分中,启用将所选测试套件划分为测试可执行文件的规则
以下设置可用:- 创建测试可执行文件以供选择: 所有非文件范围测试配置的默认值。
- 为每个被测试的上下文创建单独的可执行测试:文件作用域测试配置的默认设置。
- 为每个测试套件创建单独的可执行测试文件:启用此选项可以为您选择的每个测试套件创建单独的测试二进制文件。如果您的测试套件对测试用例进行分组,这可能是必需的,因为测试用例需要特定的不能混合的桩函数选择。
- 点击 应用。
管理特定于测试套件的桩函数
单元测试策略有时要求组织为每个测试套件使用不同的桩函数集。这可以通过针对每个测试套件的专用测试配置来完成,或者最好通过直接在测试套件中指定所需的桩函数文件来实现。
要为测试套件指定桩函数文件:
- 打开【测试用例浏览器】视图,然后双击一个测试套件
- 将所需的桩函数文件拖到【其他桩函数文件】字段
中,也可以通过单击【其他桩函数文件】字段右侧的文件浏览器按钮来浏览桩函数文件。
通过直接修改测试套件文件,也可以在不使用 GUI 的情况下,将特定于测试套件的桩函数文件添加到测试套件中。要将桩函数文件添加到测试套件,请在文本/代码编辑器中打开测试套件,并为每个桩函数文件插入以下宏。您还可以使用根目录路径来包含给定位置的所有桩函数。
CPPTEST_ADDITIONAL_STUB_FILES(<stub file path or root directory>);
可以在任何有效的 C/C++ 宏位置中指定该宏,但是必须将其添加到 cpptest.h 头文件之后。在测试套件级别指定的所有桩函数文件都将附加到受测试配置设置影响的桩函数文件中。
执行个别测试用例
要执行一组用户定义的测试用例:
- 通过以下方式之一选择要执行的测试函数:
- 从【测试用例浏览器】选择测试用例。
- 选择包含【测试用例】的【测试用例编辑器】,并确保【编辑器】窗口处于【焦点】位置(有关使用【测试用例编辑器】的详细信息,请参见生成测试用例)
- 在编辑器中为测试套件文件选择测试用例方法。
选择相关的 【类】视图节点。(您可以从不同的测试套件中选择并执行测试用例。)
- 运行设置为执行测试用例的测试配置(例如,内置>单元测试>运行单元测试)。
- 例如,右键单击所选内容,然后使用 Parasoft 快捷菜单运行首选的测试配置。
通过未解析的符号解决链接器错误
如果被测代码引用了其他文件中的符号,则 C++test 可能报告链接器错误,但 C++test 找不到这些符号
则去查看哪些符号未解析:
- 在测试配置的 执行> 符号 标签中启用对潜在的链接器问题进行早期检查 选项 (有关详细信息,请参见 执行选项卡设置-定义测试的执行方式 )。
- 重新运行测试。
C++test 将在编译和链接阶段之前报告未解析的符号(未定义的函数)。查看未解析的符号,您可以执行以下操作之一:
- 打开【桩函数】视图,然后查找定义为 'N/A' 的符号。
- 打开【控制台】视图,然后查找“无法为函数[函数]配置桩函数”报文。
有几种解析符号的方法:
- 如果您尚未这样做,则自动为缺少的符号生成桩函数。有关详细信息,请参见 了解和自定义自动生成桩函数。
- 如果符号在项目中定义,请在【测试配置】的执行> 符号 选项卡的使用其他项目文件中的符号 选项中启用并输入一个星号,然后重新运行测试。有关详细信息,请参见 执行选项卡设置-定义测试的执行方式。
如果符号在外部库中,则将该库添加到链接器命令行中,然后重新运行测试。
- 否则,请为缺少的函数提供用户定义的桩函数,然后重新运行测试。有关详细信息,请参见添加和修改桩函数。
在测试执行期间使用调试器
请参见在测试执行期间使用调试器。