exponenta event banner

Записать подключаемый модуль для сохранения сведений диагностики

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

Создать подключаемый модуль

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

См. также

| | |

Связанные темы