파라미터화된 고급 테스트 생성하기
이 예제에서는 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
순차적 파라미터 조합으로 테스트 메서드 정의하기
Test
및 ParameterCombination = '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])
를 사용합니다.
쌍별 파라미터 조합으로 테스트 메서드 정의하기
Test
및 ParameterCombination = '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 __________
참고 항목
matlab.unittest.TestSuite
| matlab.unittest.TestCase
| matlab.unittest.selectors.HasParameter