Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

matlab.unittest.constraints.StructComparator 类

命名空间: matlab.unittest.constraints

结构体数组的比较器

描述

matlab.unittest.constraints.StructComparator 类提供用于比较结构体数组的比较器。要在测试中使用此比较器,请创建一个 StructComparator 实例,并将其指定为 IsEqualTo 约束构造函数的 Using 名称-值参数的值。

创建对象

描述

示例

c = matlab.unittest.constraints.StructComparator 创建一个用于比较空结构体数组和没有字段的结构体数组的比较器。如果实际值和预期值是具有相同大小和字段的结构体数组,则满足该比较器。

示例

c = matlab.unittest.constraints.StructComparator(comp) 使用指定的比较器 comp 来比较结构体数组中包含的值。使用此语法时,如果实际值和预期值是具有相同大小和字段的结构体数组,并且对应字段中的值满足 comp 中的任一比较器,则满足该比较器。

示例

c = matlab.unittest.constraints.StructComparator(___,Name,Value) 支持上述语法中的任何输入参数组合,且可使用一个或多个名称-值参数设置其他选项。例如,c = matlab.unittest.constraints.StructComparator("Recursively",true) 创建一个比较器,该比较器将在比较结构体数组中包含的值时以递归方式运算。

输入参数

全部展开

用于比较结构体数组中包含的值的比较器,指定为由 matlab.unittest.constraints 包中分类为比较器的类组成的对象数组。

示例: matlab.unittest.constraints.NumericComparator

示例: matlab.unittest.constraints.StringComparator("IgnoringCase",true)

示例: [matlab.unittest.constraints.LogicalComparator matlab.unittest.constraints.NumericComparator]

名称-值参数

将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参数名称,Value 是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。

示例: c = matlab.unittest.constraints.StructComparator(Recursively=true)

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: c = matlab.unittest.constraints.StructComparator("Recursively",true)

要在比较期间忽略的字段,指定为字符串数组或字符向量元胞数组。比较器不比较指定字段中的值。

此参数设置 IgnoredFields 属性。

示例: "IgnoringFields","field1"

是否为以递归方式运算,指定为数值或逻辑值 0 (false) 或 1 (true)。

当值为 true 时,实际和预期结构体数组的字段中的值也可以是结构体数组,并且比较器将以递归方式比较这些值。当值为 false 时,实际和预期结构体数组的字段中的所有值都必须具有受 comp 支持的类型。例如,在以下代码中,c1c2 都可以比较字段中包含数值的结构体数组。但是,只有 c2 可以比较字段中包含结构体数组或数值的结构体数组。

import matlab.unittest.constraints.StructComparator
import matlab.unittest.constraints.NumericComparator

c1 = StructComparator(NumericComparator);
c2 = StructComparator(NumericComparator,"Recursively",true);

此参数设置 Recursive 属性。

属性

全部展开

要在比较期间忽略的字段,以字符向量元胞数组形式返回。

此属性由 IgnoringFields 名称-值参数设置。

属性:

GetAccess
public
SetAccess
private

是否为以递归方式运算,返回为逻辑值 0 (false) 或 1 (true)。

此属性由 Recursively 名称-值参数设置。

属性:

GetAccess
public
SetAccess
private

示例

全部折叠

使用 StructComparator 类比较不包含数据的结构体数组。

首先,导入此示例中使用的类。

import matlab.unittest.TestCase
import matlab.unittest.constraints.IsEqualTo
import matlab.unittest.constraints.StructComparator

创建一个供交互测试的测试用例。

testCase = TestCase.forInteractiveUse;

使用 StructComparator 实例比较两个不包含字段的结构体数组。测试失败,因为大小不匹配。

testCase.verifyThat(struct,IsEqualTo([struct struct], ...
    "Using",StructComparator))
Verification failed.
    ---------------------
    Framework Diagnostic:
    ---------------------
    IsEqualTo failed.
    --> StructComparator failed.
        --> Sizes do not match.
            
            Actual size:
                 1     1
            Expected size:
                 1     2
        
        Actual Value:
          struct with no fields.
        Expected Value:
          1×2 struct array with no fields.
    ------------------
    Stack Information:
    ------------------
    In C:\work\CompareStructureArraysThatContainNoDataExample.m (CompareStructureArraysThatContainNoDataExample) at 18

比较两个空结构体数组。尽管实际和预期结构体数组的大小相等,测试仍失败,因为其包含字段并不相同。

testCase.verifyThat(struct([]),IsEqualTo(struct("f1",{},"f2",{}), ...
    "Using",StructComparator))
