파라미터화된 테스트에 외부 파라미터 사용하기
기존의 클래스 기반 테스트에 가변 입력값을 삽입할 수 있습니다. 테스트 파일 외부에서 정의된 테스트 데이터를 제공해야 하고, 테스트를 수행할 때 파라미터화된 테스트를 통해 그 데이터를 반복적으로 사용해야 한다면, Parameter
인스턴스로 구성된 배열을 생성한 다음 fromClass
같은 TestSuite
생성 메서드에 ExternalParameters
이름-값 인수를 사용하십시오.
cleanData
함수를 생성합니다. 이 함수는 배열을 받아 벡터화하고 0
, NaN
, Inf
를 제거한 후 배열을 정렬합니다.
function Y = cleanData(X) Y = X(:); % Vectorize array Y = rmmissing(Y); % Remove NaN % Remove 0 and Inf idx = (Y==0 | Y==Inf); Y = Y(~idx); % If array is empty, set to eps if isempty(Y) Y = eps; end Y = sort(Y); % Sort vector end
cleanData
함수를 테스트하기 위한 파라미터화된 테스트를 생성합니다. 이 테스트는 properties
블록에 정의된 2개의 데이터 세트에 대해 4개의 Test
메서드를 각각 반복합니다.
classdef TestClean < matlab.unittest.TestCase properties (TestParameter) Data = struct("clean",[5 3 9;1 42 5;32 5 2], ... "needsCleaning",[1 13;NaN 0;Inf 42]); end methods (Test) function classCheck(testCase,Data) act = cleanData(Data); testCase.assertClass(act,"double") end function sortCheck(testCase,Data) act = cleanData(Data); testCase.verifyTrue(issorted(act)) end function finiteCheck(testCase,Data) import matlab.unittest.constraints.IsFinite act = cleanData(Data); testCase.verifyThat(act,IsFinite) end function noZeroCheck(testCase,Data) import matlab.unittest.constraints.EveryElementOf import matlab.unittest.constraints.IsEqualTo act = cleanData(Data); testCase.verifyThat(EveryElementOf(act),~IsEqualTo(0)) end end end
테스트를 실행하십시오. 프레임워크가 테스트 파일에 정의된 데이터를 사용하여 8개의 파라미터화된 테스트를 실행합니다.
import matlab.unittest.TestSuite
suite1 = TestSuite.fromClass(?TestClean);
results = suite1.run;
table(results)
Running TestClean ........ Done TestClean __________ ans = 8×6 table Name Passed Failed Incomplete Duration Details _____________________________________________ ______ ______ __________ _________ ____________ {'TestClean/classCheck(Data=clean)' } true false false 0.66469 {1×1 struct} {'TestClean/classCheck(Data=needsCleaning)' } true false false 0.0066959 {1×1 struct} {'TestClean/sortCheck(Data=clean)' } true false false 0.0039298 {1×1 struct} {'TestClean/sortCheck(Data=needsCleaning)' } true false false 0.003343 {1×1 struct} {'TestClean/finiteCheck(Data=clean)' } true false false 0.055924 {1×1 struct} {'TestClean/finiteCheck(Data=needsCleaning)'} true false false 0.0017951 {1×1 struct} {'TestClean/noZeroCheck(Data=clean)' } true false false 0.90772 {1×1 struct} {'TestClean/noZeroCheck(Data=needsCleaning)'} true false false 0.007801 {1×1 struct}
테스트 파일 외부에 데이터 세트를 생성합니다.
A = [NaN 2 0;1 Inf 3];
외부 데이터 세트에서 Parameter
인스턴스로 구성된 배열을 생성합니다. fromData
메서드는 TestClean
의 properties
블록에서 파라미터화된 속성의 이름과 함께 새 데이터를 셀형 배열(또는 구조체)로 받습니다.
import matlab.unittest.parameters.Parameter newData = {A}; param = Parameter.fromData("Data",newData);
외부 파라미터를 사용하여 새 테스트 스위트를 만듭니다. 프레임워크는 문자 #ext
를 파라미터 이름의 끝에 추가하여 파라미터가 외부에서 정의되었음을 나타냅니다.
suite2 = TestSuite.fromClass(?TestClean,"ExternalParameters",param);
{suite2.Name}'
ans = 4×1 cell array {'TestClean/classCheck(Data=2x3_double#ext)' } {'TestClean/sortCheck(Data=2x3_double#ext)' } {'TestClean/finiteCheck(Data=2x3_double#ext)'} {'TestClean/noZeroCheck(Data=2x3_double#ext)'}
스위트의 파라미터 이름을 완전히 제어하려면 구조체를 사용하여 파라미터를 정의하십시오. 그런 다음 테스트를 실행합니다.
newData = struct("commandLineData",A); param = Parameter.fromData("Data",newData); suite2 = TestSuite.fromClass(?TestClean,"ExternalParameters",param); {suite2.Name}' results = suite2.run;
ans = 4×1 cell array {'TestClean/classCheck(Data=commandLineData#ext)' } {'TestClean/sortCheck(Data=commandLineData#ext)' } {'TestClean/finiteCheck(Data=commandLineData#ext)'} {'TestClean/noZeroCheck(Data=commandLineData#ext)'} Running TestClean .... Done TestClean __________
ASCII로 구분된 파일에 저장된 다른 데이터 세트를 생성합니다.
B = rand(3); B(2,4) = 0; writematrix(B,"myFile.dat") clear B
저장된 데이터 세트와 A
에서 파라미터를 생성한 다음, 테스트 스위트를 만듭니다.
newData = struct("commandLineData",A,"storedData",readmatrix("myFile.dat")); param2 = Parameter.fromData("Data",newData); suite3 = TestSuite.fromClass(?TestClean,"ExternalParameters",param2);
테스트 파일에 정의된 파라미터와 외부에서 정의된 파라미터를 사용하여 테스트를 실행하기 위해 테스트 스위트를 결합합니다. 스위트 요소 이름을 보고 테스트를 실행합니다.
suite = [suite1 suite3]; {suite.Name}' results = suite.run;
ans = 16×1 cell array {'TestClean/classCheck(Data=clean)' } {'TestClean/classCheck(Data=needsCleaning)' } {'TestClean/sortCheck(Data=clean)' } {'TestClean/sortCheck(Data=needsCleaning)' } {'TestClean/finiteCheck(Data=clean)' } {'TestClean/finiteCheck(Data=needsCleaning)' } {'TestClean/noZeroCheck(Data=clean)' } {'TestClean/noZeroCheck(Data=needsCleaning)' } {'TestClean/classCheck(Data=commandLineData#ext)' } {'TestClean/classCheck(Data=storedData#ext)' } {'TestClean/sortCheck(Data=commandLineData#ext)' } {'TestClean/sortCheck(Data=storedData#ext)' } {'TestClean/finiteCheck(Data=commandLineData#ext)'} {'TestClean/finiteCheck(Data=storedData#ext)' } {'TestClean/noZeroCheck(Data=commandLineData#ext)'} {'TestClean/noZeroCheck(Data=storedData#ext)' } Running TestClean ........ Done TestClean __________ Running TestClean ........ Done TestClean __________
참고 항목
matlab.unittest.TestSuite
| matlab.unittest.parameters.Parameter.fromData