Main Content

진단 세부 정보를 저장하는 플러그인 작성하기

이 예제에서는 진단 세부 정보를 저장하는 사용자 지정 플러그인을 만드는 방법을 보여줍니다. 이 플러그인은 테스트 실패를 수신하고 프레임워크에서 테스트가 완료되고 나면 사용자가 액세스할 수 있도록 진단 정보를 저장합니다.

플러그인 생성하기

작업 폴더의 파일 내에 matlab.unittest.plugins.TestRunnerPlugin 클래스로부터 상속하는 클래스 myPlugin을 생성합니다. 이 플러그인 클래스에서 다음을 수행할 수 있습니다.

  • 플러그인에 대해 실패한 테스트의 정보를 저장하는 FailedTestData 속성을 정의하십시오.

  • TestRunnerPlugin의 디폴트 createTestMethodInstance 메서드를 재정의하여 어설션(Assertion), 치명적 어설션(Fatal Assertion), 검증(Verification)의 실패를 수신하고 관련 정보를 기록합니다.

  • TestRunnerPlugin의 디폴트 runTestSuite 메서드를 재정의하여 FailedTestData 속성값을 초기화합니다. 이 속성의 값을 초기화하지 않는 경우, 동일한 테스트 실행기를 사용하여 테스트를 실행할 때마다 실패한 테스트 정보가 FailedTestData 속성에 추가됩니다.

  • 테스트 실패에 대한 정보를 테이블로 저장하도록 헬퍼 함수 recordData를 정의합니다.

이 플러그인은 PluginData 객체와 QualificationEventData 객체에 포함된 정보를 저장합니다. 또한 실패 유형과 타임스탬프도 저장합니다.

classdef DiagnosticRecorderPlugin < matlab.unittest.plugins.TestRunnerPlugin
    
    properties
        FailedTestData
    end
    
    methods (Access = protected)
        function runTestSuite(plugin, pluginData)
            plugin.FailedTestData = [];
            runTestSuite@...
                matlab.unittest.plugins.TestRunnerPlugin(plugin, pluginData);
        end
        
        function testCase = createTestMethodInstance(plugin, pluginData)
            testCase = createTestMethodInstance@...
                matlab.unittest.plugins.TestRunnerPlugin(plugin, pluginData);
            
            testName = pluginData.Name;
            testCase.addlistener('AssertionFailed', ...
                @(~,event)plugin.recordData(event,testName, 'Assertion'));
            testCase.addlistener('FatalAssertionFailed', ...
                @(~,event)plugin.recordData(event,testName, 'Fatal Assertion'));
            testCase.addlistener('VerificationFailed', ...
                @(~,event)plugin.recordData(event,testName, 'Verification'));
        end
    end
    
    methods (Access = private)
        function recordData(plugin,eventData,name,failureType)
            s.Name = {name};
            s.Type = {failureType};
            if isempty(eventData.TestDiagnosticResult)
                s.TestDiagnostics = 'TestDiagnostics not provided';
            else
                s.TestDiagnostics = eventData.TestDiagnosticResult;
            end
            s.FrameworkDiagnostics = eventData.FrameworkDiagnosticResult;
            s.Stack = eventData.Stack;
            s.Timestamp = datetime;
            
            plugin.FailedTestData = [plugin.FailedTestData; struct2table(s)];
        end
    end
end

테스트 클래스 생성하기

작업 폴더에서 다음 테스트 클래스가 포함된 파일 ExampleTest.m을 만드십시오.

classdef ExampleTest < matlab.unittest.TestCase
    methods(Test)
        function testOne(testCase)
            testCase.assertGreaterThan(5,10)
        end
        function testTwo(testCase)
            wrongAnswer = 'wrong';
            testCase.verifyEmpty(wrongAnswer,'Not Empty')
            testCase.verifyClass(wrongAnswer,'double','Not double')
        end
        
        function testThree(testCase)
            testCase.assertEqual(7*2,13,'Values not equal')
        end
        function testFour(testCase)
            testCase.fatalAssertEqual(3+2,6);
        end
    end
end

testFour에서 치명적 어설션(Fatal Assertion) 실패가 발생하면 프레임워크가 중단되고 오류가 발생합니다. 이 예제에는 후속 테스트가 없습니다. 후속 테스트가 있는 경우에도 프레임워크는 후속 테스트를 실행하지 않습니다.

