진단 세부 정보를 저장하는 플러그인 작성하기
이 예제에서는 진단 세부 정보를 저장하는 사용자 지정 플러그인을 만드는 방법을 보여줍니다. 이 플러그인은 테스트 실패를 수신하고 프레임워크에서 테스트가 완료되고 나면 사용자가 액세스할 수 있도록 진단 정보를 저장합니다.
플러그인 생성하기
작업 폴더의 파일 내에 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
참고 항목
matlab.unittest.plugins.TestRunnerPlugin
| matlab.unittest.TestCase
| matlab.unittest.TestRunner
| addlistener