Main Content

스크립트 기반 단위 테스트 작성하기

이 예제에서는 사용자가 만든 함수를 테스트하는 스크립트를 작성하는 방법을 보여줍니다. 예제의 함수는 직각삼각형의 각도를 계산하는데, 여기서는 이 함수를 테스트하는 스크립트 기반 단위 테스트를 작성하겠습니다.

테스트할 rightTri 함수 생성하기

현재 MATLAB® 폴더에서 파일 rightTri.m에 다음 함수를 생성하십시오. 이 함수는 삼각형의 두 변의 길이를 입력값으로 받아 직각삼각형의 세 각의 값을 반환합니다. 입력 변은 삼각형의 빗변이 아닌 짧은 두 변입니다.

function angles = rightTri(sides)

A = atand(sides(1)/sides(2));
B = atand(sides(2)/sides(1));
hypotenuse = sides(1)/sind(A);
C = asind(hypotenuse*sind(A)/sides(1));

angles = [A B C];

end

테스트 스크립트 작성하기

작업 폴더에서 rightTriTest.m이라는 이름의 새 스크립트를 작성합니다. 각각의 단위 테스트는 서로 다른 rightTri 함수 출력값을 확인합니다. 테스트 스크립트는 다음과 같은 규칙을 따라야 합니다.

  • 테스트 파일의 이름은 'test'(대/소문자 구분 안 함)라는 단어로 시작하거나 끝나야 합니다. 파일 이름이 'test'라는 단어로 시작하거나 끝나지 않으면 파일에 포함된 테스트가 어떤 경우에는 무시될 수 있습니다.

  • 각각의 단위 테스트를 스크립트 파일의 별도의 섹션에 배치하도록 합니다. 각 섹션은 두 개의 퍼센트 기호(%%)로 시작하며, 같은 라인에서 뒤에 따라오는 텍스트가 테스트 요소의 이름이 됩니다. %% 뒤에 따라오는 텍스트가 없다면 MATLAB에서 테스트에 이름을 할당합니다. MATLAB에서 한 테스트가 실패하더라도 나머지 테스트는 실행됩니다.

  • 테스트 스크립트에서 공유 변수 섹션은 (첫 라인이 %%로 시작되는) 첫 번째 명시적 코드 섹션 앞에 나오는 코드로 구성됩니다. 이 섹션에서 정의하는 변수는 여러 테스트에서 공유됩니다. 하나의 테스트 내에서 이 변수의 값을 수정할 수 있습니다. 그러나, 후속 테스트에서는 이 값이 공유 변수 섹션에 정의된 값으로 재설정됩니다.

  • 공유 변수 섹션(첫 번째 코드 섹션)에서, 테스트에 필요한 사전 조건을 정의하도록 합니다. 입력값이나 출력값이 이 사전 조건에 부합하지 않는 경우 MATLAB은 아무런 테스트도 실행하지 않습니다. MATLAB은 테스트를 실패, 미완료 상태로 표시합니다.

  • 스크립트가 테스트로서 실행되는 경우, 하나의 테스트에서 정의된 변수는 공유 변수 섹션(첫 번째 코드 섹션) 내에 정의되지 않았다면 다른 테스트 내에서 액세스할 수 없습니다. 마찬가지로, 다른 작업 공간에서 정의된 변수에 대해 테스트가 액세스할 수 없습니다.

  • 스크립트 파일에 코드 섹션이 들어 있지 않은 경우 MATLAB은 스크립트 파일의 전체 내용에서 단일 테스트 요소를 생성합니다. 테스트 요소의 이름은 스크립트 파일 이름과 동일합니다. 이 경우, MATLAB에서 테스트 실패가 발생하면 전체 스크립트의 실행이 중단됩니다.

rightTriTest.m에서 네 개의 테스트를 작성하여 rightTri의 출력값을 테스트하십시오. 다른 조건을 테스트하려면 assert 함수를 사용하십시오. 공유 변수 섹션에서 네 개의 삼각형 기하를 정의하고 rightTri 함수가 직각삼각형을 반환하는 사전 조건을 정의하십시오.

