Main Content

matlab.test.behavior.Missing 类

包: matlab.test.behavior
超类: matlab.unittest.TestCase

测试类是否满足 missing 值的契约

自 R2018b 起

说明

要测试类的 missing 值是否满足 MATLAB® 中的缺失值契约,请创建一个派生自 matlab.test.behavior.Missing 类的测试类。如果您的类表示一种数据类型,并且您要 MATLAB 对该类的 missing 值的处理方式类似于内置类,请确保您的类满足 missing 契约。

通常,您将行为测试用作测试驱动的开发工作流的一部分。如果希望类的缺失值满足 MATLAB 中的缺失值契约,请编写行为测试并修改待测类,直到测试结果符合您的预期。例如,如果您的类支持比较和排序,并且可用作缺失值指示符,则所有测试都应该通过。如果您的类不支持排序,请将 SupportsOrdering 属性设置为 false,MATLAB 应该会滤除与排序相关的测试。

您的行为测试只能从 matlab.test.behavior.Missing 派生并且必须定义 abstract 属性。但是,由于 matlab.test.behavior.Missingmatlab.unittest.TestCase 的子类,因此您可以使用单元测试框架的功能。

类属性

Abstract
true
HandleCompatible
true

有关类属性的信息,请参阅类属性

属性

全部展开

在测试类的 properties 块中定义所有 abstract 属性的值。

待测类的缺失值,指定为有效的 MATLAB 标量值或返回非缺失值的表达式。

示例: NaNmissing' '

属性:

SetAccess
public
GetAccess
public
Abstract
true

待测类的任何非缺失值,指定为有效的 MATLAB 标量值或返回非缺失值的表达式。通常,如果类构造函数返回非缺失值,则 PrototypeValue 是对构造函数的调用。

示例: 0 或 datetime

属性:

SetAccess
public
GetAccess
public
Abstract
true

可转换为待测类的类的列表,指定为类名的字符串数组。

如果您可以转换为其他类,然后转换回您的类,则您的类支持从其他类转换。例如,如果 MyClass(OtherClass(missing)) == MyClass(missing),则 OtherClass 是支持转换的类。

示例: "string"["double","single"]

属性:

SetAccess
public
GetAccess
public
Abstract
true

数据类型: string

如有必要,请在您的测试类的 TestClassSetup 方法块中重新定义函数中具体属性的值。

类支持比较的指示符,指定为 truefalse。支持比较的类允许使用 ==~=

如果将 SupportsComparison 设置为 false,则假设失败应该会滤除比较和排序测试。MATLAB 不运行这些测试。

属性:

SetAccess
protected
GetAccess
public

数据类型: logical

类支持排序的指示符,指定为 truefalse。支持排序的类允许使用 <><=>=

如果将 SupportsOrdering 设置为 false,则假设失败时会滤除相关联的测试。MATLAB 不会运行这些测试。

属性:

SetAccess
protected
GetAccess
public

数据类型: logical

指示类可用作 ismissing 函数的缺失值的指示符,指定为 truefalse

如果将 UsableAsMissingIndicator 设置为 false,则假设失败时会滤除相关联的测试。MATLAB 不会运行这些测试。

属性:

SetAccess
protected
GetAccess
public

数据类型: logical

类用于增大数组的填充值,指定为有效的 MATLAB 标量值。默认情况下,FillValue 的值与 MissingValue 属性的值相同。

示例: 0

属性:

SetAccess
protected
GetAccess
public

示例

全部折叠

创建可包含缺失值的 MyDataClass 类。该类支持比较和排序,缺失值实现应满足 MATLAB 中的缺失值契约。如果在没有输入的情况下调用构造函数,则返回缺失值。

classdef MyDataClass
    properties
        SomeData;
        MissingVal = false;
    end
    
    methods
        function obj = MyDataClass(value)
            if nargin
                m = size(value,1);
                n = size(value,2);
                for i = 1:m
                    for j = 1:n
                        if ismissing(value(i,j))
                            obj(i,j).MissingVal = true;
                        else
                            obj(i,j).SomeData = value(i,j);
                            obj(i,j).MissingVal = false;
                        end
                    end
                end
            else
                obj.MissingVal = true;
            end
        end
        
        % Define ismissing behavior
        function m = ismissing(obj,v)
            if nargin > 1
                m = isequaln(obj,v);
            else
                m = [obj.MissingVal];
            end
            m = reshape(m,size(obj));
        end
    end
end

要创建一个简单测试类来检查 MyDataClass 是否满足缺失值契约,请子类化 matlab.test.behavior.Missing。测试可以使用单元测试框架的功能,但 MissingValueTest 仅检查缺失值契约。

classdef MissingValueTest < matlab.test.behavior.Missing
    properties
        MissingValue = MyDataClass;
        PrototypeValue = MyDataClass(7);
        ClassesWithSupportedConversions = [];
    end
end

运行测试并查看结果。用于比较、排序、检测相等性以及使用 MyDataClass 作为 ismissing 的第二个输入的测试失败。

