本主题说明如何定义和使用能够返回给定类型的特定值的工厂函数。这样,您可以建立有效对象的资源库,可用于自动生成的测试以及使用测试用例向导创建的测试用例中。

章节目录:

关于工厂函数

工厂函数是一个函数(全局、命名空间级别或静态类方法),该函数返回给定类型并具有 CppTest_Factory_name 前缀。对于给定类型,可以定义多个工厂函数。

当 C++test 在生成测试用例的编译单元中发现这样的工厂函数声明时,它会将该工厂函数视为给定类型的一种可能的初始化选项。如果工厂函数具有非空的参数列表,C++test 会像初始化用于创建给定类型对象的构造函数参数一样初始化工厂函数的参数。

定义工厂函数

要为 Type 类型创建工厂函数,则使用以下签名编写该函数:

Type CppTest_Factory_<factory_function_name>(<factory_arguments>);

例如:

   int CppTest_Factory_generateBooleanInt(bool b)    
   {
	return b ? 1 : 0;
   }
   MyClass* CppTest_Factory_createMyClass(int size, int value)
   {
	MyClass* m = new MyClass; 
	m->initialize(size);
	m->setValue(value); 
	return m;
  }

由于 C++test 需要在生成测试用例的编译单元上下文中发现工厂函数的声明,因此我们建议采用以下方法编写工厂函数:

  1. 创建带有要在测试用例中使用的工厂函数声明的头文件。例如,可以在测试项目根目录下的 factory 文件夹中创建这样的头文件。
  2. 在所有应使用工厂函数的被测源文件中,为已创建的工厂函数头添加一个 include 指令。我们建议使用 #ifdef PARASOFT_CPPTEST 对其进行保护。
    • 要将这样的 include 指令快速添加到被测源文件中,可转到源代码编辑器,右键点击要在其中添加 include 的代码,然后从快捷菜单中选择 Parasoft> C++test > 插入 Snippet> C++test 工厂头文件包含

  3. 使用工厂函数实现来创建源文件。此类源文件应在测试配置的执行> 符号> 使用从以下位置找到的文件中的额外符号字段,该字段默认设置为 ${cpptest:cfg_dir}/safes-tubs;${project_loc}/stubs;${project_loc}/factory
    • 要将工厂函数部分快速添加到工厂函数源文件中,可转到源代码编辑器,右键点击要在其中添加 include 的代码,然后从快捷菜单中选择 Parasoft> C++test > 插入Snippet> C++test 工厂函数

    • 您可以转到源代码编辑器,将其他工厂函数部分快速添加到工厂函数模板中, 右键点击要在其中添加 include 的代码,然后从快捷菜单中选择 Parasoft> C++test > 插入 Snippet> C++test 工厂函数模板

  • 在独立测试套件中使用工厂函数时(包括手动编写的测试用例和使用测试用例向导添加的测试用例),确保确保为包含所使用的工厂函数声明的工厂函数头文件添加 include 指令。
  • 创建用于包含工厂函数定义的源文件时,需要将其排除在常规构建之外。有关说明,请参阅从构建中排除测试用例

使用工厂函数

通过自动生成的测试用例

将 C++test 测试配置为在自动生成的测试用例中使用工厂函数的步骤:

  1. 在测试配置管理器的生成> 测试用例选项卡中,启用使用工厂函数选项。
  2. 如果您只想使用工厂函数,还需要启用工厂函数类型请勿使用其他初始化程序

通过测试用例向导

使用测试用例向导创建测试用例时,也可以使用在被测编译单元中找到的工厂函数。在这种情况下,工厂函数将作为给定类型的附加初始化方法出现。

使用包含工厂函数的数据源

配置用于 C++test(如使用数据源的数据参数化测试用例中所述)的任何数据源都可以在工厂函数中使用。您可以使用 C++test 数据源 API 来访问数据源中的值。

以下是示例:

MyClass CppTest_Factory_getMyClassObjectFromDS (void)
{
  MyClass obj;
  if (CPPTEST_DS_HAS_COLUMN("MyClass.int")) {
    obj.initialize(CPPTEST_DS_GET_INTEGER("MyClass.int"));   
  } else {
    // Data Source not available in this test case
    obj.initialize(0);
}

注意

  • 确保给定的数据源列存在于当前执行的测试用例的上下文中。
  • 如果要在工厂函数中使用 C++test API,确保工厂函数定义文件中包含 cpptest.h 头文件。建议在任何其他头文件之前包含该头文件。
  • No labels