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