主要内容

在基于类的测试中使用参数

通常,您需要运行一系列仅在测试数据方面不同的测试。例如,您可能想测试一个函数是否为不同的输入生成预期的输出。在这种情况下,测试逻辑是相同的,测试之间的唯一区别是每个函数调用的实际值和预期值。通过参数化测试,您可以实现代码来使用不同的数据值迭代地运行测试。当一个方法被参数化时,测试框架会为每个参数值自动调用该方法。因此,您不需要为每个值实现单独的方法。

测试框架使您可以在不同级别参数化测试类。此外,当您调用具有多个参数的测试类方法时,可以指定如何为参数的不同组合调用该方法。

如何编写参数化测试

类派生的类matlab.unittest.TestCase类可以使用特定于框架的属性和方法属性来实现测试参数化。要将数据作为参数提供为基于类的测试,请使用a指定数据属性块,使用适当的参数化属性。然后,将参数化属性作为输入参数传递给一个或多个方法。

例如,考虑SampleTest类。类定义了参数化测试,因为它指定了属性块的TestParameter.属性。属性被传递给测试方法,并用于执行确认。

classdefSampleTest < matlab.unittest.TestCase属性(TestParameter) Number = {1,2,“3”、4、5};结尾方法(测试)功能testDouble (testCase、数量)testCase.verifyClass(数字,'双倍的'结尾结尾结尾

因为数量如果是一个包含五个元素的单元格数组,则测试类将产生一个包含五个元素的参数化测试套件。

套房= testsuite(“SampleTest”);{套件。名称}’
ans = 5×1 cell array {'SampleTest/testDouble(Number=value1)'} {'SampleTest/testDouble(Number=value3)'} {'SampleTest/testDouble(Number=value4)'} {'SampleTest/testDouble(Number=value5)'}

分配给参数化属性的值必须是非空的单元数组或具有至少一个字段的标量结构。马铃薯®使用属性值指定测试套件中的参数名称和值:

  • 如果属性值是字符向量的单元格数组,MATLAB将从单元格数组中的值生成参数名称。否则,MATLAB指定参数名为value1value2,......,

  • 如果属性值是一个结构,结构字段表示参数名称,结构值表示参数值。要在套件中包含描述性参数名称,请使用结构而不是单元格数组定义参数。

如何初始化参数化属性

定义参数化属性时,必须初始化该属性,以便MATLAB可以生成参数名称和值。你可以在测试类加载时或测试套件创建时初始化属性:

  • 类加载时间:如果属性值可以在MATLAB加载测试类定义时确定,则使用默认值初始化属性。属性中指定默认值属性块中的局部函数classdef文件。有关在类定义中赋值的详细信息,请参见评估类定义中的表达式

    在类加载时间初始化参数化属性时,与属性关联的参数仍然固定以用于不同的测试运行。每次从参数化测试类创建套件时,框架都使用相同的参数名称和值来运行测试。看创建基本参数化测试下面是使用带有默认值的参数化属性的示例。

  • 套件创建时间:如果您不能或不想在类负载时间确定参数,请使用静态方法在套件创建时间初始化属性TestParameterDefinition属性。使用a初始化参数化属性时TestParameterDefinition方法,与属性关联的参数可能因不同的测试运行而异。每次从参数化测试类创建套件时,框架都会生成新的参数名称和值以运行测试。有关更多信息,请参阅在套件创建时间定义参数

将值分配给参数化属性后,请勿修改它。例如,当使用默认值初始化参数化属性时,您无法使用aTestParameterDefinition方法以覆盖默认值。

几个单元测试可能会使用参数。使用相同参数的测试必须独立运行,而不会意外地影响彼此。此外,运行测试不得影响同一测试的后续重新运行。为确保测试运行独立性,请使用值对象初始化参数化属性。不建议使用句柄对象(例如MATLAB图形对象)作为参数值。有关有关价值和处理对象的行为的详细信息,请参阅句柄类和值类的比较

如果您需要在参数化测试中测试句柄对象,请考虑通过使用函数处理作为参数值,并调用测试中的这些功能处理来构建它们。例如,写入参数化测试以测试使用的数据的默认当前数据点数字uifigure功能。

classdef菲格塔斯属性(TestParameter) FigureType = {@figure, @ uiffigure};结尾方法(测试)功能defaultCurrentPoint(testCase,FigureType)图= FigureType();testCase.addTeardown(@close,fig) cp = fig. currentpoint;testCase。verifyEqual (cp [0 0])结尾结尾结尾

指定参数化水平

您可以在三个级别参数化测试类:类设置,方法设置和测试。每个级别的参数化都需要参数化属性来具有特定属性属性。例如,在最高级别,atestclasssetup.方法可以使用在a中定义的属性进行参数化属性块的ClassSetupParameter属性。在最低层次,a测试方法可以使用在a中定义的属性进行参数化属性块的TestParameter.属性。

此表显示了不同的参数化级别和每个级别所需的方法和属性属性。

参数化水平 参数化定义 可访问的参数化属性
方法属性 属性的属性
类设置级别 testclasssetup. ClassSetupParameter ClassSetupParameter
方法设置级别 testmethodetup. MethodSetupParameter MethodSetupParameterClassSetupParameter
测试水平 测试 TestParameter. TestParameter.MethodSetupParameter,ClassSetupParameter

参数化方法可以访问参数化属性,具体取决于方法定义的级别:

  • 参数化testclasssetup.方法可以访问参数化属性ClassSetupParameter属性。

  • 参数化testmethodetup.方法可以访问参数化属性MethodSetupParameterClassSetupParameter属性。

  • 参数化测试方法可以访问任何参数化属性。

有关如何在不同级别参数化测试类的示例,请参见创建高级参数化测试

指定参数如何组合

将多个参数化属性传递给方法时,可以使用ParameterCombination方法属性指定参数的组合方式。测试框架为指定的组合调用方法。

该表展示了不同的参数组合策略。

ParameterCombination属性 方法调用
'彻底的'(默认)

方法为所有参数值组合调用。如果没有指定,测试框架将使用此默认组合ParameterCombination属性。

'顺序'

方法使用来自每个参数的相应值调用。每个参数必须包含相同数量的值。例如,如果一个方法提供了两个参数化属性,并且每个属性指定三个参数值,那么框架将调用该方法三次。

“成对”

至少一次参数值调用方法。例如,如果提供了具有三个参数化属性的方法,则测试框架保证用于每个两个属性指定的参数值的每个组合都会调用该方法。

相比'彻底的'组合,“成对”组合通常会导致更少的测试,从而更快地执行测试。虽然框架保证为每一对值至少创建一次测试,但您不应该依赖于套件大小、顺序或特定的测试套件元素集。

您可以将参数组合在Class-Setup,方法设置和测试级别。例如,使用组合方法属性testmethodetup,parametercombination ='顺序'指定在中定义的方法设置级参数的顺序组合属性块的MethodSetupParameter属性。

有关如何组合测试参数的示例,请参见创建基本参数化测试创建高级参数化测试

在测试中使用外部参数

在创建参数化测试时,可以通过将输入注入基于类的测试来重新定义参数。要提供在测试文件之外定义的数据,请创建参数实例,并使用“ExternalParameter”选项创建测试套件时。有关更多信息,请参阅在参数化测试中使用外部参数

另请参阅

||

相关的话题