사용자 지정 플러그인 생성하기
이 예제에서는 TestRunner
가 테스트 스위트를 실행할 때 통과 어설션 및 실패 어설션의 개수를 세는 사용자 지정 플러그인을 만드는 방법을 보여줍니다. 이 플러그인은 테스트가 끝나면 간략한 요약을 출력합니다. TestRunner
를 확장하기 위해 플러그인은 matlab.unittest.plugins.TestRunnerPlugin
클래스의 선택 메서드를 서브클래스화하고 재정의합니다.
AssertionCountingPlugin 클래스 생성하기
현재 폴더의 파일에서, TestRunnerPlugin
클래스에서 상속되는 사용자 지정 플러그인 클래스 AssertionCountingPlugin
을 생성하십시오. AssertionCountingPlugin
에 대한 전체 코드를 보려면 AssertionCountingPlugin 클래스 정의 요약을 참조하십시오.
통과 어설션 및 실패 어설션의 개수를 추적하려면 properties
블록 내에서 두 개의 읽기 전용 속성 NumPassingAssertions
와 NumFailingAssertions
를 정의하십시오.
properties (SetAccess = private) NumPassingAssertions NumFailingAssertions end
TestSuite 실행 확장하기
protected
액세스 권한이 있는 methods
블록에서 runTestSuite
메서드를 구현하십시오.
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
를 호출하여 어설션 개수 요약을 표시합니다. (헬퍼 메서드 정의하기 항목을 참조하십시오.)
공유 테스트 픽스처(Fixture)와 TestCase 인스턴스 생성 확장하기
어설션을 셀 수 있도록 AssertionPassed
이벤트와 AssertionFailed
이벤트에 리스너를 추가하십시오. 이러한 리스너를 추가하려면 테스트 콘텐츠를 생성하기 위해 테스트 프레임워크에서 사용하는 메서드를 확장하십시오. 테스트 콘텐츠에는 각 Test
요소에 대한 TestCase
인스턴스, TestClassSetup
메서드와 TestClassTeardown
메서드에 대한 클래스 레벨 TestCase
인스턴스, TestCase
클래스에 SharedTestFixtures
특성(Attribute)이 있을 때 사용되는 Fixture
인스턴스가 포함됩니다.
생성(Creation) 메서드를 무시할 때는 상응하는 슈퍼클래스 메서드를 불러오십시오. 생성 메서드는 테스트 프레임워크가 각각의 맥락에 맞춰 생성하는 콘텐츠를 반환합니다. incrementPassingAssertionsCount
헬퍼 메서드와 incrementFailingAssertionsCount
헬퍼 메서드를 사용하여 이러한 메서드 중 하나를 구현할 때는 플러그인에 요구되는 리스너를 반환된 Fixture
인스턴스 또는 TestCase
인스턴스에 추가하십시오.
protected
액세스 권한이 있는 methods
블록에 이 생성 메서드를 추가하십시오.
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
를 확장하십시오. protected
액세스 권한이 있는 methods
블록에 이 메서드를 포함시키십시오. 모든 플러그인 메서드와 마찬가지로, runTest
메서드에서는 상응하는 슈퍼클래스 메서드를 불러와야 합니다.
methods (Access = protected) function runTest(plugin, pluginData) fprintf('### Running test: %s\n', pluginData.Name) runTest@matlab.unittest.plugins.TestRunnerPlugin(... plugin, pluginData); end end
헬퍼 메서드 정의하기
private
액세스 권한이 있는 methods
블록에서 세 개의 헬퍼 메서드를 정의하십시오. 이러한 메서드는 통과 어설션이나 실패 어설션의 개수를 늘리고 어설션 수 요약을 출력합니다.
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 클래스 정의 요약
다음 코드는 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
TestRunner에 플러그인 추가하고 테스트 실행하기
명령 프롬프트에서, 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.automation.streams.OutputStream
| matlab.unittest.TestCase
| matlab.unittest.TestRunner
| matlab.unittest.fixtures.Fixture
| addlistener