% test triangles
tri = [7 9];
triIso = [4 4];
tri306090 = [2 2*sqrt(3)];
triSkewed = [1 1500];

% preconditions
angles = rightTri(tri);
assert(angles(3) == 90,'Fundamental problem: rightTri not producing right triangle')

%% Test 1: sum of angles
angles = rightTri(tri);
assert(sum(angles) == 180)
 
angles = rightTri(triIso);
assert(sum(angles) == 180)
 
angles = rightTri(tri306090);
assert(sum(angles) == 180)
 
angles = rightTri(triSkewed);
assert(sum(angles) == 180)

%% Test 2: isosceles triangles
angles = rightTri(triIso);
assert(angles(1) == 45)
assert(angles(1) == angles(2))
 
%% Test 3: 30-60-90 triangle
angles = rightTri(tri306090);
assert(angles(1) == 30)
assert(angles(2) == 60)
assert(angles(3) == 90)

%% Test 4: Small angle approximation
angles = rightTri(triSkewed);
smallAngle = (pi/180)*angles(1); % radians
approx = sin(smallAngle);
assert(approx == smallAngle, 'Problem with small angle approximation')

테스트 1에서는 삼각형 내 각의 합을 테스트합니다. 합이 180도와 같지 않으면 assert에서 오류를 발생시킵니다.

테스트 2에서는 두 변의 길이가 같은지, 해당 변의 각도가 같은지 여부를 테스트합니다. 직각이 아닌 각도가 둘 다 45도가 아닌 경우 assert 함수가 오류를 발생시킵니다.

테스트 3에서는 삼각형의 변이 1sqrt(3)이면, 각도가 30도, 60도, 90도인지 여부를 테스트합니다. 이 조건이 참이 아닌 경우 assert에서 오류를 발생시킵니다.

테스트 4에서는 작은각 근사를 테스트합니다. 작은각 근사에서는 작은 각도의 경우 각도(단위: 라디안)의 사인 값이 각도와 거의 동일하다고 봅니다. 만약 이것이 참이 아닌 경우, assert에서 오류를 발생시킵니다.

테스트 실행하기

rightTriTest.m의 네 개의 테스트를 실행하려면 runtests 함수를 실행하십시오. runtests 함수는 각 코드 섹션에 있는 각각의 테스트를 개별적으로 실행합니다. 테스트 1이 실패하더라도 MATLAB은 나머지 테스트를 실행합니다. runtests를 사용하는 대신 스크립트로 rightTriTest를 실행하는 경우, 어설션이 실패하면 MATLAB은 전체 스크립트의 실행을 중단합니다. 또한, runtests 함수를 사용하여 테스트를 실행하면 MATLAB은 많은 정보가 포함된 테스트 진단을 제공합니다.

result = runtests('rightTriTest');
Running rightTriTest
..
================================================================================
Error occurred in rightTriTest/Test3_30_60_90Triangle and it did not run to completion.
    ---------
    Error ID:
    ---------
    'MATLAB:assertion:failed'
    --------------
    Error Details:
    --------------
    Error using rightTriTest (line 31)
    Assertion failed.
================================================================================
.
================================================================================
Error occurred in rightTriTest/Test4_SmallAngleApproximation and it did not run to completion.
    ---------
    Error ID:
    ---------
    ''
    --------------
    Error Details:
    --------------
    Error using rightTriTest (line 39)
    Problem with small angle approximation
================================================================================
.
Done rightTriTest
__________

Failure Summary:

     Name                                        Failed  Incomplete  Reason(s)
    ===========================================================================
     rightTriTest/Test3_30_60_90Triangle           X         X       Errored.
    ---------------------------------------------------------------------------
     rightTriTest/Test4_SmallAngleApproximation    X         X       Errored.

