Main Content

関数ベースのテストの拡張

通常、関数ベースのテストでは、明示的に一連の Test オブジェクトを作成せずに、テスト ファイルを作成してそのファイル名を関数 runtests へ渡します。しかし、明示的なテスト スイートを作成すると、関数ベースのテストで追加の機能を使用できるようになります。この機能には次のものがあります。

  • テスト ログと詳細レベル

  • テストの選択

  • テスト ランナーをカスタマイズするプラグイン

追加の機能については、クラスベースのユニット テストの使用を検討してください。詳細については、ユニット テストを記述する方法を参照してください。

セットアップ コードと破棄コードのフィクスチャ

テストを記述する場合、applyFixture メソッドを使用して以下のようなアクションのセットアップおよび破棄コードを処理します。

  • 現在の作業フォルダーの変更

  • パスへのフォルダーの追加

  • 一時フォルダーの作成

  • 警告表示の抑制

これらの fixtures は、関数ベース テストの関数 setupOnceteardownOncesetup および teardown のアクションの手動入力によるコーディングに代わるものです。

たとえば、セットアップと破棄コードを記述して各テストの一時フォルダーをセットアップし、そのフォルダーを現在の作業フォルダーにする場合、関数 setup および teardown は次のようになります。

function setup(testCase)
% store current folder
testCase.TestData.origPath = pwd;

% create temporary folder
testCase.TestData.tmpFolder = ['tmpFolder' datestr(now,30)];
mkdir(testCase.TestData.tmpFolder)

% change to temporary folder
cd(testCase.TestData.tmpFolder)
end

function teardown(testCase)
% change to original folder
cd(testCase.TestData.origPath)

% delete temporary folder
rmdir(testCase.TestData.tmpFolder)
end

しかし、フィクスチャを使用して、これらの両方の関数を 1 つの変更された関数 setup で置き換えることができます。フィクスチャは初期状態を復元するために必要な情報を格納し、破棄アクションを実行します。

function setup(testCase)
% create temporary folder
f = testCase.applyFixture(matlab.unittest.fixtures.TemporaryFolderFixture);

% change to temporary folder
testCase.applyFixture(matlab.unittest.fixtures.CurrentFolderFixture(f.Folder));
end

テスト ログと詳細レベル

テスト関数では log メソッドを使用できます。既定では、テスト ランナーは詳細レベル 1 (Terse) でログが記録された診断をレポートします。他の詳細レベルのメッセージに対応するには、matlab.unittest.plugins.LoggingPlugin.withVerbosity メソッドを使用します。TestRunner オブジェクトを作成し、LoggingPlugin を追加して、そのスイートを run メソッドを使って実行します。テスト ランナーの作成についての詳細は、テスト ランナーのカスタマイズを参照してください。

テスト スイートの作成

関数ベースのテストを呼び出すと、一連の Test オブジェクトが返されます。関数 testsuite または matlab.unittest.TestSuite.fromFile メソッドを使用することもできます。特定のテストが必要で、そのテスト名がわかっている場合は、matlab.unittest.TestSuite.fromName を使用できます。特定のフォルダー内にあるすべてのテストからスイートを作成する場合には、matlab.unittest.TestSuite.fromFolder を使用できます。

テストの選択

明示的なテスト スイートでは、セレクターを使用してスイートを調整します。いくつかのセレクターはクラスベースのテストにのみ適用されますが、テスト名に基づいてスイートのテストを選択できます。

matlab.unittest.TestSuite.fromFile などのスイート生成メソッドでこれらの手法を使用するか、スイートを作成し、selectIf メソッドを使用してそれをフィルター処理します。たとえば、次のリストの 4 つの suite の値は等価です。

import matlab.unittest.selectors.HasName
import matlab.unittest.constraints.ContainsSubstring
import matlab.unittest.TestSuite.fromFile

f = 'rightTriTolTest.m';
selector = HasName(ContainsSubstring('Triangle'));

% fromFile, name-value pair
suite = TestSuite.fromFile(f,'Name','*Triangle*')

% fromFile, selector
suite = TestSuite.fromFile(f,selector)

% selectIf, name-value pair
fullSuite = TestSuite.fromFile(f);
suite = selectIf(fullSuite,'Name','*Triangle*')

% selectIf, selector
fullSuite = TestSuite.fromFile(f);
suite = selectIf(fullSuite,selector)

セレクターまたは名前と値のペアでスイート生成メソッドのいずれかを使用すると、テスト フレームワークはフィルター処理されたスイートを作成します。selectIf メソッドを使用すると、テスト フレームワークはテスト スイート全体を作成し、その後でフィルター処理します。大規模なテスト スイートでは、この手法はパフォーマンスに影響を及ぼす場合があります。

テストの実行

関数ベースのテストを実行する方法はいくつかあります。

全テスト実行の範囲使用する関数
ファイル内テスト ファイルの名前を指定した runtests
スイート内スイートを指定した run
カスタムのテスト ランナーをもつスイートrun.(テスト ランナーのカスタマイズを参照)

詳細は、さまざまなワークフローでのテスト実行を参照してください。

テスト診断へのプログラムによるアクセス

特定のクラスでは、フレームワークのテストは DiagnosticsRecordingPlugin プラグインを使用して、テスト結果の診断を記録します。以下のいずれかを実行した場合、フレームワークでは既定でプラグインが使用されます。

  • 関数 runtests を使用してテストを実行する。

  • 入力なしで関数 testrunner を使用してテストを実行する。

  • TestSuite または TestCase クラスの run メソッドを使用してテストを実行する。

  • 関数 runperf を使用してパフォーマンス テストを実行する。

  • TimeExperiment クラスの run メソッドを使用してパフォーマンス テストを実行する。

テストを実行した後、TestResult オブジェクトの Details プロパティの DiagnosticRecord フィールドを使用して、記録された診断にアクセスできます。たとえば、テスト結果が変数 results に保存されている場合、result(2).Details.DiagnosticRecord にはスイート内の 2 番目のテストの記録された診断が含まれます。

記録された診断は DiagnosticRecord オブジェクトです。テストの特定のタイプのテスト診断にアクセスするには、DiagnosticRecord クラスの selectFailedselectPassedselectIncompleteselectLogged の各メソッドを使用します。

既定では、DiagnosticsRecordingPlugin プラグインは、検定エラーと、詳細レベル matlab.automation.Verbosity.Terse でロギングされたイベントを記録します。詳細については、DiagnosticsRecordingPluginDiagnosticRecord を参照してください。

テスト ランナーのカスタマイズ

フレームワークがテスト スイートを実行する方法をカスタマイズするには、TestRunner オブジェクトを使用します。TestRunner オブジェクトを使用すると、次のことが可能です。

  • withNoPlugins メソッドを使用して、コマンド ウィンドウで出力を生成しない。

  • runInParallel メソッドを使用してテストを並列実行する。

  • addPlugin メソッドを使用してプラグインをテスト ランナーに追加する。

たとえば、テスト スイート suite を使用してサイレント テスト ランナーを作成し、TestRunnerrun メソッドを使用してテストを実行します。

runner = matlab.unittest.TestRunner.withNoPlugins;
results = runner.run(suite);

プラグインを使用してテスト ランナーをさらにカスタマイズします。たとえば、出力のリダイレクト、コード カバレッジの判定、または警告に対するテスト ランナーの応答方法の変更を行うことができます。詳細については、テスト ランナーへのプラグインの追加plugins クラスを参照してください。

参考

| | | | |

関連するトピック