Этот пример показывает, как создать пользовательский плагин, который считает количество передачи и провальных утверждений при выполнении заданного тестового набора. Плагин распечатывает краткий обзор в конце тестирования.
В файле в вашей рабочей папке создайте новый класс, AssertionCountingPlugin
, который наследовался классу matlab.unittest.plugins.TestRunnerPlugin
. Для полной версии кода для AssertionCountingPlugin
см. "Сводные данные Определения класса AssertionCountingPlugin".
Отслеживайте количество передачи и провальных утверждений. В блоке properties
создайте свойства NumPassingAssertions
и NumFailingAssertions
передать данные между методами.
properties
NumPassingAssertions = 0;
NumFailingAssertions = 0;
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
отображается, утверждение считают сводные данные.
Добавьте прослушиватели событий AssertionPassed
и AssertionFailed
, чтобы считать утверждения. Чтобы добавить эти прослушиватели, расширьте методы что использование среды тестирования, чтобы создать содержание теста. Содержание теста включает экземпляры TestCase
для каждого элемента Test
, уровень класса экземпляры TestCase
для TestClassSetup
и методов TestClassTeardown
, и экземпляры Fixture
, которые используются, когда класс TestCase
имеет атрибут SharedTestFixtures
.
Вызовите соответствующий метод суперкласса, когда вы замените методы создания. Методы создания возвращают содержимое, которое среда тестирования создает для каждого из их соответствующих контекстов. При реализации одного из этих методов передайте этот аргумент из собственной реализации и добавьте прослушиватели, требуемые этим плагином.
Добавьте эти методы создания для блока 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
. Как все сменные методы, когда вы заменяете этот метод, необходимо вызвать соответствующий метод суперкласса.
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
classdef AssertionCountingPlugin < ... matlab.unittest.plugins.TestRunnerPlugin properties NumPassingAssertions = 0; NumFailingAssertions = 0; 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);
Создайте исполнителя тестов без плагинов. Этот код создает тихого бегуна и предоставляет вам полный контроль над установленными плагинами.
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.TestCase
| matlab.unittest.TestRunner
| matlab.unittest.fixtures.Fixture
| matlab.unittest.plugins.OutputStream
| matlab.unittest.plugins.TestRunnerPlugin