基本的なパラメーター化テストの作成
この例では、パラメーター化テストを作成して、値、クラスおよびサイズについて関数の出力をテストします。
テストする関数の作成
現在のフォルダー内のファイル sierpinski.m に関数を作成します。この関数は、Sierpinski カーペット フラクタルのイメージを示す行列を返します。これは、フラクタル レベルとオプションのデータ型を入力として受け取ります。
function carpet = sierpinski(levels,classname) if nargin == 1 classname = 'single'; end msize = 3^levels; carpet = ones(msize,classname); cutCarpet(1,1,msize,levels) % Begin recursion function cutCarpet(x,y,s,cl) if cl ss = s/3; % Define subsize for lx = 0:2 for ly = 0:2 if lx == 1 && ly == 1 % Remove center square carpet(x+ss:x+2*ss-1,y+ss:y+2*ss-1) = 0; else % Recurse cutCarpet(x+lx*ss,y+ly*ss,ss,cl-1) end end end end end end
TestCarpet テスト クラスの作成
現在のフォルダー内のファイルに、関数 sierpinski をテストする TestCarpet クラスを作成します。TestParameter 属性をもつ properties ブロック内に、パラメーター化テストに使用するプロパティを定義します。
classdef TestCarpet < matlab.unittest.TestCase properties (TestParameter) type = {'single','double','uint16'}; level = struct('small',2,'medium',4,'large',6); side = struct('small',9,'medium',81,'large',729); end end
type プロパティには、テストするさまざまなデータ型があります。level プロパティには、テストするさまざまなフラクタル レベルがあります。side プロパティには、level プロパティに対応する Sierpinski カーペット行列の行数と列数があります。
Test methods ブロックの定義
Test 属性をもつ methods ブロック内に次の 3 つのテスト メソッドを定義します。
testRemainPixelsメソッドは、非ゼロのピクセル数が特定のレベルで予想される数と等しいかを検証することにより、関数sierpinskiの出力をテストします。このメソッドはlevelプロパティを使用し、その結果、levelの値ごとに 3 つのテスト要素が検出されます。testClassメソッドは、typeとlevelのパラメーター値の組み合わせ (つまり網羅的なパラメーターの組み合わせ) を使用して、関数sierpinskiからの出力のクラスをテストします。このメソッドのテスト要素は 9 個になります。testDefaultL1Outputメソッドは、TestParameterプロパティを使用しないため、パラメーター化されません。このメソッドはレベル 1 の行列が予期した値をもつことを検証します。テスト メソッドはパラメーター化されないため、テスト要素は 1 つになります。
classdef TestCarpet < matlab.unittest.TestCase properties (TestParameter) type = {'single','double','uint16'}; level = struct('small',2,'medium',4,'large',6); side = struct('small',9,'medium',81,'large',729); end methods (Test) function testRemainPixels(testCase,level) expPixelCount = 8^level; actPixels = find(sierpinski(level)); testCase.verifyNumElements(actPixels,expPixelCount) end function testClass(testCase,type,level) testCase.verifyClass( ... sierpinski(level,type),type) end function testDefaultL1Output(testCase) exp = single([1 1 1; 1 0 1; 1 1 1]); testCase.verifyEqual(sierpinski(1),exp) end end end
ParameterCombination 属性を含む Test methods ブロックの定義
関数 sierpinski によって返された行列が正しい要素数をもつことを確認する testNumel メソッドを定義します。このメソッドの ParameterCombination 属性を 'sequential' に設定します。level プロパティと side プロパティはそれぞれ 3 つのパラメーター値を指定するため、testNumel メソッドは 3 回、つまり、'small' 値、'medium' 値および 'large' 値のそれぞれについて 1 回呼び出されます。
classdef TestCarpet < matlab.unittest.TestCase properties (TestParameter) type = {'single','double','uint16'}; level = struct('small',2,'medium',4,'large',6); side = struct('small',9,'medium',81,'large',729); end methods (Test) function testRemainPixels(testCase,level) expPixelCount = 8^level; actPixels = find(sierpinski(level)); testCase.verifyNumElements(actPixels,expPixelCount) end function testClass(testCase,type,level) testCase.verifyClass( ... sierpinski(level,type),type) end function testDefaultL1Output(testCase) exp = single([1 1 1; 1 0 1; 1 1 1]); testCase.verifyEqual(sierpinski(1),exp) end end methods (Test, ParameterCombination = 'sequential') function testNumel(testCase,level,side) import matlab.unittest.constraints.HasElementCount testCase.verifyThat(sierpinski(level), ... HasElementCount(side^2)) end end end
すべてのテストの実行
コマンド プロンプトで、TestCarpet.m からスイートを作成します。スイートには 16 個のテスト要素があります。MATLAB® は、パラメーター化の情報をスイート要素の名前に含めます。
suite = matlab.unittest.TestSuite.fromFile('TestCarpet.m');
{suite.Name}'
ans =
16×1 cell array
{'TestCarpet/testNumel(level=small,side=small)' }
{'TestCarpet/testNumel(level=medium,side=medium)'}
{'TestCarpet/testNumel(level=large,side=large)' }
{'TestCarpet/testRemainPixels(level=small)' }
{'TestCarpet/testRemainPixels(level=medium)' }
{'TestCarpet/testRemainPixels(level=large)' }
{'TestCarpet/testClass(type=single,level=small)' }
{'TestCarpet/testClass(type=single,level=medium)'}
{'TestCarpet/testClass(type=single,level=large)' }
{'TestCarpet/testClass(type=double,level=small)' }
{'TestCarpet/testClass(type=double,level=medium)'}
{'TestCarpet/testClass(type=double,level=large)' }
{'TestCarpet/testClass(type=uint16,level=small)' }
{'TestCarpet/testClass(type=uint16,level=medium)'}
{'TestCarpet/testClass(type=uint16,level=large)' }
{'TestCarpet/testDefaultL1Output' }
テストを実行します。
suite.run
Running TestCarpet
.......... ......
Done TestCarpet
__________
ans =
1×16 TestResult array with properties:
Name
Passed
Failed
Incomplete
Duration
Details
Totals:
16 Passed, 0 Failed, 0 Incomplete.
2.459 seconds testing time.
level プロパティに 'small' が指定されたテストの実行
特定のパラメーター化を使用するテスト要素を選択するには、TestSuite の selectIf メソッドを使用します。level パラメーター化プロパティのリストから、パラメーター名 'small' を使用するテスト要素をすべて選択します。フィルター処理されたスイートには 5 つの要素があります。
s1 = suite.selectIf('ParameterName','small'); {s1.Name}'
ans =
5×1 cell array
{'TestCarpet/testNumel(level=small,side=small)' }
{'TestCarpet/testRemainPixels(level=small)' }
{'TestCarpet/testClass(type=single,level=small)'}
{'TestCarpet/testClass(type=double,level=small)'}
{'TestCarpet/testClass(type=uint16,level=small)'}
フィルター処理されたテスト スイートを実行します。
s1.run;
Running TestCarpet ..... Done TestCarpet __________
あるいは、TestSuite の fromFile メソッドを使用して、同じテスト スイートを直接作成できます。
import matlab.unittest.selectors.HasParameter s1 = matlab.unittest.TestSuite.fromFile('TestCarpet.m', ... HasParameter('Name','small'));
参考
matlab.unittest.TestCase | matlab.unittest.selectors.HasParameter | matlab.unittest.TestSuite