メインコンテンツ

パラメーター化されたテストでの外部パラメーターの使用

この例では、テストで外部パラメーターを使用する方法を示します。外部パラメーターを使用することで、既存のクラスベースのテストに変数入力を挿入できます。(パラメーター化されたテストにより) テスト ファイル外で定義されたテスト データを反復的に使用するには、matlab.unittest.parameters.Parameter インスタンスの配列を作成してから、fromClass などの TestSuite 作成メソッドで名前と値の引数 ExternalParameters を使用します。

テストする関数の作成

この例を設定するには、現在のフォルダー内の cleanData.m という名前のファイルで cleanData 関数を定義します。この関数は数値配列を受け取り、クリーニングされて並べ替えられたバージョンの配列を返します。配列をベクトル化して、NaN0、および Inf のエントリを削除した後、最後にベクトルを並べ替えます。

function Y = cleanData(X)
    Y = X(:);         % Vectorize array
    Y = rmmissing(Y); % Remove NaN
    % Remove 0 and Inf
    idx = (Y==0 | Y==Inf);
    Y = Y(~idx);
    % If array is empty, set to eps
    if isempty(Y)
        Y = eps;
    end
    Y = sort(Y);      % Sort vector
end

パラメーター化されたテスト クラスの作成

関数 cleanData をテストする、パラメーター化されたテストを作成します。テストでは、properties ブロックで定義されている 2 つのデータ セットに対し、4 つの Test メソッドをそれぞれ繰り返します。

classdef TestClean < matlab.unittest.TestCase
    properties (TestParameter)
        Data = struct("clean",[5 3 9; 1 42 5; 32 5 2], ...
            "needsCleaning",[1 13; NaN 0; Inf 42]);
    end
    methods (Test)
        function classCheck(testCase,Data)
            act = cleanData(Data);
            testCase.assertClass(act,"double")
        end
        function sortCheck(testCase,Data)
            act = cleanData(Data);
            testCase.verifyTrue(issorted(act))
        end
        function finiteCheck(testCase,Data)
            import matlab.unittest.constraints.IsFinite
            act = cleanData(Data);
            testCase.verifyThat(act,IsFinite)
        end
        function noZeroCheck(testCase,Data)
            import matlab.unittest.constraints.EveryElementOf
            import matlab.unittest.constraints.IsEqualTo
            act = cleanData(Data);
            testCase.verifyThat(EveryElementOf(act),~IsEqualTo(0))
        end
    end    
end

テストを実行します。テスト フレームワークでは、テスト ファイルで定義されたデータを使用して 8 つのパラメーター化されたテストが実行されます。

import matlab.unittest.TestSuite
suite = TestSuite.fromClass(?TestClean);
results = suite.run;
table(results)
Running TestClean
........
Done TestClean
__________


ans =

  8×6 table

                        Name                         Passed    Failed    Incomplete    Duration       Details   
    _____________________________________________    ______    ______    __________    _________    ____________

    {'TestClean/classCheck(Data=clean)'         }    true      false       false         0.26906    {1×1 struct}
    {'TestClean/classCheck(Data=needsCleaning)' }    true      false       false         0.00675    {1×1 struct}
    {'TestClean/sortCheck(Data=clean)'          }    true      false       false       0.0064565    {1×1 struct}
    {'TestClean/sortCheck(Data=needsCleaning)'  }    true      false       false        0.002454    {1×1 struct}
    {'TestClean/finiteCheck(Data=clean)'        }    true      false       false         0.03521    {1×1 struct}
    {'TestClean/finiteCheck(Data=needsCleaning)'}    true      false       false       0.0034009    {1×1 struct}
    {'TestClean/noZeroCheck(Data=clean)'        }    true      false       false          1.5687    {1×1 struct}
    {'TestClean/noZeroCheck(Data=needsCleaning)'}    true      false       false       0.0082732    {1×1 struct}

外部パラメーターの定義

テスト ファイルの外部にデータ セットを作成します。

A = [NaN 2 0; 1 Inf 3];

外部データ セットから Parameter インスタンスの配列を作成します。fromData 静的メソッドは、パラメーター化プロパティの名前を TestClean 内の properties ブロックから、また新しいデータを cell 配列 (またはスカラー構造体) として受け入れます。

import matlab.unittest.parameters.Parameter
newData = {A};
param = Parameter.fromData("Data",newData);

外部パラメーターを使用して、新しいテスト スイートを作成します。フレームワークにより文字 #ext がパラメーター名の末尾に追加され、そのパラメーターが外部で定義されていることを示します。

