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

В этом примере показано, как создать пользовательский плагин, который подсчитывает количество проходящих и неудачных утверждений, когда 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 helper methods, добавьте прослушиватели, необходимую для плагина, к возвращенной 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

Расширение работы элемента Single Тестовый Набор

Расширение 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 access, задайте три вспомогательных метода. Эти методы увеличивают количество проходящих или неудачных утверждений и печатают сводные данные количества утверждений.

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

Добавьте плагин к TestRunner и запустите тесты

В командной строке создайте тестовый набор из 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

См. также

| | | | |

Похожие темы

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