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

在本章节中:

使用工厂函数

工厂函数是一个函数(全局、命名空间级别或静态类方法),该函数返回给定类型并具有 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 指令快速添加到经过测试的源文件中, 右键单击要在其中添加包含的代码,然后从快捷菜单中选择 Parasoft> C++test > 插入代码段> C++test 工厂标头包括 。。

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

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

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

使用工厂函数

使用自动生成的测试用例

将 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