参数化测试允许重复运行相同的测试过程,每次使用不同的数据值。在参数化测试中,调用这些数据值参数和由测试类的参数化属性表示。MATLAB®使用参数化属性为每次测试运行生成参数名称和值。
在大多数情况下,MATLAB可以在加载测试类定义时确定参数化属性的值。因此,可以使用默认值初始化属性。当您使用默认值初始化参数化属性时,与属性关联的参数在不同的测试运行中保持固定。每次从参数化测试类创建套件时,测试框架都会使用相同的参数名称和值来运行测试。
在某些情况下,MATLAB在加载测试类定义时不能确定参数化属性的值。例如,有时一个参数化属性依赖于在更高的参数化级别上定义的另一个属性。或者您可能不希望在装入类时确定参数。例如,如果参数表示文件夹中的文件,则可能希望在每次创建测试文件的套件时刷新参数。属性的静态方法在套件创建时初始化参数化属性,如果不能或不想在装入类时初始化它TestParameterDefinition
属性。类初始化参数化属性时TestParameterDefinition
方法时,与属性关联的参数可能因不同的测试运行而不同。换句话说,每次从参数化测试类创建测试套件时,框架都会生成新的参数名称和值来运行测试。
这个示例演示了如何使用带有默认值和非默认值的参数化属性来验证当前文件夹中的一组类的公共属性是非空的。在其中,您定义了一个参数化测试类,名为PropertiesTest
在测试
当前文件夹的子文件夹。定义三个要测试的类,命名为ClassA
那ClassB
,ClassC
,在来源
当前文件夹的子文件夹。有关这三个类的概要,请参见源子文件夹中的类.
要测试所定义的类的公共属性来源
子文件夹,创建PropertiesTest
班上测试
子文件夹。此类占用三个指定类,检索每个类的所有属性,并验证它们是非空的。迭代类以测试,参数化PropertiesTest
在类设置级别。若要遍历由给定的类设置级参数化指定的每个类的属性,请参数化PropertiesTest
在测试级别。
定义参数化测试使用的属性:
列出框架要在名为ClassToTest
.因为这个例子假设来源
子文件夹是固定的,并且在MATLAB加载测试类定义时已知,使用默认值初始化属性。以便在运行任何类之前指定要测试的类测试
方法,使ClassToTest
一种ClassSetupParameter.
财产。
定义一个TestParameter
属性命名PropertyToTest
您可以使用它来迭代框架当前正在测试的任何类的属性。因为它的值取决于被测试的类,所以不要给它分配默认值。相反,在创建套件时使用TestParameterDefinition
方法。
要在被测试类的实例上存储不同属性的值,请定义名为ObjectToTest
.
classdefPropertiesTest < matlab.unittest.TestCase属性(ClassSetupParameter) classstotest = {'classa'那'classb'那“ClassC”};结束属性(TestParameter) PropertyToTest结束属性ObjectToTest结束结束
在PropertiesTest
类,PropertyToTest
对被测试的每个类都有不同的值。因此,不能为其指定默认值。相反,您必须在创建套件时初始化它。要实现这个要求,添加一个TestParameterDefinition
命名方法initializeProperty
.因为一个TestParameterDefinition
方法必须是静态的,请使用组合的方法属性TestParameterDefinition,静态
定义方法。
这initializeProperty
方法接受类设置级别参数化属性作为输入,并在调用中使用它属性
函数返回字符向量单元格数组中的属性名称。
classdefPropertiesTest < matlab.unittest.TestCase属性(ClassSetupParameter) classstotest = {'classa'那'classb'那“ClassC”};结束属性(TestParameter) PropertyToTest结束属性ObjectToTest结束方法(静态TestParameterDefinition)函数PropertyToTest = initializeProperty(ClassToTest);结束结束结束
在initializeProperty
方法,两者都是输入参数ClassToTest
输出参数PropertyToTest
是定义的参数化属性PropertiesTest
类。当你定义TestParameterDefinition
方法,所有输入到方法匹配相同类或其超类中定义的参数化属性。此外,该方法的所有输出都必须匹配在同一类中定义的参数化属性。
在initializeProperty
方法,输入参数ClassToTest
在最高参数化级别定义。这使它高于输出参数PropertyToTest
,它在最低的参数化级别定义。当你定义TestParameterDefinition
接受输入的方法,输入必须在相对于方法的输出中处于更高的参数化级别。有关参数化级别的更多信息,请参阅在基于类测试中使用参数.
要测试非空属性值,必须首先创建要测试的类的对象,以便检索属性值。要实现此需求,请添加参数化classSetup
方法PropertiesTest
类。为了在运行任何内容之前准备好对象测试
方法,使classSetup
一种TestClassSetup
方法。
这classSetup
方法创建要测试的类的实例,并将其存储在ObjectToTest
财产。测试稍后可以从中检索属性值ObjectToTest
.在此示例中,该框架通过调用来运行测试classSetup
方法三次,每次一次ClassA
那ClassB
,ClassC
.
classdefPropertiesTest < matlab.unittest.TestCase属性(ClassSetupParameter) classstotest = {'classa'那'classb'那“ClassC”};结束属性(TestParameter) PropertyToTest结束属性ObjectToTest结束方法(静态TestParameterDefinition)函数PropertyToTest = initializeProperty(ClassToTest);结束结束方法(TestClassSetup)函数classSetup(testCase,ClassToTest)构造函数= str2func(ClassToTest);testCase。ObjectToTest =构造函数();结束结束结束
来测试属性ObjectToTest
为非空,添加测试
命名方法testProperty
.为了让方法遍历ObjectToTest
,使方法参数化,并传递它PropertyToTest
.
在每次测试中testProperty
方法检索属性的值ObjectToTest
.然后,它使用呼叫verifyNotEmpty
验证值不为空的资格方法。对于给定的类设置级参数化,框架调用testProperty
为每个正在测试的类上的每个属性一次。
classdefPropertiesTest < matlab.unittest.TestCase属性(ClassSetupParameter) classstotest = {'classa'那'classb'那“ClassC”};结束属性(TestParameter) PropertyToTest结束属性ObjectToTest结束方法(静态TestParameterDefinition)函数PropertyToTest = initializeProperty(ClassToTest);结束结束方法(TestClassSetup)函数classSetup(testCase,ClassToTest)构造函数= str2func(ClassToTest);testCase。ObjectToTest =构造函数();结束结束方法(测试)函数testproperty(testcase,propertytotest)value = testcase.ObjectTotest。(propertytotest);testcase.verifynotempty(价值)结束结束结束
现在PropertiesTest
类定义完成后,可以创建参数化测试套件并运行测试。要做到这一点,请确保来源
和测试
子文件夹在路径上。
目录“源”那“测试”)
创建一个套房从PropertiesTest
类。
套件= testsuite (“PropertiesTest”);
测试套件包括八个元素。属性中定义的每个元素对应于一个属性来源
子文件夹。返回第一个套件元素的名称。
套房(1)。的名字
ans = ' PropertiesTest [ClassToTest = ClassA] / testProperty (PropertyToTest = PropA1)”
第一个元素的名称由以下部分组成:
PropertiesTest
-测试类名
[classtotest = classa]
-类设置级属性和参数名称
testProperty
-测试
方法名称
(PropertyToTest = PropA1)
-测试级属性和参数名称
运行测试。因为来源
子文件夹为空,则其中两个测试失败。
Suite.Run.
运行性质.. ================================================================================验证属性中最失败的属性[classtotest = classa] / testproperty(propertytotest = propa3).---------------------框架诊断:---------------------验证失败。- >值不得为空。- >值的大小为[0 0]。实际价值:[] -----------------------------------在C:\ temp \中例子\matlab-ex41465327\test\PropertiesTest.m (PropertiesTest.testProperty) at 30 ================================================================================ .... ================================================================================ Verification failed in PropertiesTest[ClassToTest=ClassC]/testProperty(PropertyToTest=PropC1). --------------------- Framework Diagnostic: --------------------- verifyNotEmpty failed. --> The value must not be empty. --> The value has a size of [0 0]. Actual Value: [] ------------------ Stack Information: ------------------ In C:\TEMP\Examples\matlab-ex41465327\test\PropertiesTest.m (PropertiesTest.testProperty) at 30 ================================================================================ .. Done PropertiesTest __________ Failure Summary: Name Failed Incomplete Reason(s) ===================================================================================================================== PropertiesTest[ClassToTest=ClassA]/testProperty(PropertyToTest=PropA3) X Failed by verification. --------------------------------------------------------------------------------------------------------------------- PropertiesTest[ClassToTest=ClassC]/testProperty(PropertyToTest=PropC1) X Failed by verification.
ans = 1×8 TestResult数组,属性为:Name Passed Failed Incomplete Duration Details总计:6 Passed, 2 Failed (rerun), 0 Incomplete. 2.9493秒测试时间。
只运行以下测试ClassB
.要做到这一点,使用选择
的方法matlab.unittest.testsuite.
类选择使用特定参数化的测试套件元素。得到的测试套件是一个过滤套件并且只有三个元素。
suite2 = suite.selectIf (“ParameterName”那'propb *');{suite2.name}'
ans =3×1细胞{“PropertiesTest [ClassToTest = ClassB] / testProperty (PropertyToTest = PropB1)}{“PropertiesTest [ClassToTest = ClassB] / testProperty (PropertyToTest = PropB2)}{“PropertiesTest [ClassToTest = ClassB] / testProperty (PropertyToTest = PropB3)}
运行过滤的套房。
suite2.run;
运行PropertiesTest……完成PropertiesTest __________
或者,您可以通过创建通过参数化过滤测试套件的选择器来运行相同的测试。
进口matlab.unittest.selectors.hasparameter.进口matlab.unittest.constraints.StartsWithSubstringsuite3 = matlab.unittest.TestSuite.fromClass (? PropertiesTest,......HasParameter ('名称',startswithsubstring(“PropB”)));Suite3.Run;
运行PropertiesTest……完成PropertiesTest __________
本节提供了类中的内容来源
子文件夹。
ClassA
有三个属性。它的两个属性具有非空值。
classdefClassA属性propa1 = 1;propa2 = 2;PROPA3.结束结束
ClassB
有三个属性。它的所有属性都是非空值。
classdefClassB属性propb1 = 1;propb2 = 2;propb3 ='一种';结束结束
ClassC
有两个属性。它的一个属性有一个非空值。
classdefClassC属性PropC1 PropC2 = [1 2 3];结束结束
matlab.unittest.selectors.hasparameter.
|matlab.unittest.testcase.
|matlab.unittest.testsuite.