Main Content

カスタム プラグインの作成

この例では、TestRunner でテスト スイートを実行しているときに、パスと失敗のアサーション数をカウントするカスタム プラグインを作成する方法を説明します。このプラグインは、テスト終了時に概要を出力します。TestRunner を拡張するため、プラグインは matlab.unittest.plugins.TestRunnerPlugin クラスの特定メソッドをサブクラス化し、オーバーライドします。

AssertionCountingPlugin クラスの作成

現在のフォルダー内のファイルに、TestRunnerPlugin クラスから継承するカスタム プラグイン クラス AssertionCountingPlugin を作成します。AssertionCountingPlugin の完全なコードは、AssertionCountingPlugin クラス定義の概要を参照してください。

パスと失敗のアサーション数を追跡するには、properties ブロック内で 2 つの読み取り専用プロパティ 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

テスト フレームはこのメソッドを 1 回評価します。また、テスト合計数についての情報を表示し、プラグインでテキスト出力の生成に使用されるプロパティを初期化して、スーパークラス メソッドを呼び出します。フレームワークがスーパークラス メソッドの評価を完了すると、runTestSuite メソッドは、補助メソッド printAssertionSummary (補助メソッドの定義を参照) を呼び出すことによりアサーション カウントの概要を表示します。

共有テスト フィクスチャと TestCase インスタンスの作成の拡張

アサーションをカウントするためにイベント AssertionPassed および AssertionFailed にリスナーを追加します。これらのリスナーを追加するには、テスト フレームワークで使用されるメソッドを拡張してテスト内容を作成します。テスト内容には、Test 要素ごとの TestCase インスタンス、TestClassSetup および TestClassTeardown メソッドに対するクラス レベルの TestCase インスタンス、および TestCase クラスが属性 SharedTestFixtures をもつ場合に使用する Fixture インスタンスが含まれます。

作成メソッドをオーバーライドする際に、対応するスーパークラスを呼び出します。作成メソッドは、テスト フレームワークがそれぞれのコンテキストに対して作成する内容を返します。これらのいずれかのメソッドを 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

1 つのテスト スイート要素の実行の拡張

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 ブロックで、3 つの補助メソッドを定義します。これらのメソッドは、パスまたは失敗アサーションの数をインクリメントし、アサーション カウントの概要を出力します。

    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

参考

| | | | |

関連するトピック