exponenta event banner

Создание пользовательского подключаемого модуля

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

Создать класс подключаемого модуля AssertureExhibitedPlugin

В файле текущей папки создайте класс пользовательского подключаемого модуля AssertionCountingPlugin, которая наследует от TestRunnerPlugin класс. Полный код для AssertionCountingPlugin, см. Утверждение Описание класса подключаемого модуля.

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

properties (SetAccess = private)
    NumPassingAssertions
    NumFailingAssertions
end

Расширение режима работы Test Suite

Реализация 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 (см. раздел Определение вспомогательных методов).

Расширение возможностей создания общих тестовых приборов и экземпляров, связанных с,

Добавить прослушиватели в 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

Расширение режима работы элемента Single Test Suite

Простираться 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.

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

Добавление подключаемого модуля в Test Runner и выполнение тестов

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

См. также

| | | | |

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