カスタム プラグインの作成
この例では、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