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

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

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

В файле в вашей рабочей папке создайте класс, myPlugin, который наследовался классу matlab.unittest.plugins.TestRunnerPlugin. В сменном классе:

  • Задайте свойство 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, .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

Смотрите также

| | |

Похожие темы