Создание пользовательского плагина

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

Создание класса AssertionCountingPlugin

В файле в вашей текущей папке создайте пользовательский сменный класс AssertionCountingPlugin, который наследовался TestRunnerPlugin класс. Для полного кода для AssertionCountingPlugin, см. Сводные данные Определения класса AssertionCountingPlugin.

Чтобы отслеживать количество передачи и провальных утверждений, задайте два свойства только для чтения, NumPassingAssertions и NumFailingAssertions, в properties блок.

properties (SetAccess = private)
    NumPassingAssertions
    NumFailingAssertions
end

Расширенная работа TestSuite

Реализуйте runTestSuite метод в methods блокируйтесь с protected доступ.

methods (Access = protected)
    function runTestSuite(plugin, pluginData)
        suiteSize = numel(pluginData.TestSuite);
        fprintf('## Running a total of %d tests\n', suiteSize)

        plugin.NumPassingAssertions = 0;
        plugin.NumFailingAssertions = 0;

        runTestSuite@matlab.unittest.plugins.TestRunnerPlugin(...
            plugin, pluginData);

        fprintf('## Done running tests\n')
        plugin.printAssertionSummary()
    end
end

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

Расширение создания разделяемых испытательных стендов и экземпляров TestCase

Добавьте прослушиватели AssertionPassed и AssertionFailed события, чтобы считать утверждения. Чтобы добавить эти прослушиватели, расширьте методы, используемые средой тестирования, чтобы создать содержание теста. Содержание теста включает TestCase экземпляры для каждого Test элемент, уровень класса TestCase экземпляры для TestClassSetup и TestClassTeardown методы и Fixture экземпляры, используемые, когда TestCase класс имеет SharedTestFixtures атрибут.

Вызовите соответствующий метод суперкласса, когда вы замените методы создания. Методы создания возвращают содержимое, которое среда тестирования создает для каждого из их соответствующих контекстов. При реализации одного из этих методов с помощью incrementPassingAssertionsCount и incrementFailingAssertionsCount вспомогательные методы, добавляют прослушиватели, требуемые плагином к возвращенному Fixture или TestCase экземпляр.

Добавьте эти методы создания для methods блокируйтесь с protected доступ.

methods (Access = protected)
    function fixture = createSharedTestFixture(plugin, pluginData)
        fixture = createSharedTestFixture@...
            matlab.unittest.plugins.TestRunnerPlugin(plugin, pluginData);

        fixture.addlistener('AssertionPassed', ...
            @(~,~)plugin.incrementPassingAssertionsCount);
        fixture.addlistener('AssertionFailed', ...
            @(~,~)plugin.incrementFailingAssertionsCount);
    end

    function testCase = createTestClassInstance(plugin, pluginData)
        testCase = createTestClassInstance@...
            matlab.unittest.plugins.TestRunnerPlugin(plugin, pluginData);

        testCase.addlistener('AssertionPassed', ...
            @(~,~)plugin.incrementPassingAssertionsCount);
        testCase.addlistener('AssertionFailed', ...
            @(~,~)plugin.incrementFailingAssertionsCount);
    end

    function testCase = createTestMethodInstance(plugin, pluginData)
        testCase = createTestMethodInstance@...
            matlab.unittest.plugins.TestRunnerPlugin(plugin, pluginData);

        testCase.addlistener('AssertionPassed', ...
            @(~,~)plugin.incrementPassingAssertionsCount);
        testCase.addlistener('AssertionFailed', ...
            @(~,~)plugin.incrementFailingAssertionsCount);
    end
end

Расширенная работа единственного элемента тестового набора

Расширьте runTest отобразить имя каждого теста во время выполнения. Включайте этот метод в methods блокируйтесь с protected доступ. Как все сменные методы, runTest метод требует, чтобы вы вызвали соответствующий метод суперкласса.

methods (Access = protected)
    function runTest(plugin, pluginData)
        fprintf('### Running test: %s\n', pluginData.Name)

        runTest@matlab.unittest.plugins.TestRunnerPlugin(...
            plugin, pluginData);
    end
end

Задайте вспомогательные методы

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

methods (Access = private)
    function incrementPassingAssertionsCount(plugin)
        plugin.NumPassingAssertions = plugin.NumPassingAssertions + 1;
    end

    function incrementFailingAssertionsCount(plugin)
        plugin.NumFailingAssertions = plugin.NumFailingAssertions + 1;
    end

    function printAssertionSummary(plugin)
        fprintf('%s\n', repmat('_', 1, 30))
        fprintf('Total Assertions: %d\n', ...
            plugin.NumPassingAssertions + plugin.NumFailingAssertions)
        fprintf('\t%d Passed, %d Failed\n', ...
            plugin.NumPassingAssertions, plugin.NumFailingAssertions)
    end
