Main Content

설정 함수와 해제 함수를 사용하여 테스트 작성하기

이 예제에서는 파일 픽스처(Fixture)와 새로운 픽스처를 사용하여 몇 가지 MATLAB® Figure 속성에 대한 단위 테스트를 작성하는 방법을 보여줍니다.

axesPropertiesTest.m 파일 생성하기

Figure 속성을 테스트하는 메인 함수가 있는 파일을 만들고 이에 두 개의 테스트 함수를 포함시키십시오. 한 함수는 x축 제한이 올바른지 확인하고, 다른 함수는 곡면의 면 색이 올바른지 확인합니다.

MATLAB 경로에 있는 폴더에 axesPropertiesTest.m을 만드십시오. 이 파일의 메인 함수에서 functiontestslocalfunctions 함수 호출을 통해 axesPropertiesTest.m의 각 로컬 함수에서 테스트 배열을 만들도록 합니다.

function tests = axesPropertiesTest
tests = functiontests(localfunctions);
end

파일 픽스처(Fixture) 함수 생성하기

파일 픽스처 함수는 테스트 파일에서 한 번 실행되는 설정 코드와 해제 코드입니다. 이 픽스처는 테스트 파일 전체에 공유됩니다. 이 예제에서는 파일 픽스처 함수가 임시 폴더를 만들고 이 폴더를 현재 작업 폴더로 설정합니다. 또한, 테스트 목적으로 새 Figure를 만들어 저장합니다. 테스트가 완료된 후에는 프레임워크가 원본 작업 폴더를 복구하고 임시 폴더와 저장한 Figure를 삭제합니다.

이 예제에서는 헬퍼 함수가 간단한 Figure, 즉 빨간색 원통을 만듭니다. 보다 현실적인 시나리오에서, 이 코드는 테스트 중인 제품의 일부이며 많은 계산량을 필요로 합니다. 따라서, Figure를 한 번만 만들어 각 테스트 함수에 대해 결과의 독립 복사본을 불러오는 것이 좋습니다. 그러나 이 예제에서는 이 헬퍼 함수를 axesPropertiesTest에 대한 로컬 함수로 만들겠습니다. 참고로, 이 함수의 이름이 ‘test’로 시작하거나 끝나지 않기 때문에 테스트 배열에는 이 함수가 포함되지 않습니다.

간단한 빨간색 원통을 만드는 헬퍼 함수를 작성하여 axesPropertiesTest에 대한 로컬 함수로 이 헬퍼 함수를 추가하십시오.

function f = createFigure
f = figure;
ax = axes('Parent',f);
cylinder(ax,10)
h = findobj(ax,'Type','surface');
h.FaceColor = [1 0 0];
end

파일 테스트 픽스처의 설정 함수와 해제 함수를 각각 setupOnceteardownOnce라고 명명해야 합니다. 이러한 함수는 테스트 프레임워크가 함수 테스트 케이스 객체에 자동으로 전달하는 단일 입력 인수 testCase를 받습니다. 이 테스트 케이스 객체에는 설정 함수, 테스트 함수, 해제 함수 간 데이터 전달을 허용하는 TestData 구조체가 들어 있습니다. 이 예제에서는 TestData 구조체가 할당된 필드를 사용하여 원래 경로, 임시 폴더 이름, Figure 파일 이름을 저장합니다.

axesPropertiesTest에 대한 로컬 함수로 설정 함수와 해제 함수를 만드십시오.

function setupOnce(testCase)
% Create and change to temporary folder
testCase.TestData.origPath = pwd;
testCase.TestData.tmpFolder = "tmpFolder" + ...
    string(datetime('now','Format',"yyyyMMdd'T'HHmmss"));
mkdir(testCase.TestData.tmpFolder)
cd(testCase.TestData.tmpFolder)
% Create and save a figure
testCase.TestData.figName = 'tmpFig.fig';
aFig = createFigure;
saveas(aFig,testCase.TestData.figName)
close(aFig)
end

