Main Content

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

이 예제에서는 TestClassSetup, TestMethodSetup, Test methods 블록에서 파라미터화된 테스트를 생성하는 방법을 보여줍니다. 예제 테스트 클래스는 난수 생성을 테스트합니다.

TestRand 테스트 클래스 생성하기

현재 폴더의 파일에서 TestRand 클래스를 만들어 난수 생성의 다양한 측면을 테스트합니다. 파라미터화된 테스트에 사용되는 속성을 정의하십시오.

classdef TestRand < matlab.unittest.TestCase
    properties (ClassSetupParameter)
        generator = {'twister','combRecursive','multFibonacci'};
    end
    
    properties (MethodSetupParameter)
        seed = {0,123,4294967295};
    end
    
    properties (TestParameter)
        dim1 = struct('small',1,'medium',2,'large',3);
        dim2 = struct('small',2,'medium',3,'large',4);
        dim3 = struct('small',3,'medium',4,'large',5);
        type = {'single','double'};
    end
end

TestRand 클래스에서 각 properties 블록은 특정 수준의 파라미터화에 해당합니다. 클래스 설정 수준의 파라미터화는 난수 생성기의 유형을 정의합니다. 메서드 설정 수준의 파라미터화는 난수 생성기의 시드값을 정의하고, 테스트 수준의 파라미터화는 난수 값의 데이터형과 크기를 정의합니다.

테스트 클래스 설정 메서드 및 테스트 메서드 설정 메서드 정의하기

테스트 클래스 레벨과 테스트 메서드 레벨에서 설정 메서드를 정의하십시오. 이 메서드는 초기 난수 생성기 상태를 등록합니다. 프레임워크가 테스트를 실행한 후, 이 메서드가 원래 상태를 복원합니다. classSetup 메서드는 난수 생성기 유형을 정의하고, methodSetup 메서드는 생성기에 시드값(Seed)을 지정합니다.

classdef TestRand < matlab.unittest.TestCase
    properties (ClassSetupParameter)
        generator = {'twister','combRecursive','multFibonacci'};
    end
    
    properties (MethodSetupParameter)
        seed = {0,123,4294967295};
    end
    
    properties (TestParameter)
        dim1 = struct('small',1,'medium',2,'large',3);
        dim2 = struct('small',2,'medium',3,'large',4);
        dim3 = struct('small',3,'medium',4,'large',5);
        type = {'single','double'};
    end
    
    methods (TestClassSetup)
        function classSetup(testCase,generator)
            orig = rng;
            testCase.addTeardown(@rng,orig)
            rng(0,generator)
        end
    end
    
    methods (TestMethodSetup)
        function methodSetup(testCase,seed)
            orig = rng;
            testCase.addTeardown(@rng,orig)
            rng(seed)
        end
    end
end

순차적 파라미터 조합으로 테스트 메서드 정의하기

TestParameterCombination = 'sequential' 특성이 있는 methods 블록에서 testSize 메서드를 정의합니다.

classdef TestRand < matlab.unittest.TestCase
    properties (ClassSetupParameter)
        generator = {'twister','combRecursive','multFibonacci'};
    end
    
    properties (MethodSetupParameter)
        seed = {0,123,4294967295};
    end
    
    properties (TestParameter)
        dim1 = struct('small',1,'medium',2,'large',3);
        dim2 = struct('small',2,'medium',3,'large',4);
        dim3 = struct('small',3,'medium',4,'large',5);
        type = {'single','double'};
    end
    
    methods (TestClassSetup)
        function classSetup(testCase,generator)
            orig = rng;
            testCase.addTeardown(@rng,orig)
            rng(0,generator)
        end
    end
    
    methods (TestMethodSetup)
        function methodSetup(testCase,seed)
            orig = rng;
            testCase.addTeardown(@rng,orig)
            rng(seed)
        end
    end
    
    methods (Test, ParameterCombination = 'sequential')
        function testSize(testCase,dim1,dim2,dim3)
            testCase.verifySize(rand(dim1,dim2,dim3),[dim1 dim2 dim3])
        end
    end
end

이 메서드는 dim1, dim2, dim3의 각 해당 파라미터 값에 대한 출력값의 크기를 테스트합니다. 주어진 TestClassSetup, TestMethodSetup 파라미터화에 대해 프레임워크는 testSize 메서드를 'small' 값, 'medium' 값, 'large' 값에 대해 각각 한 번씩, 총 세 번 호출합니다. 예를 들어, 모든 'medium' 값으로 테스트하기 위해 프레임워크는 testCase.verifySize(rand(2,3,4),[2 3 4])를 사용합니다.

쌍별 파라미터 조합으로 테스트 메서드 정의하기

