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