end

Сводные данные определения класса AssertionCountingPlugin

Следующий код предоставляет полное содержимое AssertionCountingPlugin.

classdef AssertionCountingPlugin < ...
        matlab.unittest.plugins.TestRunnerPlugin
    
    properties (SetAccess = private)
        NumPassingAssertions
        NumFailingAssertions
    end
    
    methods (Access = protected)
        function runTestSuite(plugin, pluginData)
            suiteSize = numel(pluginData.TestSuite);
            fprintf('## Running a total of %d tests\n', suiteSize)
            
            plugin.NumPassingAssertions = 0;
            plugin.NumFailingAssertions = 0;
            
            runTestSuite@matlab.unittest.plugins.TestRunnerPlugin(...
                plugin, pluginData);
            
            fprintf('## Done running tests\n')
            plugin.printAssertionSummary()
        end
        
        function fixture = createSharedTestFixture(plugin, pluginData)
            fixture = createSharedTestFixture@...
                matlab.unittest.plugins.TestRunnerPlugin(plugin, pluginData);
            
            fixture.addlistener('AssertionPassed', ...
                @(~,~)plugin.incrementPassingAssertionsCount);
            fixture.addlistener('AssertionFailed', ...
                @(~,~)plugin.incrementFailingAssertionsCount);
        end
        
        function testCase = createTestClassInstance(plugin, pluginData)
            testCase = createTestClassInstance@...
                matlab.unittest.plugins.TestRunnerPlugin(plugin, pluginData);
            
            testCase.addlistener('AssertionPassed', ...
                @(~,~)plugin.incrementPassingAssertionsCount);
            testCase.addlistener('AssertionFailed', ...
                @(~,~)plugin.incrementFailingAssertionsCount);
        end
        
        function testCase = createTestMethodInstance(plugin, pluginData)
            testCase = createTestMethodInstance@...
                matlab.unittest.plugins.TestRunnerPlugin(plugin, pluginData);
            
            testCase.addlistener('AssertionPassed', ...
                @(~,~)plugin.incrementPassingAssertionsCount);
            testCase.addlistener('AssertionFailed', ...
                @(~,~)plugin.incrementFailingAssertionsCount);
        end
        
        function runTest(plugin, pluginData)
            fprintf('### Running test: %s\n', pluginData.Name)
            
            runTest@matlab.unittest.plugins.TestRunnerPlugin(...
                plugin, pluginData);
        end 
    end
    
    methods (Access = private)
        function incrementPassingAssertionsCount(plugin)
            plugin.NumPassingAssertions = plugin.NumPassingAssertions + 1;
        end
        
        function incrementFailingAssertionsCount(plugin)
            plugin.NumFailingAssertions = plugin.NumFailingAssertions + 1;
        end
        
        function printAssertionSummary(plugin)
            fprintf('%s\n', repmat('_', 1, 30))
            fprintf('Total Assertions: %d\n', ...
                plugin.NumPassingAssertions + plugin.NumFailingAssertions)
            fprintf('\t%d Passed, %d Failed\n', ...
                plugin.NumPassingAssertions, plugin.NumFailingAssertions)
        end
    end
end

Создание тестового класса в качестве примера

В вашей текущей папке создайте файл с именем ExampleTest.m содержа следующий тестовый класс.

classdef ExampleTest < matlab.unittest.TestCase
    methods(Test)
        function testOne(testCase)  % Test fails
            testCase.assertEqual(5, 4)
        end
        function testTwo(testCase)  % Test passes
            testCase.verifyEqual(5, 5)
        end
        function testThree(testCase)  % Test passes
            testCase.assertEqual(7*2, 14)
        end
    end
end

Добавление плагина к исполнителю тестов и запущенным тестам

В командной строке создайте тестовый набор из ExampleTest класс.

import matlab.unittest.TestSuite
import matlab.unittest.TestRunner

suite = TestSuite.fromClass(?ExampleTest);

Создайте TestRunner экземпляр без плагинов. Этот код создает тихого бегуна и дает вам контроль над установленными плагинами.

runner = TestRunner.withNoPlugins;

Запуск тестов.

result = runner.run(suite);

Добавьте AssertionCountingPlugin бегуну и запущенный тесты.

runner.addPlugin(AssertionCountingPlugin)
result = runner.run(suite);
## Running a total of 3 tests
### Running test: ExampleTest/testOne
### Running test: ExampleTest/testTwo
### Running test: ExampleTest/testThree
## Done running tests
______________________________
Total Assertions: 2
	1 Passed, 1 Failed

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

| | | | |

Похожие темы