Main Content

스위트 생성 시 파라미터 정의하기

파라미터화된 테스트를 사용하면 매번 다른 데이터 값을 사용하여 동일한 테스트 절차를 반복해서 실행할 수 있습니다. 파라미터화된 테스트에서는 이러한 데이터 값을 파라미터라고 하고 테스트 클래스의 파라미터화 속성으로 나타냅니다. MATLAB®은 파라미터화 속성을 사용하여 각 테스트 실행에 대해 파라미터 이름 및 값을 생성합니다.

대부분의 경우, MATLAB은 테스트 클래스 정의를 불러올 때 파라미터화 속성의 값을 결정할 수 있습니다. 따라서 디폴트 값을 사용하여 속성을 초기화할 수 있습니다. 디폴트 값으로 파라미터화 속성을 초기화하면 이 속성과 연결된 파라미터가 각 테스트 실행마다 고정된 상태로 유지됩니다. 파라미터화된 테스트 클래스에서 스위트를 생성할 때마다 테스트 프레임워크가 동일한 파라미터 이름과 값을 사용하여 테스트를 실행합니다.

MATLAB이 테스트 클래스 정의를 불러올 때 파라미터화 속성의 값을 결정하지 못하는 경우가 있을 수 있습니다. 예를 들면, 파라미터화 속성이 더 높은 파라미터화 수준에서 정의된 다른 속성에 따라 달라지는 경우도 있습니다. 또는 클래스를 불러올 때 파라미터가 결정되는 것을 원치 않을 수 있습니다. 이를테면 파라미터가 폴더의 파일을 나타내는 경우 스위트를 생성하여 파일을 테스트할 때마다 파라미터를 새로 고쳐야 할 수 있습니다. 클래스를 불러올 때 파라미터화 속성을 초기화할 수 없거나 이를 원치 않는 경우 스위트 생성 시 TestParameterDefinition 특성이 있는 정적 메서드를 사용하여 파라미터화 속성을 초기화하십시오. TestParameterDefinition 메서드를 사용하여 파라미터화 속성을 초기화하면 이 속성과 연결된 파라미터가 각 테스트 실행마다 다를 수 있습니다. 즉, 파라미터화된 테스트 클래스에서 테스트 스위트를 생성할 때마다 프레임워크가 새로운 파라미터 이름과 값을 생성하여 테스트를 실행합니다.

이 예제에서는 파라미터화 속성에 디폴트 값 및 디폴트가 아닌 값을 사용하여 현재 폴더의 클래스 그룹에 대한 퍼블릭 속성이 비어 있지 않은지 확인하는 방법을 보여줍니다. 여기서는 현재 폴더의 test 하위 폴더에 PropertiesTest라는 파라미터화된 테스트 클래스를 정의합니다. 현재 폴더의 source 하위 폴더에 테스트할 3개의 클래스 ClassA, ClassBClassC를 정의합니다. 이 3개 클래스에 대한 요약은 source 하위 폴더의 클래스를 참조하십시오.

PropertiesTest 클래스 생성하기

source 하위 폴더에 정의된 클래스의 퍼블릭 속성을 테스트하기 위해 test 하위 폴더에 PropertiesTest 클래스를 생성합니다. 이 클래스는 3개의 지정된 클래스를 받아 각 클래스의 모든 속성을 가져온 후 비어 있지 않은지 확인합니다. 테스트할 클래스에 대해 반복하려면 클래스 설정 수준에서 PropertiesTest를 파라미터화하십시오. 주어진 클래스 설정 수준의 파라미터화에서 지정된 각 클래스의 속성에 대해 반복하려면 테스트 수준에서 PropertiesTest를 파라미터화하십시오.

