이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

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

이 예제에서는 파라미터화된 기본 테스트를 만드는 방법을 보여줍니다.

테스트할 함수 생성하기

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

function carpet = sierpinski(nLevels,classname)
if nargin == 1
    classname = 'single';
end

mSize = 3^nLevels;
carpet = ones(mSize,classname);

cutCarpet(1,1,mSize,nLevels) % 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 함수를 테스트하십시오.

classdef TestCarpet < matlab.unittest.TestCase

properties 블록 정의하기

파라미터화된 테스트에 사용되는 속성을 정의하십시오. TestCarpet 클래스에서 TestParameter 특성(Attribute)이 있는 속성 블록에서 이 속성을 정의하십시오.

    properties (TestParameter)
        type = {'single','double','uint16'};
        level = struct('small', 2,'medium', 4, 'large', 6);
        side = struct('small', 9, 'medium', 81,'large', 729);
    end

type 속성은 사용자가 테스트하려는 다른 데이터형을 포함합니다. level 속성은 사용자가 테스트하려는 다른 프랙털 레벨을 포함합니다. side 속성은 시에르핀스키 카펫(Sierpinski carpet) 행렬의 행과 열 개수를 포함하며 level 속성에 대응합니다. 각 파라미터화 값에 대해 의미 있는 이름을 제공할 수 있도록 levelside가 구조체로 정의되었습니다.

테스트 methods 블록 정의하기

TestCarpet 클래스에서 다음과 같은 테스트 메서드를 정의하십시오.

    methods (Test)
        function testRemainPixels(testCase, level)
            % expected number pixels equal to 1
            expPixelCount = 8^level;
            % actual number pixels equal to 1
            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

testRemainPixels 메서드는 특정 레벨에 대한 0이 아닌 픽셀의 개수가 예상되는 값과 같은지 확인하여 sierpinski 함수의 출력값을 테스트합니다. 이 메서드는 level 속성을 사용하며, 따라서 level의 값별로 하나씩, 즉 세 개의 테스트 요소를 만듭니다. testClass 메서드는 type 속성과 level 속성의 각 조합을 사용하여, sierpinski 함수에서 나오는 출력값의 클래스를 테스트합니다. 이 방식으로 9개의 테스트 요소가 만들어집니다. testDefaultL1Output 테스트 메서드는 TestParameter 속성을 사용하지 않으며, 따라서 이 메서드는 파라미터화되지 않습니다. 이 테스트 메서드는 레벨 1 행렬에 예상 값이 있다고 확인합니다. 이 테스트 메서드는 파라미터화되지 않으므로, 하나의 테스트 요소가 나옵니다.

위에 나온 테스트 메서드에서 Test methods 블록의 ParameterCombination 특성을 정의하지 않았습니다. 이 특성은 기본적으로 'exhaustive'입니다. 테스트 프레임워크가 각각의 테스트 파라미터 조합에 대해 한 번씩 지정 테스트 메서드를 불러옵니다.

ParameterCombination 특성이 있는 테스트 methods 블록 정의

sierpinski 함수의 행렬 출력값이 올바른 요소 개수를 가지도록 TestCarpet 클래스에서 다음과 같은 테스트 메서드를 정의하십시오. ParameterCombination 특성을 'sequential'로 설정하십시오.

    methods (Test, ParameterCombination='sequential')
        function testNumel(testCase, level, side)
            import matlab.unittest.constraints.HasElementCount
            testCase.verifyThat(sierpinski(level),...
                HasElementCount(side^2))
        end
    end
end

ParameterCombination 특성이 'sequential'로 설정된 테스트 메서드는 각 파라미터의 대응값에 대해 한 번씩 호출됩니다. level 속성과 side 속성이 가진 값의 개수는 같아야 합니다. 이들 속성에는 각각 값이 세 개씩 있기 때문에, testNumel 메서드를 세 번 불러옵니다.

TestCarpet 클래스 정의 요약

다음은 TestCarpet.m의 전체 내용입니다.

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)
            % expected number pixels equal to 1
            expPixelCount = 8^level;
            % actual number pixels equal to 1
            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으로부터 테스트 스위트를 만드십시오.

suite = matlab.unittest.TestSuite.fromFile('TestCarpet.m');
{suite.Name}'
ans = 

    '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'

이 모음에는 16개의 테스트 요소가 있습니다. 요소의 Name은 파라미터화를 나타냅니다.

suite.run;
Running TestCarpet
..........
......
Done TestCarpet
__________

small로 명명된 level 파라미터 속성을 가지고 테스트 실행하기

특정 파라미터화를 사용하는 테스트 요소를 선택하려면 TestSuiteselectIf 메서드를 사용하십시오. level 파라미터 속성 목록에서 파라미터 이름 small을 사용하는 테스트 요소를 모두 선택하십시오.

s1 = suite.selectIf('ParameterName','small');
{s1.Name}'
ans = 

    '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'));

참고 항목

| |

관련 항목