カスタム プラグインの作成
この例では、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
参考
matlab.unittest.plugins.TestRunnerPlugin | matlab.automation.streams.OutputStream | matlab.unittest.TestCase | matlab.unittest.TestRunner | matlab.unittest.fixtures.Fixture | addlistener