Этот пример показывает, как создать пользовательский плагин, чтобы сохранить диагностические данные. Плагин прислушивается к непройденным тестам и сохраняет диагностическую информацию, таким образом, можно получить доступ к нему после того, как среда завершает тесты.
В файле в вашей рабочей папке создайте класс, myPlugin
, который наследовался matlab.unittest.plugins.TestRunnerPlugin
class. В сменном классе:
Задайте свойство FailedTestData
на плагине, который хранит информацию от проваленных тестов.
Замените метод createTestMethodInstance
по умолчанию TestRunnerPlugin
, чтобы прислушаться к утверждению, критическому утверждению и отказам верификации, и записать релевантную информацию.
Замените метод runTestSuite
по умолчанию TestRunnerPlugin
, чтобы инициализировать значение свойства FailedTestData
. Если вы не инициализируете значение свойства, каждый раз, когда вы запускаете тесты с помощью того же исполнителя тестов, отказавшая информация о тесте добавлена к свойству FailedTestData
.
Задайте функцию помощника, recordData
, чтобы сохранить информацию о непройденном тесте как таблица.
Плагин сохраняет информацию, содержавшуюся в объектах QualificationEventData
и PluginData
. Это также сохраняет тип отказа и метки времени.
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
заставляет среду останавливать и выдавать ошибку. В этом примере нет никаких последующих тестов. Если бы был последующий тест, среда не запустила бы его.
В командной строке создайте тестовый набор из класса 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.
С не пройдено критическим утверждением среда выдает ошибку, и исполнитель тестов не возвращает объект 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
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
addlistener
| matlab.unittest. TestCase
| matlab.unittest. TestRunner
| matlab.unittest.plugins. TestRunnerPlugin