Напишите плагин, чтобы сохранить диагностические данные

В этом примере показано, как создать пользовательский плагин для сохранения диагностических данных. Плагин прослушивает непройденные тесты и сохраняет диагностическую информацию, чтобы вы могли получить к нему доступ после завершения тестов в среде.

Создайте плагин

В файле в рабочей папке создайте класс, 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

См. также

| | |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте