章节目录:
测试套件是测试用例的容器,必须先创建测试用例才能添加:
所有测试套件数据(包括测试用例)都存储在位于 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 */ |
新的代码段将出现在下拉菜单中:
之后就可以执行更新的测试套件了。
新的测试用例将出现在测试用例浏览器树结构中,并且可以执行。有关运行测试用例的说明,请参阅执行测试用例。
默认测试用例表示特定函数的标准测试用例。它包含以下步骤,当您运行测试用例时,这些步骤将按下面的顺序执行:
您还可以自定义测试用例的结构。请参阅步骤的使用。
只有使用测试用例编辑器创建的测试用例(请参阅创建测试用例)可以通过编辑器编辑。自动生成的测试用例(请参阅生成测试用例)、在代码编辑器中创建的测试用例或使用测试用例向导创建的测试用例(请参阅使用图形化测试用例向导添加测试套件和测试用例)不可以用测试用例编辑器编辑。
在测试用例编辑器中创建的测试用例不应该在编辑器外部修改。如果一个测试用例已被手动修改,您可以恢复在测试用例编辑器中生成的代码。
此选项也可在测试套件级和项目级使用。
在测试用例编辑器中,每个测试用例都由一系列步骤表示。在运行时,这些步骤按照编辑器中定义的从上到下的顺序执行。编辑器中提供了实现特定功能的各种步骤:
有关可用步骤的更多详细信息,请参阅测试用例步骤参考。
默认测试用例仅使用了可用步骤中的一部分(请参阅默认测试用例)。如有需要,通过配置按特定顺序执行的步骤来定义测试用例流程,您可以自定义一个测试用例来实现特定的场景。例如,可以在执行一系列函数调用之前执行额外的桩函数配置。此外,可以报告特定的输入/输出值。
在测试用例编辑器中,点击步骤旁的(-)按钮。该步骤将从测试用例中删除。
在测试用例编辑器中,点击一个步骤的控制柄(四向箭头),按所需顺序拖放步骤。
在测试用例编辑器中,点击一个步骤的控制柄(四向箭头),按住 CTRL 键的同时拖放步骤。
您可能需要配置桩函数行为来实现某些测试场景并确保运行时环境一致性。使用动态桩函数配置功能,可以将桩函数配置直接放入测试用例定义中,这样每个测试用例都可以拥有唯一的桩函数配置。您可以使用桩函数回调框架(详细信息请参阅使用桩函数回调)或测试用例编辑器的界面手动修改测试用例源代码。测试用例编辑器提供了桩函数配置的专用步骤——“桩配置”和“预期的桩”——用于设置桩函数的期望返回值、在桩函数和原始代码之间切换等等。
测试用例编辑器中定义的步骤根据从上到下的顺序执行。因此,必须确保按照所需顺序配置步骤:
有关配置已弃用的桩函数步骤的信息,请参阅已弃用的桩函数步骤配置操作部分。 |
通过“桩配置”步骤可以使用桩函数回调框架配置桩函数行为。
桩函数回调要求在创建桩函数前,在桩函数视图中(请参阅在桩函数视图中配置桩函数选项)或直接在您的测试配置中(请参阅执行选项卡设置 - 定义测试的执行方式)选中启用桩函数回调选项。 |
表格 - (默认)打开指定参数的配置表
代码 - 打开编写桩函数行为脚本的代码编辑器
在表格模式下,您可以定义将在测试用例执行期间执行的操作。这些操作在单独的表行中配置,按从上到下的顺序执行。
从下拉菜单中选择操作类型完成行动列设置。
然后使用所需参数完成 P1-P4 列设置。您可以参考选择操作类型时自动显示的建议。
可选择以下行动类型:
(*__return)
、全局变量和桩函数所属类的成员定义此类型。(__this)
、全局变量和桩函数所属类的成员的值。通过定义特定的调用参数,可以为同一桩函数的各个调用指定桩函数行为。特定的调用参数必须以逗号分隔的大括号参数列表形式提供:
您可以通过添加省略号(…)作为序列中的最后一个参数,将操作配置为针对任意次数的桩调用执行。因此,序列中显式指定的最后一个值将用于所有后续桩函数调用。
在下面的示例中,2 和 37 将分别用于第一次和第二此桩函数调用,而 14 将用于第三次调用以及之后的所有桩函数调用:
如果桩函数操作使用多组特定的调用参数进行参数化,则每组参数必须具有相同数量的值。在下面的示例中,两个特定的调用集都包含两个值:
参数值可以是适用于给定上下文的任何值,例如:
在代码模式下,您可以提供配置桩函数行为的代码段。
可以使用 C++test API 的所有函数(包括断言)来配置代码中的桩函数行为。
通过使用 stubCallInfo->callNo
和提供特定的调用值,可以为各个调用指定桩函数行为。下面的示例展示了按以下方式配置的桩函数:
使用“预期的桩”步骤,您可以为桩函数调用配置以下期望设置:
配置预期的桩步骤:
Expect Call Sequence 操作可帮助您确保指定桩函数的顺序。
如果指定了多个 SET VALUE 操作,将按从上到下的顺序处理。如果为同一参数指定多个操作,则最后一个操作将会生效。 |
(__this)
、全局变量、父类成员的值参数化允许使用一组不同的前置和后置条件值执行相同的测试。您可以在内建表格或外部数据源(如 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)
的一个参数化测试用例。在内建表中指定的值通过数据源宏和列名应用到“变量”、“桩配置”和“断言”步骤中。
以下选项可用于配置“参数”步骤:
使用已添加的数据源中指定的值参数化测试用例的步骤:
CPPTEST_DS_GET_INTEGER
CPPTEST_DS_GET_FLOAT
CPPTEST_DS_GET_CSTR
CPPTEST_DS_GET_CHAR
CPPTEST_DS_GET_BOOL
CPPTEST_DS_GET_UINTEGER
CPPTEST_DS_GET_MEM_BUFFER
CPPTEST_DS_GET_ENUM
{CONTEXT}#{TYPE}#{VARIABLE
}(请参阅示例)。使用“报告”步骤报告测试用例中的值。该步骤提供一组报告函数,这些函数会打印特定类型的值(例如,CPPTEST_REPORT_INTEGER()、CPPTEST_REPORT_FLOAT()
等)。这些函数可在类型下拉列表中选择。选择报告函数后,所需参数将出现在 P1-P3 列中。
或者,您可以使用“消息”步骤在运行时打印一条简单的文本消息。此步骤可用于输出可追溯性标识符或用于调试目的。
“报告”和“消息”步骤的输出将被打印到控制台,也可以包含在单元测试报告中。
您可以使用“代码”步骤向测试用例中添加复杂的逻辑,该步骤可实现自定义 C 或 C++ 代码段。代码段可以放在测试用例定义中任何位置,但由于从上到下的执行顺序,步骤的位置非常重要。代码段可以使用在前面的“变量”步骤中定义的变量。“代码”步骤引入的变量可被后续步骤复用。
测试用例编辑器不会验证输入到“代码”步骤中的自定义代码的正确性。在测试用例执行期间会报告语法错误。
测试用例编辑器提供了以下步骤,可在定义测试用例时用作基本构建模块。
“断言”将实际值与期望值进行比较验证,通常用于检查输出值(后置条件)。
可以从下拉列表中选择可用的断言类型。有关支持的断言类型的完整列表,请参阅测试用例验证宏。所有支持的断言类型都可以在代码字段手动添加;请参阅代码。
具体可用的参数取决于断言类型。按 CTRL+空格键获取已知变量列表中选择的参数字段。
<Type>([<P1>, <P2>, <P3>, <P4>]);
“调用”步骤允许调用一个被测函数。可以在单个测试用例中使用多个“调用”步骤来定义调用顺序。测试用例编辑器不会验证输入的调用参数的正确性。
返回字段是用于存储返回值的变量。如果不需要返回值则留空。按 CTRL+空格获取已知类型列表。
名称字段为函数名。对于成员函数,名称字段还应包含一个对象变量(object.mFunction 或 object->mFunction
)。按 CTRL+空格获取已知变量列表。
您可以在此字段中输入以逗号分隔的参数列表。可接受任何有效的 C/C++ 参数(常量、变量、表达式等)。按 CTRL+空格获取已知变量列表。
<Return> =] <Name>(<Parameters>);
代码字段允许输入运行测试用例时要执行的自定义 C/C++ 代码段。代码可以使用前面步骤中已经定义的符号。后续步骤可以使用在“代码”步骤引入的符号。测试用例编辑器不会验证输入代码的语法。
<Code>
全局步骤包括测试套件专用的变量定义、初始化配置和赋值。全局变量可以在以后的测试用例中使用。全局步骤仅在测试套件编辑器中可用。
在类型字段中输入全局变量的类型(必填)。按 CTRL+空格获取已知类型列表。
在名称字段中输入全局变量的名称(必填)。如果定义了多个同名变量,系统将显示警告。
在值字段中输入要赋值给变量的初始化值。可接受任何有效的 C/C++ 初始化器(常量、表达式等)。按 CTRL+空格获取已知变量列表。
<Type> <Name> [= <Value>];
在“消息”步骤中输入一个简单的文本消息,该消息会在测试执行期间通过 CPPTEST_REPORT() 打印。“消息”步骤对于可追溯性或调试目的而言尤其有用。文本内容将按原样打印(不允许使用变量或表达式)并转义所有引号。
CPPTEST_REPORT(“<Message>”);
使用“参数”步骤设置测试参数。将为步骤中的每行独立执行测试用例。在单个测试用例中只允许设置一个“参数”步骤。可以使用参数 API 访问“参数”步骤中的值。“参数”步骤包含两种模式:内建 (表格) 模式和数据源模式。
启用内建 (表格) 选项,直接在参数编辑器中输入值:
在这种模式下,每一列(A、B、C 等)代表一个变量,每一行代表一个将在测试用例执行期间使用的数据向量。
启用数据源选项并输入已有数据源的名称。按 Ctrl+空格键将显示可用数据源的名称:
输入数据源名称后,可执行以下操作:
此模式使用已定义的现有数据源,包括行和列的名称。您可以点击更新列名按钮来显示已有数据源的列名。点击更新列名按钮时只能显示列名;在此模式下,不会显示来自已有数据源的行。
N/A
您可以在“报告”步骤中设置将在测试执行期间与运行时值一起打印的消息。此步骤可用于打印输入/输出值或用于调试目的。
从类型下拉列表的类型选项中选择一种报告类型。有关支持的报告类型的完整列表,请参阅测试用例报告宏。
具体可用的参数取决于报告类型。按 CTRL+空格获取已知变量列表。
<Type>([<P1>, <P2>, <P3>]);
桩配置步骤允许配置当前测试用例的桩函数行为。此步骤应放在配置针对的调用步骤之前。另请参阅配置桩函数行为。
行动字段指定配置桩函数行为的操作类型。可用操作显示在下拉列表中。支持以下操作:
P1、P2、P3 和 P4 字段允许您为选定的操作类型指定参数。具体参数取决于操作类型。您可以参考选择操作类型时自动显示的建议。按 CTRL+空格获取已知变量列表。
表格和代码模式单选按钮用于切换定义桩函数行为的编辑模式:
预期的桩步骤允许配置期望的桩函数调用次数和顺序。此步骤应放在配置针对的调用步骤之前。另请参阅配置桩函数行为。
行动字段指定期望的类型。可用类型显示在下拉列表中。支持以下操作:
在函数字段中指定应用该配置的桩函数的函数标识符。为 EXPECT CALL SEQUENCE 操作输入一串以逗号分隔的函数标识符调用。
函数标识符是用于标识桩函数的字符串。默认情况下,C++test 生成的桩函数使用以下模式的标识符:[parent::]<function_name>
。只有当函数/方法是类或命名空间成员时才会添加 parent::
前缀。仅添加直接相关的父级。对于模板类方法,父名称中会省略模板参数。
C++test 对函数的所有重载版本使用相同的函数标识符。如有必要,您可以通过修改桩函数定义来为每个重载桩函数引入唯一的函数标识符。这样即可区分重载函数/方法的桩函数。
参数字段允许为选定的操作类型指定参数。具体参数取决于操作类型。您可以参考选择操作类型时自动显示的建议。
“桩函数”步骤为当前测试用例设置配置。此步骤应放在配置针对的调用步骤之前。另请参阅配置桩函数行为。
行动字段指定桩函数行为或期望值。可用操作显示在下拉列表中。支持以下操作:
在函数字段中指定应用该配置的桩函数的函数标识符。为 EXPECT CALL SEQUENCE 操作输入一串以逗号分隔的函数标识符调用。
函数标识符是用于标识桩函数的字符串。默认情况下,C++test 生成的桩函数使用以下模式的标识符:[parent::]<function_name>
。只有当函数/方法是类或命名空间成员时才会添加 parent::
前缀。仅添加直接相关的父级。对于模板类方法,父名称中会省略模板参数。
C++test 对函数的所有重载版本使用相同的函数标识符。如有必要,您可以通过修改桩函数定义来为每个重载桩函数引入唯一的函数标识符。这样即可区分重载函数/方法的桩函数。
具体可用的参数取决于操作类型。按 CTRL+空格获取已知变量、参数 API 和桩函数 API 的列表。
您可以在条件字段中指定可选条件。可用的条件取决于操作类型。按 CTRL+空格获取已知变量、参数 API 和桩函数 API 的列表。
/* 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+空格获取已知变量列表。
[<Type>] <Name> [= <Value>];
如果指定了多个 SET RETURN VALUE 操作,将按从上到下的顺序处理。最后一个满足条件的操作将会生效。
如果还为给定函数和条件指定了 CALL ORIGINAL 操作,将会重写 SET RETURN VALUE 操作并调用原始函数。
若要修改复杂类型的返回值,应根据使用复杂类型的基本方法中描述的方法来使用 CUSTOM ACTION。
在参数列中使用 <stub parameter name>=<value>
语法指定桩函数参数。另外,支持以分号分隔的列表。示例:
paramA=100; paramB=localVar; paramC=ByRef(globalVar) arrayParamD[3]=10 |
如果为同一参数指定了多个 SET PARAMETERS 操作,将按从上到下的顺序处理。最后一个满足条件的操作将会生效。
如果还为给定函数和条件指定了 CALL ORIGINAL 操作,将使用修改的参数调用原始函数。
若要修改复杂类型的参数,应根据使用复杂类型的基本方法中描述的方法来使用 CUSTOM ACTION。
(可选)指定自定义操作执行的条件(条件列)
自定义操作将在 C/C++ 代码中使用桩函数 API 表示为:
CPPTEST_ON_CALL("<Function>")->[If()-><Condition>->]<Parameters> |
这可以用于操作复杂类型值——如使用复杂类型的基本方法中所述。
在“桩函数”步骤中输入值时,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) |
If().Arg("param1").Greater().Value(10)
精简语法和扩展语法不能在一个条件中混用。