Main Content

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

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

関数 cleanData を作成します。この関数は配列を受け入れ、配列をベクトル化し、0NaNInf を削除してから配列を並べ替えます。

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
__________

参考

|

関連するトピック