suite1 = TestSuite.fromClass(?TestClean,ExternalParameters=param);
{suite1.Name}'
ans =

  4×1 cell array

    {'TestClean/classCheck(Data=2x3_double#ext)' }
    {'TestClean/sortCheck(Data=2x3_double#ext)'  }
    {'TestClean/finiteCheck(Data=2x3_double#ext)'}
    {'TestClean/noZeroCheck(Data=2x3_double#ext)'}

スイート内のパラメーター名を完全に制御するには、構造体を使用してパラメーターを定義します。次に、テストを実行します。

newData = struct("commandLineData",A);
param = Parameter.fromData("Data",newData);
suite2 = TestSuite.fromClass(?TestClean,ExternalParameters=param);
{suite2.Name}'
results = suite2.run;
ans =

  4×1 cell array

    {'TestClean/classCheck(Data=commandLineData#ext)' }
    {'TestClean/sortCheck(Data=commandLineData#ext)'  }
    {'TestClean/finiteCheck(Data=commandLineData#ext)'}
    {'TestClean/noZeroCheck(Data=commandLineData#ext)'}

Running TestClean
....
Done TestClean
__________

さまざまなデータ セットを使用したテスト

ASCII 区切りファイルに保存される別のデータ セットを作成します。

B = rand(3);
B(2,4) = 0;
writematrix(B,"myFile.dat")
clear B

保存されたデータ セットと A からパラメーターを作成し、続いてテスト スイートを作成します。

newData = struct("commandLineData",A,"storedData",readmatrix("myFile.dat"));
param = Parameter.fromData("Data",newData);
suite3 = TestSuite.fromClass(?TestClean,ExternalParameters=param);

テスト ファイル内および外部で定義されたパラメーターを使用してテストを実行するには、テスト スイートを連結します。スイート要素名を表示し、テストを実行します。

suite4 = [suite suite3];
{suite4.Name}'
results = suite4.run;
ans =

  16×1 cell array

    {'TestClean/classCheck(Data=clean)'               }
    {'TestClean/classCheck(Data=needsCleaning)'       }
    {'TestClean/sortCheck(Data=clean)'                }
    {'TestClean/sortCheck(Data=needsCleaning)'        }
    {'TestClean/finiteCheck(Data=clean)'              }
    {'TestClean/finiteCheck(Data=needsCleaning)'      }
    {'TestClean/noZeroCheck(Data=clean)'              }
    {'TestClean/noZeroCheck(Data=needsCleaning)'      }
    {'TestClean/classCheck(Data=commandLineData#ext)' }
    {'TestClean/classCheck(Data=storedData#ext)'      }
    {'TestClean/sortCheck(Data=commandLineData#ext)'  }
    {'TestClean/sortCheck(Data=storedData#ext)'       }
    {'TestClean/finiteCheck(Data=commandLineData#ext)'}
    {'TestClean/finiteCheck(Data=storedData#ext)'     }
    {'TestClean/noZeroCheck(Data=commandLineData#ext)'}
    {'TestClean/noZeroCheck(Data=storedData#ext)'     }

Running TestClean
........
Done TestClean
__________

Running TestClean
........
Done TestClean
__________

空のプロパティ値の使用

R2026a 以降では、パラメーター化プロパティに、空の cell 配列やフィールドをもたないスカラー構造体を含めることができます。説明用として、空の cell 配列を使用してパラメーターを定義します。fromData 静的メソッドは matlab.unittest.parameters.NullParameter オブジェクトを返します。

newData = {};
param = Parameter.fromData("Data",newData)
param = 

  NullParameter with properties:

    Property: 'Data'
        Name: ''
       Value: {1×0 cell}

NullParameter インスタンスを外部パラメーターとして使用してテスト スイートを作成する場合、フレームワークはそのパラメーターに関連付けられたすべてのテストを自動的に除外します。この例では、TestClean クラス内のすべてのテストが NullParameter インスタンスによってデータ値なしと指定された Data プロパティに依存しているため、結果のテスト スイートは空になります。

suite5 = TestSuite.fromClass(?TestClean,ExternalParameters=param)
suite5 = 

  1×0 Test array with properties:

    Name
    ProcedureName
    TestClass
    BaseFolder
    Parameterization
    SharedTestFixtures
    Tags

Tests Include:
    0 Parameterizations, 0 Shared Test Fixture Classes, 0 Tags, 0 TestRequirements schedules.

参考

関数

クラス

トピック