TestParameterCombination = 'pairwise' 특성이 있는 methods 블록에서 testRepeatable 메서드를 정의합니다.

classdef TestRand < matlab.unittest.TestCase
    properties (ClassSetupParameter)
        generator = {'twister','combRecursive','multFibonacci'};
    end
    
    properties (MethodSetupParameter)
        seed = {0,123,4294967295};
    end
    
    properties (TestParameter)
        dim1 = struct('small',1,'medium',2,'large',3);
        dim2 = struct('small',2,'medium',3,'large',4);
        dim3 = struct('small',3,'medium',4,'large',5);
        type = {'single','double'};
    end
    
    methods (TestClassSetup)
        function classSetup(testCase,generator)
            orig = rng;
            testCase.addTeardown(@rng,orig)
            rng(0,generator)
        end
    end
    
    methods (TestMethodSetup)
        function methodSetup(testCase,seed)
            orig = rng;
            testCase.addTeardown(@rng,orig)
            rng(seed)
        end
    end
    
    methods (Test, ParameterCombination = 'sequential')
        function testSize(testCase,dim1,dim2,dim3)
            testCase.verifySize(rand(dim1,dim2,dim3),[dim1 dim2 dim3])
        end
    end
    
    methods (Test, ParameterCombination = 'pairwise')
        function testRepeatable(testCase,dim1,dim2,dim3)
            state = rng;
            firstRun = rand(dim1,dim2,dim3);
            rng(state)
            secondRun = rand(dim1,dim2,dim3);
            testCase.verifyEqual(firstRun,secondRun)
        end
    end
end

이 메서드는 난수 생성기 결과가 반복 가능한지 확인합니다. 주어진 TestClassSetup, TestMethodSetup 파라미터화에 대해 프레임워크는 testRepeatable 메서드를 10회 호출하여 각 dim1, dim2, dim3으로 지정된 각 파라미터 값 쌍을 테스트합니다. 완전 조합 방식의 파라미터인 경우 프레임워크는 메서드를 3³ = 27회 호출할 것입니다.

완전 조합 방식의 파라미터로 테스트 메서드 정의하기

Test 특성이 있는 methods 블록에서 testClass 메서드를 정의합니다. ParameterCombination 특성이 지정되지 않았으므로 파라미터 조합은 기본적으로 완전 조합입니다.

classdef TestRand < matlab.unittest.TestCase
    properties (ClassSetupParameter)
        generator = {'twister','combRecursive','multFibonacci'};
    end
    
    properties (MethodSetupParameter)
        seed = {0,123,4294967295};
    end
    
    properties (TestParameter)
        dim1 = struct('small',1,'medium',2,'large',3);
        dim2 = struct('small',2,'medium',3,'large',4);
        dim3 = struct('small',3,'medium',4,'large',5);
        type = {'single','double'};
    end
    
    methods (TestClassSetup)
        function classSetup(testCase,generator)
            orig = rng;
            testCase.addTeardown(@rng,orig)
            rng(0,generator)
        end
    end
    
    methods (TestMethodSetup)
        function methodSetup(testCase,seed)
            orig = rng;
            testCase.addTeardown(@rng,orig)
            rng(seed)
        end
    end
    
    methods (Test, ParameterCombination = 'sequential')
        function testSize(testCase,dim1,dim2,dim3)
            testCase.verifySize(rand(dim1,dim2,dim3),[dim1 dim2 dim3])
        end
    end
    
    methods (Test, ParameterCombination = 'pairwise')
        function testRepeatable(testCase,dim1,dim2,dim3)
            state = rng;
            firstRun = rand(dim1,dim2,dim3);
            rng(state)
            secondRun = rand(dim1,dim2,dim3);
            testCase.verifyEqual(firstRun,secondRun)
        end
    end
    
    methods (Test)
        function testClass(testCase,dim1,dim2,type)
            testCase.verifyClass(rand(dim1,dim2,type),type)
        end
    end
end

이 메서드는 rand 출력값의 클래스가 예상 클래스값과 동일한지 확인합니다. 주어진 TestClassSetup, TestMethodSetup 파라미터화에 대해 프레임워크는 testClass 메서드를 3×3×2 = 18번 호출하여 dim1, dim2, type 파라미터 값으로 이루어진 각각의 조합을 테스트합니다.

테스트 클래스에서 스위트 생성하기

명령 프롬프트에서, TestRand 클래스로부터 스위트를 만드십시오.

suite = matlab.unittest.TestSuite.fromClass(?TestRand)
suite = 

  1×279 Test array with properties:

    Name
    ProcedureName
    TestClass
    BaseFolder
    Parameterization
    SharedTestFixtures
    Tags

Tests Include:
   17 Unique Parameterizations, 0 Shared Test Fixture Classes, 0 Tags.

