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