파라미터화된 테스트에 사용되는 속성을 정의합니다.

  • classToTest라는 속성에 프레임워크에 대해 반복할 클래스를 나열합니다. 이 예제에서는 source 하위 폴더의 클래스가 고정되어 있고 MATLAB이 테스트 클래스 정의를 불러올 때 클래스를 결정할 수 있다고 가정하기 때문에 디폴트 값을 사용하여 속성을 초기화합니다. Test 메서드를 실행하기 전에 테스트할 클래스를 지정하려면 classToTestClassSetupParameter 속성으로 지정하십시오.

  • 이름이 propertyToTestTestParameter 속성을 정의합니다. 이 속성을 사용하여 프레임워크가 현재 테스트하는 모든 클래스의 속성에 대해 반복 작업을 수행할 수 있습니다. 이 속성의 값은 테스트되는 클래스에 따라 달라지므로 이 속성에 디폴트 값을 할당하지 마십시오. 대신, TestParameterDefinition 메서드를 사용하여 스위트 생성 시 속성을 초기화하십시오.

  • 테스트되는 클래스의 인스턴스에 각기 다른 속성의 값을 저장하기 위해 ObjectToTest라는 속성을 정의합니다.

classdef PropertiesTest < matlab.unittest.TestCase
    properties (ClassSetupParameter)
        classToTest = {'ClassA','ClassB','ClassC'};
    end

    properties (TestParameter)
        propertyToTest
    end
    
    properties
        ObjectToTest
    end
end

테스트 수준의 파라미터화 속성을 초기화하는 메서드 정의하기

PropertiesTest 클래스에서는 propertyToTest가 테스트되는 각 클래스에 대해 서로 다른 값을 갖습니다. 따라서 속성에 디폴트 값을 할당할 수 없습니다. 대신, 스위트 생성 시에 속성을 초기화해야 합니다. 이 요구 사항을 구현하려면 initializeProperty라는 이름의 TestParameterDefinition 메서드를 추가하십시오. TestParameterDefinition 메서드는 정적이어야 하므로 결합된 메서드 특성인 TestParameterDefinition,Static을 사용하여 메서드를 정의해야 합니다.

initializeProperty 메서드는 클래스 설정 수준의 파라미터화 속성을 입력값으로 받은 후 properties 함수에 대한 호출에 사용하여 문자형 벡터로 구성된 셀형 배열로 속성 이름을 반환합니다.

classdef PropertiesTest < matlab.unittest.TestCase
    properties (ClassSetupParameter)
        classToTest = {'ClassA','ClassB','ClassC'};
    end

    properties (TestParameter)
        propertyToTest
    end
    
    properties
        ObjectToTest
    end

    methods (TestParameterDefinition,Static)
        function propertyToTest = initializeProperty(classToTest)
            propertyToTest = properties(classToTest);
        end
    end
end

initializeProperty 메서드에서 입력 인수 classToTest 및 출력 인수 propertyToTest는 모두 PropertiesTest 클래스에 정의된 파라미터화 속성입니다. TestParameterDefinition 메서드를 정의하는 경우 항상 이 메서드에 대한 모든 입력값은 동일한 클래스 또는 그 슈퍼클래스 중 하나에 정의된 파라미터화 속성과 일치해야 합니다. 또한, 이 메서드의 모든 출력값은 동일한 클래스에 정의된 파라미터화 속성과 일치해야 합니다.

initializeProperty 메서드에서 입력 인수 classToTest는 가장 높은 파라미터화 수준에서 정의됩니다. 이로써 가장 낮은 파라미터화 수준에서 정의되는 출력 인수 propertyToTest보다 높은 수준에 있게 됩니다. 입력값을 받는 TestParameterDefinition 메서드를 정의하는 경우 입력값이 항상 이 메서드의 출력값보다 높은 파라미터화 수준에 있어야 합니다. 파라미터화 수준에 대한 자세한 내용은 클래스 기반 테스트에서 파라미터 사용하기 항목을 참조하십시오.

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

비어 있지 않은 속성값에 대해 테스트하려면 먼저 속성값을 가져올 수 있도록 테스트되는 클래스의 객체를 생성해야 합니다. 이 요구 사항을 구현하려면 파라미터화된 classSetup 메서드를 PropertiesTest 클래스에 추가하십시오. Test 메서드를 실행하기 전에 객체를 준비하려면 classSetupTestClassSetup 메서드로 지정하십시오.

