パラメーター化されたテストでの外部パラメーターの使用
既存のクラスベースのテストに変数入力を挿入できます。テスト ファイル外で定義され、テストで (パラメーター化されたテストにより) 反復使用されると想定されるテスト データを提供するには、Parameter
インスタンスの配列を作成してから、fromClass
などの TestSuite
作成メソッドで名前と値の引数 ExternalParameters
を使用します。
関数 cleanData
を作成します。この関数は配列を受け入れ、配列をベクトル化し、0
、NaN
、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
suite1 = TestSuite.fromClass(?TestClean);
results = suite1.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.66469 {1×1 struct} {'TestClean/classCheck(Data=needsCleaning)' } true false false 0.0066959 {1×1 struct} {'TestClean/sortCheck(Data=clean)' } true false false 0.0039298 {1×1 struct} {'TestClean/sortCheck(Data=needsCleaning)' } true false false 0.003343 {1×1 struct} {'TestClean/finiteCheck(Data=clean)' } true false false 0.055924 {1×1 struct} {'TestClean/finiteCheck(Data=needsCleaning)'} true false false 0.0017951 {1×1 struct} {'TestClean/noZeroCheck(Data=clean)' } true false false 0.90772 {1×1 struct} {'TestClean/noZeroCheck(Data=needsCleaning)'} true false false 0.007801 {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
がパラメーター名の末尾に追加され、そのパラメーターが外部で定義されていることを示します。
suite2 = TestSuite.fromClass(?TestClean,"ExternalParameters",param);
{suite2.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")); param2 = Parameter.fromData("Data",newData); suite3 = TestSuite.fromClass(?TestClean,"ExternalParameters",param2);
テスト ファイル内および外部で定義されたパラメーターを使用してテストを実行するには、テスト スイートを連結します。スイート要素名を表示し、テストを実行します。
suite = [suite1 suite3]; {suite.Name}' results = suite.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 __________
参考
matlab.unittest.TestSuite
| matlab.unittest.parameters.Parameter.fromData