Main Content

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

matlab.unittest.constraints.TableComparator 类

命名空间: matlab.unittest.constraints

表数组的比较器

描述

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

创建对象

描述

示例

c = matlab.unittest.constraints.TableComparator 创建一个用于比较空表数组的比较器。如果实际值和预期值是具有相同大小和属性值的空表数组,则满足该比较器。

示例

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

示例

c = matlab.unittest.constraints.TableComparator(___,"Recursively",tf) 还指定在比较表数组中包含的值时是否以递归方式运算。如果 tftrue,则递归继续执行,直到检查了所有嵌套值的相等性。您可以将此语法与上述语法中的任何输入参数结合使用。

输入参数

全部展开

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

示例: matlab.unittest.constraints.NumericComparator

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

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

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

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

import matlab.unittest.constraints.TableComparator
import matlab.unittest.constraints.NumericComparator

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

此参数设置 Recursive 属性。

属性

全部展开

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

此属性由 tf 输入参数设置。

属性:

GetAccess
public
SetAccess
private

示例

全部折叠

使用 TableComparator 类比较空表。

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

import matlab.unittest.TestCase
import matlab.unittest.constraints.IsEqualTo
import matlab.unittest.constraints.TableComparator

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

testCase = TestCase.forInteractiveUse;

使用 TableComparator 实例来比较两个空表。验证 tabletable.empty 生成相同的空表。

testCase.verifyThat(table,IsEqualTo(table.empty,"Using",TableComparator))
Verification passed.

测试具有不同属性值的两个空表是否相等。测试失败。

T1 = table;
T1.Properties.Description = "First Empty Table";
T2 = table;
T2.Properties.Description = "Second Empty Table";
testCase.verifyThat(T1,IsEqualTo(T2,"Using",TableComparator))
Verification failed.
    ---------------------
    Framework Diagnostic:
    ---------------------
    IsEqualTo failed.
    --> TableComparator failed.
        --> Table properties do not match.
            Path to failure: <table>.Properties
            --> ObjectComparator failed.
                --> The objects are not equal using "isequaln".
                
                Actual Value:
                  TableProperties with properties:
                
                             Description: 'First Empty Table'
                                UserData: []
                          DimensionNames: {'Row'  'Variables'}
                           VariableNames: {1×0 cell}
                    VariableDescriptions: {}
                           VariableUnits: {}
                      VariableContinuity: []
                                RowNames: {}
                        CustomProperties: No custom properties are set.
                      Use addprop and rmprop to modify CustomProperties.
                Expected Value:
                  TableProperties with properties:
                
                             Description: 'Second Empty Table'
                                UserData: []
                          DimensionNames: {'Row'  'Variables'}
                           VariableNames: {1×0 cell}
                    VariableDescriptions: {}
                           VariableUnits: {}
                      VariableContinuity: []
                                RowNames: {}
                        CustomProperties: No custom properties are set.
                      Use addprop and rmprop to modify CustomProperties.
        
        Actual Value:
          0×0 empty table
        Expected Value:
          0×0 empty table
    ------------------
    Stack Information:
    ------------------
    In C:\work\CompareEmptyTablesExample.m (CompareEmptyTablesExample) at 25

使用 TableComparator 类比较包含非空变量的表。

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

import matlab.unittest.TestCase
import matlab.unittest.constraints.IsEqualTo
import matlab.unittest.constraints.TableComparator
import matlab.unittest.constraints.NumericComparator
import matlab.unittest.constraints.AbsoluteTolerance

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

testCase = TestCase.forInteractiveUse;

创建其变量包含数值的两个表。

LastName = ["Lin";"Jones";"Brown"];
Age = [38;40;49];
Height = [64;67;64];
Weight = [131;133;119];
BloodPressure = [125 83; 117 75; 122 80];
T1 = table(Age,Height,Weight,BloodPressure);
T2 = table(Age,Height,Weight,BloodPressure,'RowNames',LastName);

使用 TableComparator 实例来比较这些表。要比较非空表,请将合适的比较器传递给 TableComparator 构造函数。

testCase.verifyThat(T1,IsEqualTo(T2, ...
    "Using",TableComparator(NumericComparator)))