classSetup 메서드는 테스트되는 클래스의 인스턴스를 생성하여 ObjectToTest 속성에 저장합니다. 그러면 테스트가 나중에 ObjectToTest에서 속성값을 가져올 수 있습니다. 이 예제에서 프레임워크는 classSetup 메서드를 ClassA, ClassB, ClassC에 대해 각각 한 번씩, 총 세 번 호출하여 테스트를 실행합니다.

classdef PropertiesTest < matlab.unittest.TestCase
    properties (ClassSetupParameter)
        classToTest = {'ClassA','ClassB','ClassC'};
    end

    properties (TestParameter)
        propertyToTest
    end
    
    properties
        ObjectToTest
    end

    methods (TestParameterDefinition,Static)
        function propertyToTest = initializeProperty(classToTest)
            propertyToTest = properties(classToTest);
        end
    end

    methods (TestClassSetup)
        function classSetup(testCase,classToTest)
            constructor = str2func(classToTest);
            testCase.ObjectToTest = constructor();
        end
    end
end

비어 있지 않은 속성값이 있는지 테스트하기

ObjectToTest의 속성이 비어 있지 않은지 테스트하려면 testProperty라는 이름의 Test 메서드를 추가하십시오. 메서드가 ObjectToTest의 속성에 대해 반복하도록 하려면 이 메서드를 파라미터화된 메서드로 설정하고 propertyToTest로 전달하십시오.

각 테스트 중에 testProperty 메서드가 ObjectToTest에 대한 속성값을 가져옵니다. 그런 다음, verifyNotEmpty 가설 검정 메서드에 대한 호출을 사용하여 값이 비어 있지 않은지 확인합니다. 주어진 클래스 설정 수준 파라미터화에 대해 프레임워크는 테스트되는 클래스에 대한 속성마다 한 번씩 testProperty를 호출합니다.

classdef PropertiesTest < matlab.unittest.TestCase
    properties (ClassSetupParameter)
        classToTest = {'ClassA','ClassB','ClassC'};
    end

    properties (TestParameter)
        propertyToTest
    end
    
    properties
        ObjectToTest
    end

    methods (TestParameterDefinition,Static)
        function propertyToTest = initializeProperty(classToTest)
            propertyToTest = properties(classToTest);
        end
    end

    methods (TestClassSetup)
        function classSetup(testCase,classToTest)
            constructor = str2func(classToTest);
            testCase.ObjectToTest = constructor();
        end
    end

    methods (Test)
        function testProperty(testCase,propertyToTest)
            value = testCase.ObjectToTest.(propertyToTest);
            testCase.verifyNotEmpty(value)
        end
    end
end

파라미터화된 테스트 스위트를 만들고 테스트 실행하기

PropertiesTest 클래스 정의를 완료했으므로 파라미터화된 테스트 스위트를 만들고 테스트를 실행할 수 있습니다. 이렇게 하려면 sourcetest 하위 폴더가 경로에 있는지 확인해야 합니다.

addpath("source","test")

PropertiesTest 클래스로부터 스위트를 만듭니다.

suite = testsuite("PropertiesTest");

테스트 스위트는 8개의 요소를 포함합니다. 각 요소는 source 하위 폴더 내에 정의된 속성에 대응됩니다. 첫 번째 스위트 요소의 이름을 반환합니다.

suite(1).Name
ans = 
'PropertiesTest[classToTest=ClassA]/testProperty(propertyToTest=PropA1)'

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

  • PropertiesTest — 테스트 클래스 이름

  • [classToTest=ClassA] — 클래스 설정 수준 속성 및 파라미터 이름

  • testPropertyTest 메서드 이름

  • (propertyToTest=PropA1) — 테스트 수준 속성 및 파라미터 이름

테스트를 실행하십시오. source 하위 폴더에 있는 두 속성이 비어 있기 때문에 테스트 2개가 실패합니다.

