Main Content

matlab.test.behavior.Missing クラス

名前空間: matlab.test.behavior
スーパークラス: matlab.unittest.TestCase

クラスが欠損値のコントラクトを満たすかどうかをテストする

説明

クラスの欠損値が MATLAB®欠損コントラクトを満たすかどうかテストするには、matlab.test.behavior.Missing クラスから派生させたテスト クラスを作成します。クラスがデータ型を表しており、MATLAB において、クラスの欠損値を組み込みクラスと同様に扱いたい場合、クラスが欠損コントラクトを満たしていることを確認してください。

通常、この動作テストは、テスト駆動型開発ワークフローの一部として使用します。クラスの欠損値が MATLAB の欠損コントラクトを満たすようにする場合、動作テストを記述して、テストにパスするまでテスト対象のクラスを変更します。たとえば、クラスが比較と順序付けをサポートし、欠損値インジケーターとして使用できる場合、すべてのテストがパスするばずです。クラスが順序付けをサポートしない場合、SupportsOrdering プロパティを false に設定します。これにより、順序付けに関連付けられたテストが MATLAB によって除外されます。

動作テストは matlab.test.behavior.Missing からのみ派生し、抽象プロパティを定義しなければなりません。ただし、matlab.test.behavior.Missingmatlab.unittest.TestCase のサブクラスであるため、ユニット テスト フレームワークの機能を使用できます。

クラスの属性

抽象型
true
HandleCompatible
true

クラス属性の詳細については、クラスの属性を参照してください。

プロパティ

すべて展開する

テスト クラスの properties ブロックに含まれるすべての抽象プロパティの値を定義します。

テスト対象クラスの欠損値。有効な MATLAB スカラー値または欠損値を返す式として指定します。

例: NaN

例: missing

例: ' '

属性:

SetAccess
public
GetAccess
public
抽象型
true

テスト対象クラスの非欠損値。有効な MATLAB スカラー値または非欠損値を返す式として指定します。通常、クラス コンストラクターが非欠損値を返す場合、PrototypeValue はコンストラクターの呼び出しです。

例: 0

例: datetime

属性:

SetAccess
public
GetAccess
public
抽象型
true

テスト対象クラスに変換できるクラス。クラス名の string ベクトルとして指定します。

クラスを他のクラスに変換してから元のクラスに戻すことができる場合、その元のクラスでは他のクラスからの変換がサポートされています。たとえば、MyClass(OtherClass(missing)) == MyClass(missing) である場合、OtherClass は変換がサポートされているクラスです。

例: "string"

例: ["double" "single"]

属性:

SetAccess
public
GetAccess
public
抽象型
true

必要に応じて、テスト クラスの TestClassSetup methods ブロックで、具象プロパティの値を再定義します。

クラスで比較がサポートされるかどうか。データ型 logical1 または 0 として返されます。比較がサポートされるクラスでは、== および ~= を使用できます。

SupportsComparisonfalse に設定した場合、MATLAB は仮定エラーによって比較と順序付けのテストをフィルターで除外します。MATLAB ではテストが実行されません。

属性:

SetAccess
protected
GetAccess
public

クラスで順序付けがサポートされるかどうか。データ型 logical1 または 0 として返されます。順序付けがサポートされるクラスでは、<><=、および >= を使用できます。

SupportsOrderingfalse に設定した場合、MATLAB は仮定エラーによって順序付けのテストをフィルターで除外します。MATLAB ではテストが実行されません。

属性:

SetAccess
protected
GetAccess
public

クラスが関数 ismissing で欠損値インジケーターとして使用可能かどうか。データ型 logical1 または 0 として返されます。

UsableAsMissingIndicatorfalse に設定した場合、MATLAB は仮定エラーによって関連付けられているテストをフィルターで除外します。MATLAB ではテストが実行されません。

属性:

SetAccess
protected
GetAccess
public

増加する配列に対してクラスが使用する埋め込み値。MATLAB スカラー値として返されます。既定では、FillValue の値は MissingValue プロパティの値と同じです。

例: 0

属性:

SetAccess
protected
GetAccess
public

R2023b 以降

