Main Content

파라미터화된 기본 테스트 생성하기

이 예제에서는 파라미터화된 테스트를 만들어 값, 클래스 및 크기에 대한 함수의 출력을 테스트하는 방법을 보여줍니다.

테스트할 함수 생성하기

현재 폴더의 sierpinski.m 파일에 함수를 만듭니다. 이 함수는 시에르핀스키 카펫(Sierpinski carpet) 프랙털의 이미지를 나타내는 행렬을 반환합니다. 입력값으로 프랙털 레벨과 데이터형(선택 사항)을 받습니다.

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 테스트 클래스 생성하기

현재 폴더의 파일에 TestCarpet 클래스를 만들어 sierpinski 함수를 테스트합니다. 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 속성은 시에르핀스키 카펫(Sierpinski carpet) 행렬의 행과 열 개수를 포함하며 level 속성에 대응합니다.

테스트 methods 블록 정의하기

Test 특성이 있는 methods 블록에서 다음 세 개의 테스트 메서드를 정의합니다.

  • testRemainPixels 메서드는 특정 레벨에 대한 0이 아닌 픽셀의 개수가 예상되는 값과 같은지 확인하여 sierpinski 함수의 출력값을 테스트합니다. 이 메서드는 level 속성을 사용하며, 따라서 level의 값별로 하나씩, 즉 세 개의 테스트 요소를 만듭니다.

  • testClass 메서드는 type 파라미터 값과 level 파라미터 값의 각 조합(즉, 파라미터 완전 조합)을 사용하여, sierpinski 함수에서 나오는 출력값의 클래스를 테스트합니다. 이 메서드로 9개의 테스트 요소가 만들어집니다.

  • testDefaultL1Output 메서드는 TestParameter 속성을 사용하지 않으며, 따라서 이 메서드는 파라미터화되지 않습니다. 이 메서드는 레벨 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 특성이 있는 테스트 methods 블록 정의

sierpinski 함수에서 반환된 행렬이 올바른 요소 수를 갖는지 확인하기 위한 testNumel 메서드를 정의합니다. 메서드에 대한 ParameterCombination 특성을 'sequential'로 설정합니다. level 속성과 side 속성이 각각 세 개의 파라미터 값을 지정하므로 testNumel 메서드는 'small' 값, 'medium' 값, 'large' 값에 대해 각각 한 번씩, 총 세 번 호출됩니다.

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.

'small'로 명명된 level 속성을 가지고 테스트 실행하기

특정 파라미터화를 사용하는 테스트 요소를 선택하려면 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'));

참고 항목

| |

관련 항목