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

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

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

테스트 개요

TestRand 테스트 클래스는 세 개의 상이한 단위에서 파라미터화됩니다.

파라미터화 단위파라미터화 정의액세스 가능한 파라미터화 속성
메서드 특성속성 특성
테스트 단위TestTestParameterTestParameter, MethodSetupParameter, ClassSetupParameter
메서드 설정 단위TestMethodSetupMethodSetupParameterMethodSetupParameterClassSetupParameter
클래스 설정 단위TestClassSetupClassSetupParameterClassSetupParameter

각 테스트 단위에서 ParameterCombination 메서드 특성을 사용하여 테스트 파라미터화를 지정할 수 있습니다.

ParameterCombination 특성(Attribute)메서드 호출
'exhaustive'(디폴트 값)모든 파라미터 조합에 대해 메서드를 불러옵니다. ParameterCombination 특성을 지정하지 않는 경우, 테스트 프레임워크는 이 디폴트 조합을 사용합니다.
'sequential'각 파라미터의 대응값을 사용하여 메서드가 호출됩니다. 각 파라미터 값의 개수는 같아야 합니다.
'pairwise'모든 파라미터 값 쌍에 대해 적어도 한 번은 메서드가 호출됩니다. 테스트 프레임워크가 모든 값 쌍에 대해 적어도 한 번은 테스트가 생성되도록 하지만, 사용자는 크기, 순서, 특정 테스트 스위트 요소 집합에 의존해서는 안 됩니다.

예를 들어 MethodSetupParameter properties 블록에 정의된 메서드 설정 단위 파라미터의 순차적 조합을 지정하려면, 조합된 메서드 특성 TestMethodSetup, ParameterCombination='sequential'을 사용하십시오.

이 예제의 경우, 클래스 설정 단위의 파라미터화는 난수 생성기의 유형을 정의합니다. 메서드 설정 단위의 파라미터화는 난수 생성기의 시드값을 정의하고, 테스트 단위의 파라미터화는 데이터형과 난수 출력값의 크기를 정의합니다.

TestRand 테스트 클래스 생성하기

작업 폴더의 파일에 matlab.unittest.TestCase에서 상속되는 클래스를 만듭니다. 이 클래스는 난수 생성의 다양한 면을 테스트합니다.

classdef TestRand < matlab.unittest.TestCase

properties 블록 정의하기

파라미터화된 테스트에 사용되는 속성을 정의하십시오. 각 properties 블록은 특정 단위의 파라미터화에 대응합니다.

    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

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

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

    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

파라미터화된 순차적 테스트 메서드 정의하기

Test 특성(Attribute)과 ParameterCombination='sequential' 특성이 있는 methods 블록을 정의하십시오. 테스트 프레임워크는 각각의 대응하는 속성값에 대해 한 번씩 이들 메서드를 불러옵니다.

    methods (Test, ParameterCombination='sequential')
        function testSize(testCase,dim1,dim2,dim3)
            testCase.verifySize(rand(dim1,dim2,dim3),[dim1 dim2 dim3])
        end 
    end

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

파라미터화된 쌍별(Pairwise) 테스트 메서드 정의하기

Test 특성(Attribute)과 ParameterCombination='pairwise' 특성이 있는 methods 블록을 정의하십시오. 테스트 프레임워크에서 모든 속성값 쌍에 대해 한 번씩 이들 메서드를 불러옵니다.

    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

이 테스트 메서드는 난수 생성기 결과가 반복 가능한지 확인합니다. 주어진 TestClassSetup, TestMethodSetup 파라미터화에 대해 프레임워크는 testRepeatble 메서드를 10회 호출하여 각 dim1, dim2, dim3 속성값 쌍을 테스트합니다. 그러나, 파라미터 조합 특성이 포괄적(Exhaustive)인 경우 프레임워크는 이 메서드를 3^3=27번 호출합니다.

파라미터화된 포괄적(Exhaustive) 테스트 메서드 정의하기

Test 특성이 있거나 정의된 파라미터 조합이 없는 methods 블록을 정의하십시오. 이 파라미터 조합은 기본적으로 포괄적입니다. 테스트 프레임워크가 모든 속성값 조합에 대해 한 번씩 이들 메서드를 불러옵니다.

    methods (Test)
        function testClass(testCase,dim1,dim2,type)
            testCase.verifyClass(rand(dim1,dim2,type), type)
        end
    end

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

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

전체 테스트에서 테스트 스위트 생성하기

명령 프롬프트에서, TestRand.m 클래스로부터 테스트 스위트(Test Suite)를 만드십시오.

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.

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

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

suite(1).Name
ans =

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

각 요소의 이름은 다음을 조합하여 생성됩니다.

  • 테스트 클래스: TestRand

  • 클래스 설정 속성과 속성 이름: [generator=twister]

  • 메서드 설정 속성과 속성 이름: [seed=value1]

  • 테스트 메서드 이름: testClass

  • 테스트 메서드 속성과 속성 이름: (dim1=small,dim2=small,type=single)

seed 속성의 이름은 특별한 의미가 없습니다(예: value1). seed 속성값이 숫자이기 때문에, 테스트 프레임워크에서 이 이름을 제공한 것입니다. 더 의미 있는 이름을 사용하려면 좀 더 서술적인 필드 이름을 사용하여 seed 속성을 구조체로 정의하십시오.

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

명령 프롬프트에서 '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.

전체 모음을 먼저 생성하는 경우 selectIf 메서드를 사용하여 위와 동일한 테스트 스위트(Test Suite)를 생성하십시오.

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=value1]testRepeatable(dim1=small,dim2=small,dim3=small)'
    'TestRand[generator=twister]/[seed=value2]testRepeatable(dim1=small,dim2=small,dim3=small)'
    'TestRand[generator=twister]/[seed=value3]testRepeatable(dim1=small,dim2=small,dim3=small)'
    'TestRand[generator=combRecursive]/[seed=value1]testRepeatable(dim1=small,dim2=small,dim3=small)'
    'TestRand[generator=combRecursive]/[seed=value2]testRepeatable(dim1=small,dim2=small,dim3=small)'
    'TestRand[generator=combRecursive]/[seed=value3]testRepeatable(dim1=small,dim2=small,dim3=small)'
    'TestRand[generator=multFibonacci]/[seed=value1]testRepeatable(dim1=small,dim2=small,dim3=small)'
    'TestRand[generator=multFibonacci]/[seed=value2]testRepeatable(dim1=small,dim2=small,dim3=small)'
    'TestRand[generator=multFibonacci]/[seed=value3]testRepeatable(dim1=small,dim2=small,dim3=small)'

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

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

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

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

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

참고 항목

| |

관련 항목