function teardownOnce(testCase)
delete(testCase.TestData.figName)
cd(testCase.TestData.origPath)
rmdir(testCase.TestData.tmpFolder)
end

새로운 픽스처(Fixture) 함수 생성하기

새로운 픽스처(Fixture)는 파일에서 각 테스트 함수의 이전과 이후에 실행되는 함수 레벨의 설정 코드와 해제 코드입니다. 다음 예제에서 함수는 저장된 Figure를 열고 핸들을 찾습니다. 테스트 후, 프레임워크는 Figure를 닫습니다.

새로운 픽스처 함수를 각각 setupteardown으로 명명해야 합니다. 파일 픽스처 함수와 유사하게, 이들 함수도 단일 입력 인수 testCase를 받습니다. 이 예제에서는 이러한 함수가 TestData 구조체에 Figure와 축에 대한 핸들을 포함하는 새 필드를 만듭니다. 이렇게 하면 설정 함수, 테스트 함수, 해제 함수 간 정보 전달이 가능합니다.

axesPropertiesTest에 대한 로컬 함수로 설정 함수와 해제 함수를 만드십시오. 테스트의 독립성을 위해 각각의 테스트에 대해 저장된 Figure를 따로 여십시오.

function setup(testCase)
testCase.TestData.Figure = openfig(testCase.TestData.figName);
testCase.TestData.Axes = findobj(testCase.TestData.Figure, ...
    'Type','Axes');
end

function teardown(testCase)
close(testCase.TestData.Figure)
end

사용자 지정 설정 코드와 해제 코드 외에도, 테스트 프레임워크는 픽스처 생성을 위한 일부 클래스를 제공합니다. 자세한 내용은 matlab.unittest.fixtures 항목을 참조하십시오.

테스트 함수 생성하기

각각의 테스트는 함수 이름 시작이나 끝 부분에 ‘test’를 넣는 명명 규칙을 따르는 로컬 함수입니다. 테스트 배열에는 이 규칙을 따르지 않는 로컬 함수가 포함되지 않습니다. 설정 함수나 해제 함수와 유사하게, 개별 테스트 함수는 단일 입력 인수 testCase를 받아야 합니다. 검증(Verification), 어설션(Assertion), 가정(Assumption), 치명적 어설션(Fatal Assertion)에 대해 이 테스트 케이스 객체를 사용하십시오.

testDefaultXLim 함수는 x축 제한이 원통을 표시할 정도로 충분히 큰지를 확인합니다. 하한은 -10보다 작아야 하고, 상한은 10보다 커야 합니다. 이러한 값은 헬퍼 함수에서 생성된 Figure, 즉 원점에 중심이 있고 반지름이 10 단위인 원통에서 나옵니다. 이 테스트 함수는 setupOnce 함수에서 생성되고 저장된 Figure를 열고, 좌표축 제한을 쿼리하고, 이 제한값이 올바른지 확인합니다. 가설 검정(Qualification) 함수 verifyLessThanOrEqualverifyGreaterThanOrEqual은 실패가 발생한 경우 테스트 케이스, 실제 값, 예상 값, 선택적 진단 정보를 입력값으로 받습니다.

axesPropertiesTest에 대한 로컬 함수로 testDefaultXLim 함수를 만드십시오.

function testDefaultXLim(testCase)
xlim = testCase.TestData.Axes.XLim;
verifyLessThanOrEqual(testCase,xlim(1),-10, ...
    'Minimum x-limit was not small enough')
verifyGreaterThanOrEqual(testCase,xlim(2),10, ...
    'Maximum x-limit was not large enough')
end

