В этом примере показано, как создать пользовательский плагин, который подсчитывает количество проходящих и неудачных утверждений, когда 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
helper methods, добавьте прослушиватели, необходимую для плагина, к возвращенной 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