章节目录:
生成测试套件
测试套件是测试用例的容器,必须先创建测试用例才能添加:
- 选择 Parasoft> 显示视图> 测试用例浏览器,打开测试用例浏览器视图。
- 在测试用例浏览器树结构中选择一个项目。
- 选择 Parasoft> 测试执行> 内建> 单元测试> 生成测试套件,为项目生成空测试套件。
您还可以通过右键点击测试用例浏览器中的项目或文件夹并选择新增> 测试套件来手动添加空的测试套件。
测试套件数据存储
所有测试套件数据(包括测试用例)都存储在位于 C++test 项目目录下的测试套件文件中。该文件和其他 C++test 生成的测试工件应在软件配置管理系统中进行管理。
编辑测试套件
- 双击测试用例浏览器树结构中的测试套件,打开测试套件编辑器。
- 点击全局编辑器中的一个字段,为测试套件配置全局变量(更多详细信息,请参阅测试用例步骤参考)。这些变量之后将在测试用例中使用。
在额外的测试套件代码编辑器中,配置可以添加到测试套件代码中的预定义可插入代码段。
默认情况下,可配置以下代码段:
- Additional Includes - 额外的包含文件
- TestSuiteSetUp - 测试套件 setUp() 函数的定义(主体)
- TestSuiteTearDown - 测试套件 tearDown() 函数的定义(主体)
- TestCaseSetUp - 测试用例 setUp() 函数的定义(主体)
- TestCaseTearDown - 测试用例 tearDown() 函数的定义(主体)您可以通过以下开始/结束标记向测试套件添加其他代码段:
/* CPPTEST_TEST_SUITE_CODE_BEGIN CodeSectionIdentifier */
/* CPPTEST_TEST_SUITE_CODE_END CodeSectionIdentifier */
例如,如果将以下标记添加到测试套件中:
/* CPPTEST_TEST_SUITE_CODE_BEGIN NewIncludes2 */ //This is a user-configured code section. /* CPPTEST_TEST_SUITE_CODE_END NewIncludes2 */
新的代码段将出现在下拉菜单中:
- 选择文件> 保存,保存更改后的测试套件
之后就可以执行更新的测试套件了。
创建测试用例
- 打开测试用例浏览器视图,右键点击测试套件
- 选择新建> 使用测试用例编辑器…
- 出现提示时,输入测试用例名称并点击确认;将打开一个空的测试用例编辑器
- 从创建下面的测试用例下拉列表选择一个函数。
- 点击其中一种(+)按钮,打开所选函数的默认测试用例:
创建新的测试用例 - 为所选函数创建新的测试用例
创建新的参数化测试用例 - 为所选函数创建新的参数化测试用例;您可以使用从测试用例内建数据源表或从外部数据源(请参阅使用数据源参数化测试用例)中获取的值来参数化测试用例。 - 查看和修改输入值(变量)和期望的输出值(断言);有关默认测试用例结构的更多信息,请参阅默认测试用例
- 保存测试用例,将其添加到测试套件中
新的测试用例将出现在测试用例浏览器树结构中,并且可以执行。有关运行测试用例的说明,请参阅执行测试用例。
默认测试用例
默认测试用例表示特定函数的标准测试用例。它包含以下步骤,当您运行测试用例时,这些步骤将按下面的顺序执行:
- 变量:将设置所有必需的输入值(前置条件)。输入值包括全局变量、局部变量(被测函数的参数)和测试对象(测试成员函数时)。默认情况下,特定类型的标准值(0、null、默认构造函数等)将用作输入值,由测试用例作者审查/修改。
- 调用:将使用变量步骤中设置的前置条件值调用被测试函数。
- 断言:将实际输出值与期望的值(后置条件)进行比较。输出值包括函数返回值、全局变量和成员变量(测试成员函数时)。特定类型的标准值(0、null 等)将用作期望值,由测试用例作者审查/修改。
您还可以自定义测试用例的结构。请参阅步骤的使用。
使用测试用例编辑器编辑测试用例
只有使用测试用例编辑器创建的测试用例(请参阅创建测试用例)可以通过编辑器编辑。自动生成的测试用例(请参阅生成测试用例)、在代码编辑器中创建的测试用例或使用测试用例向导创建的测试用例(请参阅使用图形化测试用例向导添加测试套件和测试用例)不可以用测试用例编辑器编辑。
- 打开测试用例浏览器视图,双击测试用例。
- 修改测试用例结构或具体参数(请参阅步骤的使用)。
- 选择文件> 保存,保存对测试用例的更改。
恢复测试用例代码
在测试用例编辑器中创建的测试用例不应该在编辑器外部修改。如果一个测试用例已被手动修改,您可以恢复在测试用例编辑器中生成的代码。
- 打开测试用例浏览器视图,右键点击测试用例。
- 选择更新测试用例代码选项。
此选项也可在测试套件级和项目级使用。
步骤的使用
在测试用例编辑器中,每个测试用例都由一系列步骤表示。在运行时,这些步骤按照编辑器中定义的从上到下的顺序执行。编辑器中提供了实现特定功能的各种步骤:
- 断言:验证后置条件值
- 调用:调用被测函数
- 代码:插入自定义代码段
- 消息:指定测试执行期间要打印的消息
- 参数:启用测试用例参数化
- 报告:报告测试用例值
- 桩配置:配置桩函数
- 预期的桩:配置调用顺序或期望的调用次数
- 桩函数(已弃用):配置桩函数
- 变量:设置输入值
有关可用步骤的更多详细信息,请参阅测试用例步骤参考。
默认测试用例仅使用了可用步骤中的一部分(请参阅默认测试用例)。如有需要,通过配置按特定顺序执行的步骤来定义测试用例流程,您可以自定义一个测试用例来实现特定的场景。例如,可以在执行一系列函数调用之前执行额外的桩函数配置。此外,可以报告特定的输入/输出值。
添加新步骤
- 在测试用例编辑器中,从新增下拉菜单选择一个步骤
- 点击(+)按钮;新的步骤将添加到测试用例中
- 点击并拖动步骤可重新排序
删除已有步骤
在测试用例编辑器中,点击步骤旁的(-)按钮。该步骤将从测试用例中删除。
步骤重新排序
在测试用例编辑器中,点击一个步骤的控制柄(四向箭头),按所需顺序拖放步骤。
复制步骤
在测试用例编辑器中,点击一个步骤的控制柄(四向箭头),按住 CTRL 键的同时拖放步骤。
从另一个测试用例中复制步骤
- 打开两个测试用例编辑器窗口,并将它们并排放置。
- 在点击一个步骤的控制柄(四向箭头),然后将步骤从一个编辑器拖到另一个编辑器中。
配置桩函数行为
您可能需要配置桩函数行为来实现某些测试场景并确保运行时环境一致性。使用动态桩函数配置功能,可以将桩函数配置直接放入测试用例定义中,这样每个测试用例都可以拥有唯一的桩函数配置。您可以使用桩函数回调框架(详细信息请参阅使用桩函数回调)或测试用例编辑器的界面手动修改测试用例源代码。测试用例编辑器提供了桩函数配置的专用步骤——“桩配置”和“预期的桩”——用于设置桩函数的期望返回值、在桩函数和原始代码之间切换等等。
测试用例编辑器中定义的步骤根据从上到下的顺序执行。因此,必须确保按照所需顺序配置步骤:
- 在“桩配置”步骤中指定的配置仅影响在随后的测试用例步骤中配置执行的桩函数调用。由“桩配置”步骤之前的步骤产生的桩函数调用不会执行配置的操作。
- 如果为同一个桩函数添加了多个“桩配置”步骤,则桩函数调用将使用紧挨着该桩函数之前的“桩配置”步骤中指定的配置。
- “预期的桩”步骤应该放在所有定义了预期桩的测试用例步骤之前。这样可以确保所有调用都被计算在内。
- 如果将多个“预期的桩”步骤添加到测试用例中,将会应用每个步骤中的配置。
关于桩函数行为配置的其他详细信息
- 桩函数必须使用 C++test 10.3 或更高版本自动生成或手动创建,以配置桩函数行为。
- 可用的桩函数在桩函数视图中显示(Parasoft> 显示视图> 桩函数)。
- 未在测试用例中配置的桩函数(包含“桩配置”和“预期的桩”步骤),其行为遵循桩函数定义(自动生成的桩函数将返回默认值:0、false、null)。
- “桩配置”步骤必须放在桩配置打算使用的“调用”步骤之前。
配置桩配置步骤
通过“桩配置”步骤可以使用桩函数回调框架配置桩函数行为。
桩函数回调要求在创建桩函数前,在桩函数视图中(请参阅在桩函数视图中配置桩函数选项)或直接在您的测试配置中(请参阅执行选项卡设置 - 定义测试的执行方式)选中启用桩函数回调选项。
- 在函数字段输入桩函数名称或按下 Ctrl + 空格显示可用桩函数列表并选择要配置的桩函数。C++test 会在函数字段旁自动显示桩函数界面。
- 启用一种编辑模式来定义桩函数行为:
表格 - (默认)打开指定参数的配置表
代码 - 打开编写桩函数行为脚本的代码编辑器
如果在两种编辑模式中都定义了桩函数行为,在测试用例执行期间将使用当前选择的模式。
在表格中配置桩函数行为
在表格模式下,您可以定义将在测试用例执行期间执行的操作。这些操作在单独的表行中配置,按从上到下的顺序执行。
从下拉菜单中选择操作类型完成行动列设置。
然后使用所需参数完成 P1-P4 列设置。您可以参考选择操作类型时自动显示的建议。
行动类型
可选择以下行动类型:
- 设置值。选择 SET VALUE 类型,在 P1 中指定变量名并在 P2 中指定值。您可以为桩函数参数、返回值
(*__return)
、全局变量和桩函数所属类的成员定义此类型。 - 函数调用。选择 CALL FUNCTION 类型,在 P1 中指定变量名,在 P2 中指定函数名,在 P3 中指定函数参数。
- 断言。指定所选断言类型所需的断言参数(针对每种断言类型显示建议)。可以从下拉菜单中选择的断言类型与“断言”步骤中可配置的断言相同(请参阅 C++test 用户指南中的可用断言列表)。 所有支持的断言类型都可以在“桩配置代码”模式下手动添加;请参阅在代码中配置桩函数行为。您可以定义此类型来检查桩函数参数、父对象
(__this)
、全局变量和桩函数所属类的成员的值。
特定的调用参数
通过定义特定的调用参数,可以为同一桩函数的各个调用指定桩函数行为。特定的调用参数必须以逗号分隔的大括号参数列表形式提供:
- 参数在序列中的位置对应执行期间的桩函数调用次数。在上面的示例中,2、37 和 14 将分别用于第一次、第二次和第三次桩函数调用。
- 如果一个操作配置了特定的调用参数,除非最后一个参数是省略号,否则它将只针对相应次数的桩函数调用执行(参见下面的示例)。在上面的示例中,即使桩函数的总调用次数更多,该行动也只会在第一次、第二次和第三次桩调用时执行。
您可以通过添加省略号(…)作为序列中的最后一个参数,将操作配置为针对任意次数的桩调用执行。因此,序列中显式指定的最后一个值将用于所有后续桩函数调用。
在下面的示例中,2 和 37 将分别用于第一次和第二此桩函数调用,而 14 将用于第三次调用以及之后的所有桩函数调用:
如果桩函数操作使用多组特定的调用参数进行参数化,则每组参数必须具有相同数量的值。在下面的示例中,两个特定的调用集都包含两个值:
参数值可以是适用于给定上下文的任何值,例如:
- {3, 5, 7} – 3 个整数型参数的序列
- {56.3, 5.22, 7.99, 0.77} – 4 个浮点型参数的序列
- {foo(1), goo(2), boo(3,45)} – 3 个函数调用参数的序列
在代码中配置桩函数行为
在代码模式下,您可以提供配置桩函数行为的代码段。
可以使用 C++test API 的所有函数(包括断言)来配置代码中的桩函数行为。
通过使用 stubCallInfo->callNo
和提供特定的调用值,可以为各个调用指定桩函数行为。下面的示例展示了按以下方式配置的桩函数:
- 第一个桩函数调用验证 a 和 b 参数是否等于 0,桩函数返回值 123
- 所有其他桩函数调用验证 a 和 b 参数是否等于 1,桩函数返回值 10
配置预期的桩步骤
使用“预期的桩”步骤,您可以为桩函数调用配置以下期望设置:
- 期望确切的函数调用次数
- 期望调用次数多于指定值
- 期望调用次数少于指定值
- 期望调用次数在指定范围内
- 期望桩函数调用顺序
配置预期的桩步骤:
- 从下拉菜单中选择操作类型完成行动列设置。
- 使用函数名完成函数列设置。
- 使用参数完成参数列设置。您可以参考选择操作类型时自动显示的建议。
Expect Call Sequence 操作
Expect Call Sequence 操作可帮助您确保指定桩函数的顺序。
- 它仅监控函数列中提供的桩函数,忽略任何其他函数。例如,以下示例中的 Expect Call Sequence 将匹配运行时序列 [foo1, foo4, foo5, foo2, foo7, foo3],忽略 foo4、foo5 和 foo7 函数。
- 指定序列可以出现多次。例如,运行时序列 [foo1, foo2, foo2, foo1, foo2, foo3] 不会报告错误。
- 如果指定序列至少有一次出现不完整,将报告错误。例如,以下序列将报告错误,因为该序列的第二次出现不完整:[foo1, foo2, foo2, foo1, foo2]。
支持的桩函数行为配置操作
修改桩函数参数值、返回值、全局变量、父类成员
- 为指定函数添加桩配置步骤(或选择已有的步骤)。
- 在行动列,选择下拉列表中的 SET VALUE。
- 在 P1 列填写将被赋值的变量名。使用 *__return 修改返回值。
- 在 P2 列指定值。
检查桩函数参数、父对象(__this)
、全局变量、父类成员的值
- 为指定函数添加桩配置步骤(或选择已有的步骤)。
- 从行动列,选择下拉列表中的 CPPTEST_ASSERT。
- 在 P1 列指定期望值。
- 在 P2 列指定实际值(变量名)。
- 根据需要,在 P3 或 P4 列指定额外的值。
调用原始函数(对于具有可用原始定义的函数)
- 为指定函数添加桩配置步骤(或选择已有的步骤)。
- 在行动列,选择下拉列表中的 CALL FUNCTION。
- 在 P1 列填写将被赋值的 *__return 变量。
- 使用函数名完成 P2 列设置。
- 使用原始函数参数完成 P3 列设置。
配置期望的调用次数
- 添加预期的桩步骤,
- 从行动下拉列表中选择 EXPECT NUMBER OF CALLS
- 在函数列指定一个函数名 - 确保桩函数存在
- 在参数列指定期望的调用次数
配置期望的调用顺序
- 添加预期的桩步骤,
- 从行动下拉列表中选择 EXPECT CALL SEQUENCE
- 在函数列指定一串函数名 - 确保桩函数存在
定义桩函数调用时的自定义操作
- 为特定函数添加桩配置步骤(或选择已有的步骤)。
- 启用代码编辑模式。
- 在代码编辑器中,提供修改桩函数行为的代码。
添加测试用例参数化
参数化允许使用一组不同的前置和后置条件值执行相同的测试。您可以在内建表格或外部数据源(如 CSV 文件)中定义一组任意的变量。每个变量都有自己的列,具有用户分配的唯一名称。 将针对每一行的值独立执行参数化测试用例。
您可以通过以下方式之一添加测试用例参数化:
- 通过使用创建新的参数化测试用例选项(请参阅使用数据源参数化测试用例)来创建新的测试用例;这会将“参数”步骤添加到测试用例中,并使用默认值自动更新测试用例,
- 通过手动将“参数”步骤添加到已存在的测试用例中。
您在“参数”步骤中定义的变量可以在其他步骤中使用,例如,作为前置条件变量的初始化器(“变量”步骤)、作为期望的后置条件值(“断言”步骤)、作为桩配置参数(“桩函数”步骤)。其他步骤可以通过使用参数 API 来访问变量。可选择以下数据源宏:
CPPTEST_DS_GET_BOOL("<具有布尔值的列名>")
CPPTEST_DS_GET_CSTR("<具有字符串值的列名>")
CPPTEST_DS_GET_FLOAT("<具有浮点值的列名>")
CPPTEST_DS_GET_INTEGER("<具有整数值的列名>")
CPPTEST_DS_GET_CHAR("<具有字符值的列名>")
CPPTEST_DS_GET_UINTEGER("<具有无符号整数值的列名>")
CPPTEST_DS_GET_MEM_BUFFER("<具有缓冲区数据的列名>", "<数据大小>")
CPPTEST_DS_GET_ENUM("<枚举类型名称>", "<具有枚举值的列名>")
在目标中按 CTRL+空格访问参数 API 步骤。
“参数”步骤仅支持简单类型值。
示例
下面的示例展示了 processValue(int)
的一个参数化测试用例。在内建表中指定的值通过数据源宏和列名应用到“变量”、“桩配置”和“断言”步骤中。
配置参数步骤
以下选项可用于配置“参数”步骤:
- 内建 (表格) 单选按钮 - 将用于指定参数化值的表格添加到测试用例中
- 数据源单选按钮 - 定义用于指定参数化值的外部数据源
- 创建新的数据源图标 - 创建新的外部数据源
- 编辑数据源图标 - 打开数据源
- 打开数据源文件图标 - 打开已有的数据源文件
- 更新列名图标 - 显示列名
- 参数化测试用例...图标 - 打开可以进行以下设置的对话框:
- 自定义数据源的列命名模式
- 使用与模式匹配的列中的值自动更新测试用例(请参阅参数化测试用例)
参数化测试用例
使用已添加的数据源中指定的值参数化测试用例的步骤:
- 点击参数化测试用例...图标打开测试用例编辑器对话框。
- 指定列命名模式。该模式必须包括以下内容:
- {CONTEXT} - 将使用从列中获取值的上下文。可选择下列上下文:
V 表示“变量”步骤
A 表示“断言”步骤
SV 表示“桩配置”步骤中的 SET VALUE 操作类型
SA 表示“桩配置”步骤中的断言
- {TYPE} - 将用于获取值的数据源宏。可选择以下数据类型:
I 表示CPPTEST_DS_GET_INTEGER
F 表示CPPTEST_DS_GET_FLOAT
S 表示CPPTEST_DS_GET_CSTR
C 表示CPPTEST_DS_GET_CHAR
B 表示CPPTEST_DS_GET_BOOL
U 表示CPPTEST_DS_GET_UINTEGER
M(<size>) 表示CPPTEST_DS_GET_MEM_BUFFER
E(<type>) 表示CPPTEST_DS_GET_ENUM
- {VARIABLE} - 变量的名称
默认为
{CONTEXT}#{TYPE}#{VARIABLE
}(请参阅示例)。
- 点击确定。测试用例将使用数据源列中指定的与模式匹配的值进行更新。
报告值和消息
使用“报告”步骤报告测试用例中的值。该步骤提供一组报告函数,这些函数会打印特定类型的值(例如,CPPTEST_REPORT_INTEGER()、CPPTEST_REPORT_FLOAT()
等)。这些函数可在类型下拉列表中选择。选择报告函数后,所需参数将出现在 P1-P3 列中。
或者,您可以使用“消息”步骤在运行时打印一条简单的文本消息。此步骤可用于输出可追溯性标识符或用于调试目的。
“报告”和“消息”步骤的输出将被打印到控制台,也可以包含在单元测试报告中。
插入自定义代码段
您可以使用“代码”步骤向测试用例中添加复杂的逻辑,该步骤可实现自定义 C 或 C++ 代码段。代码段可以放在测试用例定义中任何位置,但由于从上到下的执行顺序,步骤的位置非常重要。代码段可以使用在前面的“变量”步骤中定义的变量。“代码”步骤引入的变量可被后续步骤复用。
测试用例编辑器不会验证输入到“代码”步骤中的自定义代码的正确性。在测试用例执行期间会报告语法错误。
测试用例步骤参考
测试用例编辑器提供了以下步骤,可在定义测试用例时用作基本构建模块。
断言
“断言”将实际值与期望值进行比较验证,通常用于检查输出值(后置条件)。
类型
可以从下拉列表中选择可用的断言类型。有关支持的断言类型的完整列表,请参阅测试用例验证宏。所有支持的断言类型都可以在代码字段手动添加;请参阅代码。
P1, P2, P3, P4(其他参数)
具体可用的参数取决于断言类型。按 CTRL+空格键获取已知变量列表中选择的参数字段。
对应的 C/C++ 代码
<Type>([<P1>, <P2>, <P3>, <P4>]);
调用
“调用”步骤允许调用一个被测函数。可以在单个测试用例中使用多个“调用”步骤来定义调用顺序。测试用例编辑器不会验证输入的调用参数的正确性。
返回
返回字段是用于存储返回值的变量。如果不需要返回值则留空。按 CTRL+空格获取已知类型列表。
名称
名称字段为函数名。对于成员函数,名称字段还应包含一个对象变量(object.mFunction 或 object->mFunction
)。按 CTRL+空格获取已知变量列表。
参数
您可以在此字段中输入以逗号分隔的参数列表。可接受任何有效的 C/C++ 参数(常量、变量、表达式等)。按 CTRL+空格获取已知变量列表。
对应的 C/C++
<Return> =] <Name>(<Parameters>);
代码
代码字段允许输入运行测试用例时要执行的自定义 C/C++ 代码段。代码可以使用前面步骤中已经定义的符号。后续步骤可以使用在“代码”步骤引入的符号。测试用例编辑器不会验证输入代码的语法。
对应的 C/C++ 代码
<Code>
全局
全局步骤包括测试套件专用的变量定义、初始化配置和赋值。全局变量可以在以后的测试用例中使用。全局步骤仅在测试套件编辑器中可用。
类型
在类型字段中输入全局变量的类型(必填)。按 CTRL+空格获取已知类型列表。
名称
在名称字段中输入全局变量的名称(必填)。如果定义了多个同名变量,系统将显示警告。
值
在值字段中输入要赋值给变量的初始化值。可接受任何有效的 C/C++ 初始化器(常量、表达式等)。按 CTRL+空格获取已知变量列表。
对应的 C/C++ 代码
<Type> <Name> [= <Value>];
消息
在“消息”步骤中输入一个简单的文本消息,该消息会在测试执行期间通过 CPPTEST_REPORT() 打印。“消息”步骤对于可追溯性或调试目的而言尤其有用。文本内容将按原样打印(不允许使用变量或表达式)并转义所有引号。
对应的 C/C++ 代码
CPPTEST_REPORT(“<Message>”);
参数
使用“参数”步骤设置测试参数。将为步骤中的每行独立执行测试用例。在单个测试用例中只允许设置一个“参数”步骤。可以使用参数 API 访问“参数”步骤中的值。“参数”步骤包含两种模式:内建 (表格) 模式和数据源模式。
内建 (表格) 模式
启用内建 (表格) 选项,直接在参数编辑器中输入值:
在这种模式下,每一列(A、B、C 等)代表一个变量,每一行代表一个将在测试用例执行期间使用的数据向量。
数据源模式
启用数据源选项并输入已有数据源的名称。按 Ctrl+空格键将显示可用数据源的名称:
输入数据源名称后,可执行以下操作:
- 更新列名:加载指定数据源的列名。加载的列名将在“参数”步骤中列出。
- 创建新的数据源:如果输入的名称与已有数据源不匹配,将使用该名称创建新的数据源
- 编辑数据源:打开指定数据源的数据源编辑器
- 打开数据源文件:打开指定 CSV 或 Excel 数据源的数据源文件
此模式使用已定义的现有数据源,包括行和列的名称。您可以点击更新列名按钮来显示已有数据源的列名。点击更新列名按钮时只能显示列名;在此模式下,不会显示来自已有数据源的行。
对应的 C/C++ 代码
N/A
报告
您可以在“报告”步骤中设置将在测试执行期间与运行时值一起打印的消息。此步骤可用于打印输入/输出值或用于调试目的。
类型
从类型下拉列表的类型选项中选择一种报告类型。有关支持的报告类型的完整列表,请参阅测试用例报告宏。
P1, P2, P3(其他参数)
具体可用的参数取决于报告类型。按 CTRL+空格获取已知变量列表。
对应的 C/C++ 代码
<Type>([<P1>, <P2>, <P3>]);
桩配置
桩配置步骤允许配置当前测试用例的桩函数行为。此步骤应放在配置针对的调用步骤之前。另请参阅配置桩函数行为。
行动
行动字段指定配置桩函数行为的操作类型。可用操作显示在下拉列表中。支持以下操作:
- SET VALUE:修改值;可以为桩函数参数、返回值、全局变量和桩函数所属类的成员定义此操作。
- CALL FUNCTION:指定调用的函数。
- CPPTEST_ASSERT:(断言):将实际输出值与期望值进行比较验证;可以从下拉菜单中选择特定的断言类型(可用的断言与断言步骤中可配置的断言相同;有关可用断言的列表,请参阅测试用例验证宏)。
P1, P2, P3(其他参数)
P1、P2、P3 和 P4 字段允许您为选定的操作类型指定参数。具体参数取决于操作类型。您可以参考选择操作类型时自动显示的建议。按 CTRL+空格获取已知变量列表。
表格/代码模式
表格和代码模式单选按钮用于切换定义桩函数行为的编辑模式:
- 表格 - (默认)打开指定参数的配置表
- 代码 - 打开编写桩函数行为脚本的代码编辑器
预期的桩
预期的桩步骤允许配置期望的桩函数调用次数和顺序。此步骤应放在配置针对的调用步骤之前。另请参阅配置桩函数行为。
行动
行动字段指定期望的类型。可用类型显示在下拉列表中。支持以下操作:
- EXPECT NUMBER OF CALLS:配置期望的调用次数
- EXPECT NUMBER OF CALLS MORE THAN:配置期望的调用次数
- EXPECT NUMBER OF CALLS LESS THAN:配置期望的调用次数
- EXPECT NUMBER OF CALLS IN RANGE:配置期望的调用次数
- EXPECT CALL SEQUENCE:配置期望的调用顺序
函数
在函数字段中指定应用该配置的桩函数的函数标识符。为 EXPECT CALL SEQUENCE 操作输入一串以逗号分隔的函数标识符调用。
函数标识符是用于标识桩函数的字符串。默认情况下,C++test 生成的桩函数使用以下模式的标识符:[parent::]<function_name>
。只有当函数/方法是类或命名空间成员时才会添加 parent::
前缀。仅添加直接相关的父级。对于模板类方法,父名称中会省略模板参数。
C++test 对函数的所有重载版本使用相同的函数标识符。如有必要,您可以通过修改桩函数定义来为每个重载桩函数引入唯一的函数标识符。这样即可区分重载函数/方法的桩函数。
参数
参数字段允许为选定的操作类型指定参数。具体参数取决于操作类型。您可以参考选择操作类型时自动显示的建议。
桩函数(已弃用)
“桩函数”步骤为当前测试用例设置配置。此步骤应放在配置针对的调用步骤之前。另请参阅配置桩函数行为。
行动
行动字段指定桩函数行为或期望值。可用操作显示在下拉列表中。支持以下操作:
- SET RETURN VALUE:修改返回值(仅适用于简单类型)
- SET PARAMETERS:修改桩函数参数
- CALL ORIGINAL:调用原始函数
- USE CUSTOM ACTION:对桩函数调用执行自定义操作
- EXPECT NUMBER OF CALLS:配置期望的调用次数
- EXPECT NUMBER OF CALLS MORE THAN:配置期望的调用次数
- EXPECT NUMBER OF CALLS LESS THAN:配置期望的调用次数
- EXPECT NUMBER OF CALLS IN RANGE:配置期望的调用次数
- EXPECT CALL SEQUENCE:配置期望的调用顺序
函数
在函数字段中指定应用该配置的桩函数的函数标识符。为 EXPECT CALL SEQUENCE 操作输入一串以逗号分隔的函数标识符调用。
函数标识符是用于标识桩函数的字符串。默认情况下,C++test 生成的桩函数使用以下模式的标识符:[parent::]<function_name>
。只有当函数/方法是类或命名空间成员时才会添加 parent::
前缀。仅添加直接相关的父级。对于模板类方法,父名称中会省略模板参数。
C++test 对函数的所有重载版本使用相同的函数标识符。如有必要,您可以通过修改桩函数定义来为每个重载桩函数引入唯一的函数标识符。这样即可区分重载函数/方法的桩函数。
参数
具体可用的参数取决于操作类型。按 CTRL+空格获取已知变量、参数 API 和桩函数 API 的列表。
条件
您可以在条件字段中指定可选条件。可用的条件取决于操作类型。按 CTRL+空格获取已知变量、参数 API 和桩函数 API 的列表。
对应的 C/C++ 代码
/* SET RETURN VALUE */ CPPTEST_ON_CALL("<Function>")[-><Condition>]->Arg("__return")->Assign()-><Parameters>; /* SET PARAMETERS */ CPPTEST_ON_CALL("<Function>")[-><Condition>]->Arg("<param1>")->Assign()-><value representation>->Arg("<param2">)->Assign()-><value representation>... /* CALL ORIGINAL */ CPPTEST_ON_CALL("<Function>")[-><Condition>]->Arg("__callOrig")->Assign()->Int(1); /* USE CUSTOM ACTION */ CPPTEST_ON_CALL("<Function>")[-><Condition>]-><Parameters>; /* EXPECT NUMBER OF CALLS */ CPPTEST_EXPECT_NCALLS("<Function>", <Parameters>); /* EXPECT NUMBER OF CALLS MORE THAN */ CPPTEST_EXPECT_NCALLS_MORE_THAN("<Function>", <Parameters>); /* EXPECT NUMBER OF CALLS LESS THAN */ CPPTEST_EXPECT_NCALLS_LESS_THAN("<Function>", <Parameters>); /* EXPECT NUMBER OF CALLS IN RANGE */ CPPTEST_EXPECT_NCALLS_IN_RANGE("<Function>", <Parameters>); /* EXPECT CALL SEQUENCE */ CPPTEST_EXPECT_CALL_SEQUENCE()->Add("<Function>")->Add("<Function>")... ;
变量
使用“变量”步骤指定变量定义、初始化设置和赋值。局部变量和全局变量都可以添加到此步骤中。变量通常用于设置输入值(前置条件)。
类型
类型字段指定变量的类型。将该字段留空即可设置全局变量。按 CTRL+空格获取已知类型列表。
名称
在名称字段中输入变量的名称。名称为必填项。对于成员变量,名称还应包含对象变量(object.mVariable or object->mVariable
)。如果定义了多个同名变量,系统将显示警告。按 CTRL+空格获取已知变量列表。
值
在值字段中输入一个值,将该值初始化并赋值给变量。可接受任何有效的 C/C++ 初始化器(常量、表达式、函数调用等)。按 CTRL+空格获取已知变量列表。
对应的 C/C++ 代码
[<Type>] <Name> [= <Value>];
已弃用的桩函数步骤配置操作
修改返回简单类型值的函数返回值
- 从行动下拉列表中选择 SET RETURN VALUE
- 在函数列指定一个函数名 - 确保桩函数存在
- 在参数列中指定返回值
- (可选)指定在什么时候返回值的条件(条件列)
如果指定了多个 SET RETURN VALUE 操作,将按从上到下的顺序处理。最后一个满足条件的操作将会生效。
如果还为给定函数和条件指定了 CALL ORIGINAL 操作,将会重写 SET RETURN VALUE 操作并调用原始函数。
若要修改复杂类型的返回值,应根据使用复杂类型的基本方法中描述的方法来使用 CUSTOM ACTION。
修改简单类型值的桩函数参数
- 从行动下拉列表中选择 SET PARAMETERS
- 在函数列指定一个函数名 - 确保桩函数存在
在参数列中使用
<stub parameter name>=<value>
语法指定桩函数参数。另外,支持以分号分隔的列表。示例:paramA=100; paramB=localVar; paramC=ByRef(globalVar) arrayParamD[3]=10
- (可选)指定在什么时候修改参数的条件(条件列)
如果为同一参数指定了多个 SET PARAMETERS 操作,将按从上到下的顺序处理。最后一个满足条件的操作将会生效。
如果还为给定函数和条件指定了 CALL ORIGINAL 操作,将使用修改的参数调用原始函数。
若要修改复杂类型的参数,应根据使用复杂类型的基本方法中描述的方法来使用 CUSTOM ACTION。
调用具有可用原始定义的函数的原始函数
- 从行动下拉列表中选择 CALL ORIGINAL
- 在函数列指定一个函数名 - 确保桩函数存在
- (可选)指定在什么时候调用原始函数的条件(条件列)
配置期望的调用次数
- 从行动下拉列表中选择 EXPECT NUMBER OF CALLS
- 在函数列指定一个函数名 - 确保桩函数存在
- 在参数列中指定期望的调用次数
配置期望的调用顺序
- 从行动下拉列表中选择 EXPECT CALL SEQUENCE
- 在函数列指定一串函数名 - 确保桩函数存在
定义桩函数调用时的自定义操作
- 从行动下拉列表中选择 USE CUSTOM ACTION
- 在函数列指定一个函数名 - 确保桩函数存在
- 在参数列中指定自定义操作 - 该操作由桩函数 API 定义 - 更多详细信息,请参阅使用桩函数 API(已弃用)。
(可选)指定自定义操作执行的条件(条件列)
自定义操作将在 C/C++ 代码中使用桩函数 API 表示为:CPPTEST_ON_CALL("<Function>")->[If()-><Condition>->]<Parameters>
这可以用于操作复杂类型值——如使用复杂类型的基本方法中所述。
关于 C 测试用例
在“桩函数”步骤中输入值时,C++test 将自动检测常量值的类型,以及参数 API。对于其他值(变量、表达式),必须使用桩函数 API 显式指定值的类型,例如,Int(<value>)、Float(<value>)。
而对于 C++ 测试用例则不需要这样。
定义条件的语法
使用以下语法定义条件(即,SET RETURN VALUE, CALL ORIGINAL, USE CUSTOM ACTION)。
精简语法
<name of stub parameter> <operator> <value>
示例:
paramA == 10 (condition will be met if "paramA" stub parameter equals 10) paramB > 100 (condition will be met if "paramB" stub parameter is greater than 100)
PPTEST_NCALLS <operator> <number of calls>
示例:
CPPTEST_NCALLS == 10 (condition will be met for 10th call to stub function) CPPTEST_NCALLS < 5 (condition will be met during the first 4 calls to stub function)
扩展语法
- 桩函数 API 可用于复杂条件的构建;请参阅使用桩函数 API(已弃用)。
示例:If().Arg("param1").Greater().Value(10)
精简语法和扩展语法不能在一个条件中混用。