surfaceColorTest 함수는 사용자가 setupOnce 함수에서 만들고 저장한 Figure에 액세스합니다. surfaceColorTest는 원통의 면 색을 쿼리하여 빨간색임을 검증합니다. 빨간색은 RGB 값이 [1 0 0]입니다. 가설 검정(Qualification) 함수 verifyEqual은 실패가 발생한 경우 테스트 케이스, 실제 값, 예상 값, 선택적 진단 정보를 입력값으로 받습니다. 통상적으로 부동소수점 값에 verifyEqual을 사용할 때는 비교를 위한 허용오차를 지정합니다. 자세한 내용은 matlab.unittest.constraints 항목을 참조하십시오.

axesPropertiesTest에 대한 로컬 함수로 surfaceColorTest 함수를 만드십시오.

function surfaceColorTest(testCase)
h = findobj(testCase.TestData.Axes,'Type','surface');
co = h.FaceColor;
verifyEqual(testCase,co,[1 0 0],'Face color is incorrect')
end

이제 메인 함수, 헬퍼 함수,파일 픽스처(Fixture) 함수, 새로운 픽스처 함수, 두 개의 테스트 함수를 포함하는 axesPropertiesTest.m 파일이 완성되었습니다. 테스트를 실행할 준비가 되었습니다.

테스트 실행하기

그 다음 단계는 runtests 함수를 사용하여 테스트를 실행하는 것입니다. 이 예제에서는 runtests를 호출하면 다음의 단계를 거치게 됩니다.

  1. 메인 함수가 테스트 배열을 만듭니다.

  2. 파일 픽스처 설정이 작업 폴더를 기록하고, 임시 폴더를 만들고, 임시 폴더를 작업 폴더로 설정한 다음, Figure를 생성하고 저장합니다.

  3. 새로운 픽스처 설정(Setup) 함수가 저장된 Figure를 열고 핸들을 찾습니다.

  4. testDefaultXLim 테스트가 실행됩니다.

  5. 새로운 픽스처 해제(Teardown) 함수가 Figure를 닫습니다.

  6. 새로운 픽스처 설정(Setup) 함수가 저장된 Figure를 열고 핸들을 찾습니다.

  7. surfaceColorTest 테스트가 실행됩니다.

  8. 새로운 픽스처 해제(Teardown) 함수가 Figure를 닫습니다.

  9. 파일 픽스처 해제(Teardown) 함수는 저장된 Figure를 삭제하고, 원래 경로로 다시 변경하고, 임시 폴더를 삭제합니다.

명령 프롬프트에서 테스트 스위트(Test Suite)를 생성하여 실행하십시오.

results = runtests('axesPropertiesTest.m')
Running axesPropertiesTest
..
Done axesPropertiesTest
__________
results = 
  1×2 TestResult array with properties:

    Name
    Passed
    Failed
    Incomplete
    Duration
    Details

Totals:
   2 Passed, 0 Failed, 0 Incomplete.
   0.5124 seconds testing time.

테스트 결과를 테이블로 생성하기

테이블에서 사용할 수 있는 기능에 액세스하려면 TestResult 객체에서 테이블을 만드십시오.

rt = table(results)
rt=2×6 table
                     Name                      Passed    Failed    Incomplete    Duration      Details   
    _______________________________________    ______    ______    __________    ________    ____________

    {'axesPropertiesTest/testDefaultXLim' }    true      false       false       0.35239     {1×1 struct}
    {'axesPropertiesTest/surfaceColorTest'}    true      false       false       0.16001     {1×1 struct}

테스트 결과를 기간 오름차순으로 정렬합니다.

sortrows(rt,'Duration')
ans=2×6 table
                     Name                      Passed    Failed    Incomplete    Duration      Details   
    _______________________________________    ______    ______    __________    ________    ____________

    {'axesPropertiesTest/surfaceColorTest'}    true      false       false       0.16001     {1×1 struct}
    {'axesPropertiesTest/testDefaultXLim' }    true      false       false       0.35239     {1×1 struct}

아래와 같이 테스트 결과를 Excel® 스프레드시트로 내보내십시오.

writetable(rt,'myTestResults.xls')

참고 항목

|

관련 항목