Main Content

基本的なパラメーター化テストの作成

この例では、パラメーター化テストを作成して、値、クラスおよびサイズについて関数の出力をテストします。

テストする関数の作成

現在のフォルダー内のファイル 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 メソッドは、typelevel のパラメーター値の組み合わせ (つまり網羅的なパラメーターの組み合わせ) を使用して、関数 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' が指定されたテストの実行

特定のパラメーター化を使用するテスト要素を選択するには、TestSuiteselectIf メソッドを使用します。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
__________

あるいは、TestSuitefromFile メソッドを使用して、同じテスト スイートを直接作成できます。

import matlab.unittest.selectors.HasParameter
s1 = matlab.unittest.TestSuite.fromFile('TestCarpet.m', ...
    HasParameter('Name','small'));

参考

| |

関連するトピック