suite.run
Running PropertiesTest
..
================================================================================
Verification failed in PropertiesTest[classToTest=ClassA]/testProperty(propertyToTest=PropA3).
    ---------------------
    Framework Diagnostic:
    ---------------------
    verifyNotEmpty failed.
    --> The value must not be empty.
    --> The value has a size of [0  0].
    
    Actual Value:
         []
    ------------------
    Stack Information:
    ------------------
    In C:\TEMP\Examples\matlab-ex41465327\test\PropertiesTest.m (PropertiesTest.testProperty) at 30
================================================================================
....
================================================================================
Verification failed in PropertiesTest[classToTest=ClassC]/testProperty(propertyToTest=PropC1).
    ---------------------
    Framework Diagnostic:
    ---------------------
    verifyNotEmpty failed.
    --> The value must not be empty.
    --> The value has a size of [0  0].
    
    Actual Value:
         []
    ------------------
    Stack Information:
    ------------------
    In C:\TEMP\Examples\matlab-ex41465327\test\PropertiesTest.m (PropertiesTest.testProperty) at 30
================================================================================
..
Done PropertiesTest
__________

Failure Summary:

     Name                                                                    Failed  Incomplete  Reason(s)
    =====================================================================================================================
     PropertiesTest[classToTest=ClassA]/testProperty(propertyToTest=PropA3)    X                 Failed by verification.
    ---------------------------------------------------------------------------------------------------------------------
     PropertiesTest[classToTest=ClassC]/testProperty(propertyToTest=PropC1)    X                 Failed by verification.
ans = 
  1×8 TestResult array with properties:

    Name
    Passed
    Failed
    Incomplete
    Duration
    Details

Totals:
   6 Passed, 2 Failed (rerun), 0 Incomplete.
   0.2348 seconds testing time.

특정 클래스에 대한 테스트 실행하기

ClassB에 대해서만 테스트를 실행합니다. 이를 수행하려면 matlab.unittest.TestSuiteselectIf 메서드를 사용하여 특정 파라미터화를 사용하는 테스트 스위트 요소를 선택하십시오. 결과로 반환되는 테스트 스위트는 필터링된 스위트이며 3개의 요소만 가집니다.

suite2 = suite.selectIf("ParameterName","PropB*");
{suite2.Name}'
ans = 3×1 cell
    {'PropertiesTest[classToTest=ClassB]/testProperty(propertyToTest=PropB1)'}
    {'PropertiesTest[classToTest=ClassB]/testProperty(propertyToTest=PropB2)'}
    {'PropertiesTest[classToTest=ClassB]/testProperty(propertyToTest=PropB3)'}

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

suite2.run;
Running PropertiesTest
...
Done PropertiesTest
__________

또는, 파라미터화로 테스트 스위트를 필터링하는 선택기를 생성하여 동일한 테스트를 실행할 수 있습니다.

import matlab.unittest.selectors.HasParameter
import matlab.unittest.constraints.StartsWithSubstring
suite3 = matlab.unittest.TestSuite.fromClass(?PropertiesTest, ...
    HasParameter("Name",StartsWithSubstring("PropB")));
suite3.run;
Running PropertiesTest
...
Done PropertiesTest
__________

source 하위 폴더의 클래스

이 섹션에서는 source 하위 폴더에 포함된 클래스의 내용을 제공합니다.

ClassA는 세 개의 속성을 가집니다. 속성 중 2개가 비어 있지 않은 값을 가집니다.

classdef ClassA
    properties
        PropA1 = 1;
        PropA2 = 2;
        PropA3
    end
end

ClassB는 세 개의 속성을 가집니다. 모든 속성이 비어 있지 않은 값을 가집니다.

classdef ClassB
    properties
        PropB1 = 1;
        PropB2 = 2;
        PropB3 = 'a';
    end
end

ClassC는 두 개의 속성을 가집니다. 속성 중 하나가 비어 있지 않은 값을 가집니다.

classdef ClassC
    properties
        PropC1
        PropC2 = [1 2 3];
    end
end

참고 항목

| |

관련 항목