Verification failed.
    ---------------------
    Framework Diagnostic:
    ---------------------
    IsEqualTo failed.
    --> TableComparator failed.
        --> Table properties do not match.
            Path to failure: <table>.Properties
            --> ObjectComparator failed.
                --> The objects are not equal using "isequaln".
                
                Actual Value:
                  TableProperties with properties:
                
                             Description: ''
                                UserData: []
                          DimensionNames: {'Row'  'Variables'}
                           VariableNames: {'Age'  'Height'  'Weight'  'BloodPressure'}
                    VariableDescriptions: {}
                           VariableUnits: {}
                      VariableContinuity: []
                                RowNames: {}
                        CustomProperties: No custom properties are set.
                      Use addprop and rmprop to modify CustomProperties.
                Expected Value:
                  TableProperties with properties:
                
                             Description: ''
                                UserData: []
                          DimensionNames: {'Row'  'Variables'}
                           VariableNames: {'Age'  'Height'  'Weight'  'BloodPressure'}
                    VariableDescriptions: {}
                           VariableUnits: {}
                      VariableContinuity: []
                                RowNames: {3×1 cell}
                        CustomProperties: No custom properties are set.
                      Use addprop and rmprop to modify CustomProperties.
        
        Actual Value:
          3×4 table
        
            Age    Height    Weight    BloodPressure
            ___    ______    ______    _____________
        
            38       64       131       125     83  
            40       67       133       117     75  
            49       64       119       122     80  
        Expected Value:
          3×4 table
        
                     Age    Height    Weight    BloodPressure
                     ___    ______    ______    _____________
        
            Lin      38       64       131       125     83  
            Jones    40       67       133       117     75  
            Brown    49       64       119       122     80  
    ------------------
    Stack Information:
    ------------------
    In C:\work\CompareNonemptyTablesExample.m (CompareNonemptyTablesExample) at 30

尽管表变量包含相同的数值数据,测试仍失败,因为 T1T2RowNames 属性具有不同值。要通过该测试,请设置 T1RowNames 属性。

T1.Properties.RowNames = LastName;
testCase.verifyThat(T1,IsEqualTo(T2, ...
    "Using",TableComparator(NumericComparator)))
Verification passed.

更改 T2 中的一个值,然后重新比较这些表。测试失败。

T2.Age(end) = 50;
testCase.verifyThat(T1,IsEqualTo(T2, ...
    "Using",TableComparator(NumericComparator)))
Verification failed.
    ---------------------
    Framework Diagnostic:
    ---------------------
    IsEqualTo failed.
    --> Path to failure: <Value>.Age
        --> NumericComparator failed.
            --> The numeric values are not equal using "isequaln".
            --> Failure table:
                    Index    Actual    Expected    Error    RelativeError
                    _____    ______    ________    _____    _____________
                                                                         
                      3        49         50        -1          -0.02    
            
            Actual Value:
                38
                40
                49
            Expected Value:
                38
                40
                50
    
    Actual Value:
      3×4 table
    
                 Age    Height    Weight    BloodPressure
                 ___    ______    ______    _____________
    
        Lin      38       64       131       125     83  
        Jones    40       67       133       117     75  
        Brown    49       64       119       122     80  
    Expected Value:
      3×4 table
    
                 Age    Height    Weight    BloodPressure
                 ___    ______    ______    _____________
    
        Lin      38       64       131       125     83  
        Jones    40       67       133       117     75  
        Brown    50       64       119       122     80  
    ------------------
    Stack Information:
    ------------------
    In C:\work\CompareNonemptyTablesExample.m (CompareNonemptyTablesExample) at 43

指定表变量中的对应值必须在绝对容差 1 的范围内相等。测试通过。

testCase.verifyThat(T1,IsEqualTo(T2, ...
    "Using",TableComparator( ...
    NumericComparator("Within",AbsoluteTolerance(1)))))
Verification passed.

修改表以包含嵌套表。要比较修改后的表,请指示 TableComparator 以递归方式运算。测试通过。

T1.BloodPressure = table([125;117;122],[83;75;80]);
T2 = T1;
testCase.verifyThat(T1,IsEqualTo(T2, ...
    "Using",TableComparator(NumericComparator,"Recursively",true)))
Verification passed.

提示

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

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

    import matlab.unittest.TestCase
    import matlab.unittest.constraints.IsEqualTo
    import matlab.unittest.constraints.TableComparator
    import matlab.unittest.constraints.NumericComparator
     
    testCase = TestCase.forInteractiveUse;
    exp = table([45;32;34],logical([1;0;0]),'VariableNames',["Age" "Vote"]); 
    act = exp;
    testCase.verifyThat(act,IsEqualTo(exp,"Using",TableComparator(NumericComparator)))
    

版本历史记录

在 R2017a 中推出