Этот пример показывает, как создать пользовательский плагин, который считает количество передачи и провальных утверждений при выполнении заданного тестового набора. Плагин распечатывает краткий обзор в конце тестирования.
В файле в вашей рабочей папке создайте новый класс, AssertionCountingPlugin, который наследовался matlab.unittest.plugins.TestRunnerPlugin class. Для полной версии кода для 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
endclassdef 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. Фиксатор | matlab.unittest.plugins. OutputStream | matlab.unittest.plugins. TestRunnerPlugin