Main Content

파라미터화된 테스트에 외부 파라미터 사용하기

기존의 클래스 기반 테스트에 가변 입력값을 삽입할 수 있습니다. 테스트 파일 외부에서 정의된 테스트 데이터를 제공해야 하고, 테스트를 수행할 때 파라미터화된 테스트를 통해 그 데이터를 반복적으로 사용해야 한다면, 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 메서드는 TestCleanproperties 블록에서 파라미터화된 속성의 이름과 함께 새 데이터를 셀형 배열(또는 구조체)로 받습니다.

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
__________

참고 항목

|

관련 항목