Verification failed.
    ---------------------
    Framework Diagnostic:
    ---------------------
    IsEqualTo failed.
    --> StructComparator failed.
        --> Structures contain different fields.
            --> Missing fields in Actual:
                    'f1'
                    'f2'
        
        Actual Value:
          0×0 empty struct array with no fields.
        Expected Value:
          0×0 empty struct array with fields:
        
            f1
            f2
    ------------------
    Stack Information:
    ------------------
    In C:\work\CompareStructureArraysThatContainNoDataExample.m (CompareStructureArraysThatContainNoDataExample) at 24

验证 struct([])struct.empty 生成相同的空结构体数组。

testCase.verifyThat(struct([]),IsEqualTo(struct.empty, ...
    "Using",StructComparator))
Verification passed.

使用 StructComparator 类比较包含数据的结构体。

首先,导入此示例中使用的类。

import matlab.unittest.TestCase
import matlab.unittest.constraints.IsEqualTo
import matlab.unittest.constraints.StructComparator
import matlab.unittest.constraints.NumericComparator
import matlab.unittest.constraints.StringComparator
import matlab.unittest.constraints.RelativeTolerance

创建一个供交互测试的测试用例。

testCase = TestCase.forInteractiveUse;

创建字段中包含数值的两个结构体。

s1 = struct("ID",10,"score",90);
s2 = struct("score",90,"ID",10);

使用 StructComparator 实例来比较结构体。当结构体数组包含数据时,请将合适的比较器传递给构造函数 StructComparator。测试通过。

testCase.verifyThat(s1,IsEqualTo(s2, ...
    "Using",StructComparator(NumericComparator)))
Verification passed.

更改 s2 中包含的值之一,然后重新比较这些结构体。测试失败。

s2.score = 95;
testCase.verifyThat(s1,IsEqualTo(s2, ...
    "Using",StructComparator(NumericComparator)))
Verification failed.
    ---------------------
    Framework Diagnostic:
    ---------------------
    IsEqualTo failed.
    --> Path to failure: <Value>.score
        --> NumericComparator failed.
            --> The numeric values are not equal using "isequaln".
            --> Failure table:
                    Actual    Expected    Error       RelativeError   
                    ______    ________    _____    ___________________
                                                                      
                      90         95        -5      -0.0526315789473684
            
            Actual Value:
                90
            Expected Value:
                95
    
    Actual Value:
      struct with fields:
    
           ID: 10
        score: 90
    Expected Value:
      struct with fields:
    
        score: 95
           ID: 10
    ------------------
    Stack Information:
    ------------------
    In C:\work\CompareStructuresThatContainDataExample.m (CompareStructuresThatContainDataExample) at 31

要使该测试通过,请指定对应的值在相对容差 0.1 的范围内必须相等。

testCase.verifyThat(s1,IsEqualTo(s2, ...
    "Using",StructComparator(NumericComparator( ...
    "Within",RelativeTolerance(0.1)))))
Verification passed.

通过指示比较器以递归方式运算来比较包含字符串的嵌套结构体。测试失败,因为嵌套结构体不相等。

s3 = struct("name",struct("first","Mary","last","Smith"), ...
    "location","Apartment 4");
s4 = struct("name",struct("first","Sam","last","Smith"), ...
    "location","Apartment 4");
testCase.verifyThat(s3,IsEqualTo(s4, ...
    "Using",StructComparator(StringComparator,"Recursively",true)))
Verification failed.
    ---------------------
    Framework Diagnostic:
    ---------------------
    IsEqualTo failed.
    --> Path to failure: <Value>.name.first
        --> StringComparator failed.
            --> The strings are not equal.
            
            Actual Value:
                "Mary"
            Expected Value:
                "Sam"
    
    Actual Value:
      struct with fields:
    
            name: [1×1 struct]
        location: "Apartment 4"
    Expected Value:
      struct with fields:
    
            name: [1×1 struct]
        location: "Apartment 4"
    ------------------
    Stack Information:
    ------------------
    In C:\work\CompareStructuresThatContainDataExample.m (CompareStructuresThatContainDataExample) at 47

提示

  • 在大多数情况下,您不需要使用 StructComparator 实例。IsEqualTo 类创建一个约束来测试各种类型的数据(包括结构体数组)相等性。

    当需要覆盖由 IsEqualTo 类执行的比较时,请使用 StructComparator 实例。例如,如果希望在结构体数组包含非数值时比较失败,请在测试中包含 StructComparator 实例。在此示例中,MATLAB® 会引发错误,因为实际和预期结构体包含非数值。

    import matlab.unittest.TestCase
    import matlab.unittest.constraints.IsEqualTo
    import matlab.unittest.constraints.StructComparator
    import matlab.unittest.constraints.NumericComparator
    
    testCase = TestCase.forInteractiveUse;
    exp = struct("f1",zeros(1,10),"f2",'a',"f3",{'b','c'});
    act = exp;
    testCase.verifyThat(act,IsEqualTo(exp,"Using",StructComparator(NumericComparator)))
    

版本历史记录

在 R2013a 中推出