パラメーター化されたテストでの外部パラメーターの使用
この例では、テストで外部パラメーターを使用する方法を示します。外部パラメーターを使用することで、既存のクラスベースのテストに変数入力を挿入できます。(パラメーター化されたテストにより) テスト ファイル外で定義されたテスト データを反復的に使用するには、matlab.unittest.parameters.Parameter インスタンスの配列を作成してから、fromClass などの TestSuite 作成メソッドで名前と値の引数 ExternalParameters を使用します。
テストする関数の作成
この例を設定するには、現在のフォルダー内の cleanData.m という名前のファイルで cleanData 関数を定義します。この関数は数値配列を受け取り、クリーニングされて並べ替えられたバージョンの配列を返します。配列をベクトル化して、NaN、0、および 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.