30-60-90 삼각형에 대한 테스트와 작은각 근사에 대한 테스트는 부동소수점 숫자 비교에서 실패합니다. 통상적으로 부동소수점 값을 비교할 때는 비교를 위한 허용오차를 지정합니다. 테스트 3과 테스트 4에서 MATLAB은 어설션에 실패하면 오류를 발생시키고 테스트를 완료하지 않습니다. 따라서 이 테스트는 Failed, Incomplete로 표시됩니다.

'Assertion failed'(테스트 3)보다 더 자세한 정보가 포함된 진단 정보(Error Details)를 제공하려면, (테스트 4에서처럼) 메시지를 assert 함수에 전달해 보십시오. 또는, 함수 기반 단위 테스트를 사용할 수도 있습니다.

허용오차를 사용하도록 테스트 수정하기

rightTriTest.mrightTriTolTest.m으로 저장하고, 허용오차를 사용하도록 테스트 3과 테스트 4를 수정합니다. 테스트 3과 테스트 4에서 각도가 예상 값과 같다고 어설션하는 대신 실제 값과 예상 값의 차이가 지정된 허용오차보다 작거나 같다고 어설션하십시오. 두 테스트 모두가 액세스할 수 있도록 허용오차를 테스트 스크립트의 공유 변수 섹션에서 정의하십시오.

스크립트 기반 단위 테스트의 경우, 두 값 간의 지정된 허용오차보다 작은지 수동으로 확인하십시오. 함수 기반 단위 테스트를 작성하는 경우, 내장된 제약 조건에 액세스하여 부동소수점 값을 비교할 때의 허용오차를 지정할 수 있습니다.

% test triangles
tri = [7 9];
triIso = [4 4];
tri306090 = [2 2*sqrt(3)];
triSkewed = [1 1500];

% Define an absolute tolerance
tol = 1e-10; 
 
% preconditions
angles = rightTri(tri);
assert(angles(3) == 90,'Fundamental problem: rightTri not producing right triangle')

%% Test 1: sum of angles
angles = rightTri(tri);
assert(sum(angles) == 180)
 
angles = rightTri(triIso);
assert(sum(angles) == 180)
 
angles = rightTri(tri306090);
assert(sum(angles) == 180)
 
angles = rightTri(triSkewed);
assert(sum(angles) == 180)

%% Test 2: isosceles triangles
angles = rightTri(triIso);
assert(angles(1) == 45)
assert(angles(1) == angles(2))
 
%% Test 3: 30-60-90 triangle
angles = rightTri(tri306090);
assert(abs(angles(1)-30) <= tol)
assert(abs(angles(2)-60) <= tol)
assert(abs(angles(3)-90) <= tol)

%% Test 4: Small angle approximation
angles = rightTri(triSkewed);
smallAngle = (pi/180)*angles(1); % radians
approx = sin(smallAngle);
assert(abs(approx-smallAngle) <= tol, 'Problem with small angle approximation')

테스트를 다시 실행하십시오.

result = runtests('rightTriTolTest');
Running rightTriTolTest
....
Done rightTriTolTest
__________

모든 테스트 결과가 통과입니다.

테스트 결과를 테이블로 만드십시오.

rt = table(result)
rt =

  4×6 table

                          Name                           Passed    Failed    Incomplete    Duration       Details   
    _________________________________________________    ______    ______    __________    _________    ____________

    {'rightTriTolTest/Test1_SumOfAngles'            }    true      false       false         0.02373    {1×1 struct}
    {'rightTriTolTest/Test2_IsoscelesTriangles'     }    true      false       false       0.0047332    {1×1 struct}
    {'rightTriTolTest/Test3_30_60_90Triangle'       }    true      false       false       0.0051982    {1×1 struct}
    {'rightTriTolTest/Test4_SmallAngleApproximation'}    true      false       false       0.0049869    {1×1 struct}

참고 항목

|

관련 항목