테스트 실행기에 플러그인 추가하고 테스트 실행하기

명령 프롬프트에서, ExampleTest 클래스로부터 테스트 스위트를 만들고 테스트 실행기를 만드십시오.

import matlab.unittest.TestSuite
import matlab.unittest.TestRunner

suite = TestSuite.fromClass(?ExampleTest);
runner = TestRunner.withNoPlugins;

myPlugin의 인스턴스를 만들고 이를 테스트 실행기에 추가하십시오. 테스트를 실행하십시오.

p = DiagnosticRecorderPlugin;
runner.addPlugin(p)
result = runner.run(suite);
Error using ExampleTest/testFour (line 16)
Fatal assertion failed.

치명적 어설션(Fatal Assertion)이 실패하면 프레임워크에서 오류가 발생하고 테스트 실행기에서 TestResult 객체를 반환하지 않습니다. 그러나, DiagnosticRecorderPlugin은 실패한 어설션이 있는 테스트와 그 이전 테스트에 대한 정보를 저장합니다.

진단 정보 검사하기

명령 프롬프트에서 실패한 테스트에 대한 정보를 확인하십시오. 이 정보는 플러그인의 FailedTestData 속성에 저장됩니다.

T = p.FailedTestData
T =

  5×6 table

             Name                    Type                  TestDiagnostics                                                                                                                                                                FrameworkDiagnostics                                                                                                                                                           Stack             Timestamp      
    _______________________    _________________    ______________________________    ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________    ____________    ____________________

    'ExampleTest/testOne'      'Assertion'          'TestDiagnostics not provided'    'assertGreaterThan failed.↵--> The value must be greater than the minimum value.↵↵Actual Value:↵     5↵Minimum Value (Exclusive):↵    10'                                                                                                                                                                                       [1x1 struct]    17-Jul-2017 12:41:18
    'ExampleTest/testTwo'      'Verification'       'Not Empty'                       'verifyEmpty failed.↵--> The value must be empty.↵--> The value has a size of [1  5].↵↵Actual char:↵    wrong'                                                                                                                                                                                                                  [1x1 struct]    17-Jul-2017 12:41:18
    'ExampleTest/testTwo'      'Verification'       'Not double'                      'verifyClass failed.↵--> The value's class is incorrect.↵    ↵    Actual Class:↵        char↵    Expected Class:↵        double↵↵Actual char:↵    wrong'                                                                                                                                                                        [1x1 struct]    17-Jul-2017 12:41:18
    'ExampleTest/testThree'    'Assertion'          'Values not equal'                'assertEqual failed.↵--> The values are not equal using "isequaln".↵--> Failure table:↵        Actual    Expected    Error      RelativeError   ↵        ______    ________    _____    __________________↵    ↵        14        13          1        0.0769230769230769↵↵Actual Value:↵    14↵Expected Value:↵    13'         [1x1 struct]    17-Jul-2017 12:41:18
    'ExampleTest/testFour'     'Fatal Assertion'    'TestDiagnostics not provided'    'fatalAssertEqual failed.↵--> The values are not equal using "isequaln".↵--> Failure table:↵        Actual    Expected    Error      RelativeError   ↵        ______    ________    _____    __________________↵    ↵        5         6           -1       -0.166666666666667↵↵Actual Value:↵     5↵Expected Value:↵     6'    [1x1 struct]    17-Jul-2017 12:41:18

이 정보를 보관하거나 후처리하는 방법은 많습니다. 예를 들어, 변수를 MAT 파일로 저장하거나 writetable을 사용하여 .txt, .csv, .xls와 같은 다양한 파일 형식으로 테이블을 작성할 수 있습니다.

세 번째 테스트 실패에 대한 스택 정보를 확인하십시오.

T.Stack(3)
ans = 

  struct with fields:

    file: 'C:\Work\ExampleTest.m'
    name: 'ExampleTest.testTwo'
    line: 9

다섯 번째 테스트 실패에 대해 프레임워크가 보여주는 진단을 표시하십시오.

celldisp(T.FrameworkDiagnostics(5))
ans{1} =
 
fatalAssertEqual failed.
--> The values are not equal using "isequaln".
--> Failure table:
        Actual    Expected    Error      RelativeError   
        ______    ________    _____    __________________
    
        5         6           -1       -0.166666666666667

Actual Value:
     5
Expected Value:
     6

참고 항목

| | |

관련 항목