非互換の値になるクラス コンストラクターの引数。cell ベクトルとして返されます。テスト対象クラスに該当するコンストラクターの引数がある場合、このプロパティを使用します。たとえば、datetime クラスでは、クラス コンストラクターの名前と値の引数 TimeZone が指定されているかどうかに対応する 2 つのカテゴリ (ゾーン付きの値とゾーンなしの値) がサポートされています。これらの値は非互換です。たとえば、ゾーン付きの値とゾーンなしの値の連結や比較はできません。非互換の値になる引数についてテストするには、ExtraConstructorArguments プロパティを設定します。

ExtraConstructorArguments プロパティを設定すると、MissingValue プロパティおよび PrototypeValue プロパティに割り当てる値では、ExtraConstructorArguments に指定されている引数を使用する必要があります。ExtraConstructorArguments プロパティを使用してテストする方法の例については、datetime クラスの動作テストの作成を参照してください。

例: {"TimeZone","Asia/Tokyo"}

属性:

SetAccess
protected
GetAccess
public

すべて折りたたむ

現在のフォルダー内に、欠損値をサポートする MyDataClass という名前のクラスを作成します。入力を指定せずにコンストラクターを呼び出すと、欠損値が返されます。

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

テストを実行し、結果を確認します。比較、順序付け、等価性、および ismissing への 2 番目の入力としての MyDataClass の使用に関するテストは失敗します。

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 ブロックで eqneltgtle、および ge を定義します。

        % 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.
...

等価性ルールを満たし、関数 ismissing の 2 番目の入力として受け入れられるように、MyDataClass を繰り返し更新します。MyDataClassmethods ブロックで isequalisequaln を定義します。

        % 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
__________

datetime クラスがゾーン付きとゾーンなしの両方の datetime 値について MATLAB の欠損コントラクトを満たしていることを確認するテストを作成します。ゾーン付きの datetime 値とは、作成時に名前と値の引数 TimeZone を指定して作成した値です。この例は説明のみを目的としています。実際には、ユーザー定義のクラスをテストします。

現在のフォルダーで、matlab.test.behavior.Missing のサブクラス化を行って MissingDatetimeTest テスト クラスを作成します。そのクラスが properties ブロックで継承する抽象プロパティを定義します。なお、MissingDatetimeTest クラスにはゾーンなしの datetime 値 (つまり、datetimeNaT) が含まれています。

classdef MissingDatetimeTest < matlab.test.behavior.Missing
    properties
        MissingValue = NaT
        PrototypeValue = datetime
        ClassesWithSupportedConversions = "string"
    end
end

MissingDatetimeTest テスト クラスを実行します。テストにパスします。これは、datetime クラスがゾーンなしの datetime 値に関する欠損コントラクトを満たしていることを示しています。

runtests("MissingDatetimeTest");
Running MissingDatetimeTest
..........
Done MissingDatetimeTest
__________

名前と値の引数 TimeZone を使用して作成した datetime 値は、ゾーンなしの値と非互換です。たとえば、ゾーン付きとゾーンなしの datetime 値を連結することはできません。コンストラクターの引数 TimeZone によって非互換の値が生じるため、datetime クラスがゾーン付きの値に関する欠損コントラクトも満たすことを確認する別の動作テストを作成します。現在のフォルダーで、matlab.test.behavior.Missing のサブクラス化を行って ZonedMissingDatetimeTest テスト クラスを作成します。抽象プロパティを定義し、TestClassSetup methods ブロックの ExtraConstructorArguments プロパティを設定することで、テスト対象のコンストラクターの引数をさらに指定します。MissingValue プロパティおよび PrototypeValue プロパティに割り当てる値では、ExtraConstructorArguments に指定されている名前と値の引数を使用する必要があります。

classdef ZonedMissingDatetimeTest < matlab.test.behavior.Missing
    properties
        MissingValue = NaT(TimeZone="Asia/Tokyo")
        PrototypeValue = datetime(2023,6,23,TimeZone="Asia/Tokyo")
        ClassesWithSupportedConversions = "string"
    end

    methods (TestClassSetup)
        function zonedDatetimeConstructorArgs(testCase)
            testCase.ExtraConstructorArguments = {"TimeZone","Asia/Tokyo"};
        end
    end
end

ZonedMissingDatetimeTest テスト クラスを実行します。テストにパスします。これは、datetime クラスがゾーン付きの datetime 値に関する欠損コントラクトも満たしていることを示しています。

runtests("ZonedMissingDatetimeTest");
Running ZonedMissingDatetimeTest
..........
Done ZonedMissingDatetimeTest
__________

詳細

すべて展開する

バージョン履歴

R2018b で導入

すべて展開する