Main Content

사용자 지정 플러그인 생성하기

이 예제에서는 TestRunner가 테스트 스위트를 실행할 때 통과 어설션 및 실패 어설션의 개수를 세는 사용자 지정 플러그인을 만드는 방법을 보여줍니다. 이 플러그인은 테스트가 끝나면 간략한 요약을 출력합니다. TestRunner를 확장하기 위해 플러그인은 matlab.unittest.plugins.TestRunnerPlugin 클래스의 선택 메서드를 서브클래스화하고 재정의합니다.

AssertionCountingPlugin 클래스 생성하기

현재 폴더의 파일에서, TestRunnerPlugin 클래스에서 상속되는 사용자 지정 플러그인 클래스 AssertionCountingPlugin을 생성하십시오. AssertionCountingPlugin에 대한 전체 코드를 보려면 AssertionCountingPlugin 클래스 정의 요약을 참조하십시오.

통과 어설션 및 실패 어설션의 개수를 추적하려면 properties 블록 내에서 두 개의 읽기 전용 속성 NumPassingAssertionsNumFailingAssertions를 정의하십시오.

    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

참고 항목

| | | | |

관련 항목