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