В этом примере показано, как создать пользовательский плагин, который подсчитывает количество проходных и неудачных утверждений при TestRunner запускает набор тестов. Плагин печатает краткое резюме в конце тестирования. Для расширения TestRunner, подклассы плагинов и переопределения выбирают методы matlab.unittest.plugins.TestRunnerPlugin класс.
В файле текущей папки создайте класс пользовательского подключаемого модуля AssertionCountingPlugin, которая наследует от TestRunnerPlugin класс. Полный код для AssertionCountingPlugin, см. Утверждение Описание класса подключаемого модуля.
Чтобы отслеживать количество проходных и неудачных утверждений, определите два свойства только для чтения, NumPassingAssertions и NumFailingAssertions, в пределах properties блок.
properties (SetAccess = private) NumPassingAssertions NumFailingAssertions end
Реализация 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
Простираться 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
В командной строке создайте набор тестов из 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
addlistener | matlab.unittest.fixtures.Fixture | matlab.unittest.plugins.OutputStream | matlab.unittest.plugins.TestRunnerPlugin | matlab.unittest.TestCase | matlab.unittest.TestRunner