results = runtests('MissingValueTest');
Running MissingValueTest
....
================================================================================
Error occurred in MissingValueTest/comparison and it did not run to completion.

    ---------
    Error ID:
    ---------
    'MATLAB:UndefinedFunction'

    --------------
    Error Details:
    --------------
    Undefined function 'eq' for input arguments of type 'MyDataClass'.
    
    Error in matlab.test.behavior.Missing/comparison (line 129)
                testCase.verifyFalse(testCase.MissingValue == testCase.MissingValue,
                getString(message('MATLAB:test:behavior:missing:EqualFalse')));
================================================================================
.
================================================================================
Error occurred in MissingValueTest/ordering and it did not run to completion.

    ---------
    Error ID:
    ---------
    'MATLAB:UndefinedFunction'

    --------------
    Error Details:
    --------------
    Undefined function 'lt' for input arguments of type 'MyDataClass'.
    
    Error in matlab.test.behavior.Missing/ordering (line 136)
                testCase.verifyFalse(testCase.MissingValue < testCase.MissingValue,
                getString(message('MATLAB:test:behavior:missing:LessThanFalse')));
================================================================================
.
================================================================================
Verification failed in MissingValueTest/isequalRules.

    ----------------
    Test Diagnostic:
    ----------------
    isequal(MissingValue, MissingValue) must return false, because all missing values are unequal.

    ---------------------
    Framework Diagnostic:
    ---------------------
    verifyFalse failed.
    --> The value must evaluate to "false".
    
    Actual Value:
      logical
    
       1

    ------------------
    Stack Information:
    ------------------
    In <matlabroot>\toolbox\matlab\datatypes\+matlab\+test\+behavior\Missing.m (Missing.isequalRules) at 145
================================================================================

================================================================================
Verification failed in MissingValueTest/isequalRules.

    ----------------
    Test Diagnostic:
    ----------------
    isequaln(MissingValue, missing) must return true.

    ---------------------
    Framework Diagnostic:
    ---------------------
    verifyTrue failed.
    --> The value must evaluate to "true".
    
    Actual Value:
      logical
    
       0

    ------------------
    Stack Information:
    ------------------
    In <matlabroot>\toolbox\matlab\datatypes\+matlab\+test\+behavior\Missing.m (Missing.isequalRules) at 147
================================================================================
.
================================================================================
Verification failed in MissingValueTest/IsMissing2ndInput.

    ----------------
    Test Diagnostic:
    ----------------
    ismissing(MissingValue, missing) must return true.

    ---------------------
    Framework Diagnostic:
    ---------------------
    verifyTrue failed.
    --> The value must evaluate to "true".
    
    Actual Value:
      logical
    
       0

    ------------------
    Stack Information:
    ------------------
    In <matlabroot>\toolbox\matlab\datatypes\+matlab\+test\+behavior\Missing.m (Missing.IsMissing2ndInput) at 154
================================================================================
...
Done MissingValueTest
__________

Failure Summary:

     Name                                Failed  Incomplete  Reason(s)
    =================================================================================
     MissingValueTest/comparison           X         X       Errored.
    ---------------------------------------------------------------------------------
     MissingValueTest/ordering             X         X       Errored.
    ---------------------------------------------------------------------------------
     MissingValueTest/isequalRules         X                 Failed by verification.
    ---------------------------------------------------------------------------------
     MissingValueTest/IsMissing2ndInput    X                 Failed by verification.

以迭代方式更新 MyDataClass 以满足缺失值契约。要满足比较和排序,请在 MyDataClassmethods 块中定义 eqneltgtlege

        % Class supports comparison
        function tf = eq(obj1,obj2)
            tf = ~any(ismissing([obj1 obj2])) && eq(obj1.SomeData,obj2.SomeData);
        end
        function tf = ne(obj1,obj2)
            tf = ~eq(obj1,obj2);
        end
        
        % Class supports ordering
        function tf = lt(obj1,obj2)
            tf = ~any(ismissing([obj1 obj2])) && lt(obj1.SomeData,obj2.SomeData);
        end
        function tf = gt(obj1,obj2)
            tf = lt(obj2,obj1);
        end   
        function tf = le(obj1,obj2)
            tf = ~any(ismissing([obj1 obj2])) && ~gt(obj1,obj2);
        end
        function tf = ge(obj1,obj2)
            tf = le(obj2,obj1);
        end

使用简洁级别输出详细信息运行测试并查看结果。

results = runtests('MissingValueTest','OutputDetail',1);
......
FAIL: MissingValueTest/isequalRules in Missing.isequalRules at 145 :: verifyFalse failed.

FAIL: MissingValueTest/isequalRules in Missing.isequalRules at 147 :: verifyTrue failed.
.
FAIL: MissingValueTest/IsMissing2ndInput in Missing.IsMissing2ndInput at 154 :: verifyTrue failed.
...

以迭代方式更新 MyDataClass 以满足相等性规则。在 MyDataClassmethods 块中定义 isqualisequaln

        % Class supports isequal/isequaln rules
        function tf = isequal(obj1,obj2)
            tf = eq(obj1,obj2);
        end
        function tf = isequaln(obj1,obj2)
            tf = all(ismissing([obj1 obj2])) || eq(obj1,obj2);
        end

运行测试并查看结果。测试通过,MyDataClass 满足缺失值契约。

results = runtests('MissingValueTest');
Running MissingValueTest
..........
Done MissingValueTest
__________

详细信息

全部展开

版本历史记录

在 R2018b 中推出