주어진 TestClassSetup, TestMethodSetup 파라미터화에 대해 프레임워크는 3+10+18 = 31개의 테스트 요소를 만듭니다. 이 31개 요소는 각 TestMethodSetup 파라미터화에 대해 호출되어 결과적으로 각 TestClassSetup 파라미터화에 대해 3×31 = 93개의 테스트 요소가 나옵니다. 3개의 TestClassSetup 파라미터화가 있으므로 스위트에는 총 3×93 = 279개의 테스트 요소가 있습니다.

첫 번째 테스트 요소의 이름을 쿼리하십시오.

suite(1).Name
ans =

    'TestRand[generator=twister]/[seed=0]testClass(dim1=small,dim2=small,type=single)'

첫 번째 요소의 이름은 다음 부분으로 구성됩니다.

  • 테스트 클래스 — TestRand

  • 클래스 설정 속성 및 파라미터 이름 — [generator=twister]

  • 메서드 설정 속성 및 파라미터 이름 — [seed=0]

  • 테스트 메서드 이름 — testClass

  • 테스트 메서드 속성 및 파라미터 이름 — (dim1=small,dim2=small,type=single)

선택기를 사용하여 생성한 스위트 실행하기

명령 프롬프트에서 'single' 정밀도에 대해 'twister' 생성기를 테스트하는 테스트 요소를 선택하는 선택기를 만드십시오. 'large' 파라미터 이름을 가진 속성을 사용하는 테스트 요소는 제외하여 스위트를 만듭니다.

import matlab.unittest.selectors.HasParameter
s = HasParameter('Property','generator','Name','twister') & ...
    HasParameter('Property','type','Name','single') & ...
    ~HasParameter('Name','large');

suite2 = matlab.unittest.TestSuite.fromClass(?TestRand,s)
suite2 = 

  1×12 Test array with properties:

    Name
    ProcedureName
    TestClass
    BaseFolder
    Parameterization
    SharedTestFixtures
    Tags

Tests Include:
   9 Unique Parameterizations, 0 Shared Test Fixture Classes, 0 Tags.

TestRand 클래스에서 전체 스위트를 먼저 생성하는 경우 selectIf 메서드를 사용하여 동일한 필터링된 스위트를 만들 수 있습니다.

suite = matlab.unittest.TestSuite.fromClass(?TestRand);
suite2 = selectIf(suite,s);

필터링된 테스트 스위트를 실행합니다.

suite2.run;
Running TestRand
.......... ..
Done TestRand
__________

선택기를 사용하여 메서드에서 테스트 스위트 실행하기

'large' 또는 'medium' 파라미터 이름을 가진 속성을 사용하는 테스트 요소를 제외하는 선택기를 만드십시오. testRepeatable 메서드에서 발견되는 테스트 요소로만 결과를 제한하십시오.

import matlab.unittest.selectors.HasParameter
s = ~(HasParameter('Name','large') | HasParameter('Name','medium'));

suite3 = matlab.unittest.TestSuite.fromMethod(?TestRand,'testRepeatable',s);
{suite3.Name}'
ans =

  9×1 cell array

    {'TestRand[generator=twister]/[seed=0]testRepeatable(dim1=small,dim2=small,dim3=small)'               }
    {'TestRand[generator=twister]/[seed=123]testRepeatable(dim1=small,dim2=small,dim3=small)'             }
    {'TestRand[generator=twister]/[seed=4294967295]testRepeatable(dim1=small,dim2=small,dim3=small)'      }
    {'TestRand[generator=combRecursive]/[seed=0]testRepeatable(dim1=small,dim2=small,dim3=small)'         }
    {'TestRand[generator=combRecursive]/[seed=123]testRepeatable(dim1=small,dim2=small,dim3=small)'       }
    {'TestRand[generator=combRecursive]/[seed=4294967295]testRepeatable(dim1=small,dim2=small,dim3=small)'}
    {'TestRand[generator=multFibonacci]/[seed=0]testRepeatable(dim1=small,dim2=small,dim3=small)'         }
    {'TestRand[generator=multFibonacci]/[seed=123]testRepeatable(dim1=small,dim2=small,dim3=small)'       }
    {'TestRand[generator=multFibonacci]/[seed=4294967295]testRepeatable(dim1=small,dim2=small,dim3=small)'}

테스트 스위트를 실행하십시오.

suite3.run;
Running TestRand
.........
Done TestRand
__________

모든 배정밀도 테스트 실행하기

명령 프롬프트에서, TestRand에서 'double' 파라미터 이름을 사용하는 모든 테스트 요소를 실행합니다.

runtests('TestRand','ParameterName','double');
Running TestRand
.......... .......... .......... .......... ..........
.......... .......... .......... .
Done TestRand
__________

참고 항목

| |

관련 항목