関数ベースのユニット テスト
テスト ファイル内のローカル関数としてユニット テストを作成することで、MATLAB® ソース コードをテストできます。関数ベースのテスト ファイルでは、各ローカル テスト関数でソフトウェアの一部を実行し、生成される結果の正確性を検定します。オプションとして、テスト ファイルにローカル フィクスチャ関数を含めてテストのセットアップ アクションと破棄アクションを指定できます。
テストの作成
関数ベースのテストを作成するには、main 関数と 1 つ以上のローカル関数を含むテスト ファイルを記述します。ローカル関数を使用して、ユニット テストとオプションのフィクスチャを指定します。
メモ
テスト ファイル名の先頭または末尾は "test" という語でなければなりません。この大文字小文字は区別されません。ファイル名の先頭または末尾が "test" という語でない場合、テスト フレームワークでテストが無視される場合があります。
main 関数、テスト関数、フィクスチャ関数のシグネチャを含むテスト ファイル テンプレートについては、テスト ファイル テンプレートを参照してください。
main 関数の追加
関数ベースのテスト ファイルの main 関数では、ローカル テスト関数のすべてのテストを組み合わせて 1 つのテスト配列にします (matlab.unittest.Test 配列)。main 関数の名前はテスト ファイル名に対応する必要があり、先頭または末尾が "test" という語 (大文字小文字は区別されない) でなければなりません。
main 関数に入力は不要ですが、出力としてテスト配列を返す必要があります。functiontests 関数の呼び出しによりこの出力を生成します。functiontests は入力として関数ハンドルの cell 配列が必要なため、localfunctions 関数を使用してファイル内のローカル テスト関数への関数ハンドルの cell 配列を自動的に作成します。たとえば、exampleTest.m という名前のテスト ファイルで、テスト ファイルの main 関数を実装します。
function tests = exampleTest tests = functiontests(localfunctions); end
ローカル テスト関数の追加
ユニット テストを作成するには、ローカル テスト関数をテスト ファイルに追加します。ローカル テスト関数の名前の先頭または末尾は "test" という語でなければなりません。この大文字小文字は区別されません。テスト関数は、単一の入力を受け入れる必要があります。このトピックでは、これを testCase と表します。この入力は matlab.unittest.FunctionTestCase オブジェクトであり、テスト フレームワークによって自動的に作成されます。テスト関数はこのオブジェクトを使用して検定を実行します。たとえば、以下のローカル テスト関数では 2 つのユニット テストを指定しています。ユニット テストは独立している必要があるため、テスト ファイル内のテスト関数の順序は重要ではありません。
function test1(testCase) % Test code end function test2(testCase) % Test code end
ユニット テストには通常、値をテストしてエラーに対応するための検定が含まれます。たとえば、関数をテストする場合、ユニット テストでは関数の実際の戻り値と予期される戻り値を指定し、検定メソッドを使用してそれらの等価性をテストできます。説明のために、test1 テスト関数の次の実装では、plus 関数をテストしています。(実際には、ユーザー定義のコードをテストします。)テスト関数は、verifyEqual 検定メソッドを呼び出して、plus(2,3) で期待値 5 が生成されるかを検証します。
function test1(testCase) actual = plus(2,3); expected = 5; verifyEqual(testCase,actual,expected) end
関数ベースのユニット テストを作成して実行する方法の簡単な例については、関数を使用する単純なテスト ケースの記述を参照してください。
ローカル フィクスチャ関数の追加 (オプション)
システムのテスト前の状態をセットアップし、テスト後にシステムを元の状態に戻すために、ファイル フィクスチャとフレッシュ フィクスチャをテスト ファイルに追加できます。"ファイル フィクスチャ" は、ファイル内のすべてのテストで共有されるセットアップ関数と破棄関数から構成されます。これらの関数は、テスト ファイルごとに 1 回ずつ実行されます。"フレッシュ フィクスチャ" は、各ローカル テスト関数の前後で実行されるセットアップ関数と破棄関数から構成されます。
ファイル フィクスチャ関数 — ファイル フィクスチャ関数を使用して、テスト ファイル内のすべてのテストでセットアップと破棄のコードを 1 回実行します。セットアップ アクションと破棄アクションに対応するファイル フィクスチャ関数は、それぞれ、
setupOnceおよびteardownOnceという名前にする必要があります。テスト フレームワークによって、テスト スイートの最初のテストの実行前にsetupOnce関数が 1 回、最後のテストの実行後にteardownOnce関数が 1 回、自動的に実行されます。フレッシュ フィクスチャ関数 — フレッシュ フィクスチャ関数を使用して、テスト ファイル内の個別の各テストに対してセットアップと破棄のコードを実行します。セットアップ アクションと破棄アクションに対応するフレッシュ フィクスチャ関数は、それぞれ、
setupおよびteardownという名前にする必要があります。テスト フレームワークによって、各テストの実行前のsetup関数と各テストの実行後のteardown関数が自動的に実行されます。一般的に、ユニット テストのカプセル化を促進するため、ファイル フィクスチャよりもフレッシュ フィクスチャを使用することをお勧めします。
メモ
テスト環境をセットアップするためのコードをテスト ファイルに追加する場合は、対応するセットアップ アクションの逆の順序で対称的に破棄アクションを実行することで環境を元の状態に復元するコードも含めます。
テスト関数と同様に、フィクスチャ関数は、テスト フレームワークによって自動的に作成される matlab.unittest.FunctionTestCase オブジェクトを受け入れる必要があります。このオブジェクトの TestData プロパティを使用して、データをセットアップ関数からテスト関数または破棄関数に渡すことができます。たとえば、テストを実行する前に MATLAB パスに変更を加える必要があるとします。パスを設定するための setupOnce 関数を追加し、テストの実行の完了後にパスを元の状態へ戻すための teardownOnce 関数を追加します。
function setupOnce(testCase) % Do not change function name testCase.TestData.OriginalPath = path; addpath("mySource") end function teardownOnce(testCase) % Do not change function name path(testCase.TestData.OriginalPath) end
次に、各ユニット テストで新しい Figure にアクセスする必要があるとします。各テストの前に新しい Figure を取得するための setup 関数を追加し、テスト後に Figure を閉じるための teardown 関数を追加します。
function setup(testCase) % Do not change function name testCase.TestData.TestFigure = figure; end function teardown(testCase) % Do not change function name close(testCase.TestData.TestFigure) end
関数ベースのテストでセットアップと破棄のコードを使用する方法の例については、セットアップ関数と破棄関数を使用したテストの記述を参照してください。
関数ベースのテストの実行方法
関数ベースのテストを実行すると、テスト フレームワークは以下の手順に従います。
ローカル テスト関数で指定されたテストの配列を作成する。
テスト ファイルに
setupOnce関数が含まれている場合は、その関数を実行してシステムのテスト前の状態を設定する。各テストについて、対応するローカル テスト関数を実行する。テスト ファイルに
setup関数が含まれている場合は、その関数を実行してからローカル テスト関数を実行する。テスト ファイルにteardown関数が含まれている場合は、ローカル テスト関数の実行後にその関数を実行する。テスト ファイルに
teardownOnce関数が含まれている場合は、その関数を実行してシステムを元の状態に復元する。
次の図に、テスト フレームワークがテストを実行する方法をまとめています。
テストの実行と結果の解析
関数ベースのテストは対話的にまたはプログラムで実行できます。以下に例を示します。
[エディター] または [ライブ エディター] でテスト コードを表示した状態で、MATLAB ツールストリップの [テストの実行] セクションからテストを実行します。詳細については、エディターでのテストの実行を参照してください。
テスト ブラウザー アプリを開き、テストをテスト ブラウザーに追加して、テストを実行します。詳細については、Run Tests Using Test Browserを参照してください。
コマンド ウィンドウで
runtests関数を使用してテストを実行します。この関数は、テスト結果をmatlab.unittest.TestResult配列として返します。たとえば、exampleTest.mという名前のファイルで定義されている関数ベースのテストを実行するには、以下のステートメントを実行します。results = runtests("exampleTest.m");テストをプログラムで実行するその他の方法については、さまざまなワークフローでのテスト実行を参照してください。
テスト結果を解析するには、TestResult オブジェクトのプロパティを検証します。それぞれの TestResult オブジェクトには、テスト関数の名前、テストがパス、失敗、未完了のいずれかであるか、およびテストの実行時間が含まれます。詳細は、テスト ケースの結果の解析と失敗したテスト結果の解析を参照してください。
関数ベースのテストの機能
関数ベースのテストは xUnit テストの原理に従っており、豊富なテスト作成機能を利用できます。関数ベースのテストでは、以下ができます。
matlab.unittest.fixtures名前空間のフィクスチャ クラスを使用し (applyFixtureメソッドと共に)、頻繁に使用するテスト アクションのセットアップと破棄を処理する。addTeardownメソッドを使用してテストの破棄コードを動的に追加する。logメソッドを使用して、特定の詳細レベルで診断情報を記録する。matlab.unittest.qualifications名前空間の検定ライブラリ全体を使用する。使用する検定を決定するには、検証、アサーション、その他の検定の表を参照してください。制約、実際値のプロキシ、許容誤差、テスト診断などの高度な検定機能を使用する。
matlab.unittest.constraints名前空間のクラス、およびmatlab.automation.diagnostics.Diagnosticインターフェイスから派生させたクラスを検定で使用できます。
詳細については、関数ベースのテストの拡張を参照してください。
テスト ファイル テンプレート
このコードは、関数ベースのテストを記述するためのテンプレートです。ユニット テストを追加するには、ローカル テスト関数を実装するか、新しい関数を追加します。セットアップおよび破棄のコードを追加するには、フィクスチャ関数を実装します。
%% Main function to generate tests function tests = exampleTest tests = functiontests(localfunctions); end %% Local test functions function test1(testCase) % Test code end function test2(testCase) % Test code end %% Optional file fixtures function setupOnce(testCase) % Do not change function name % Setup code end function teardownOnce(testCase) % Do not change function name % Teardown code end %% Optional fresh fixtures function setup(testCase) % Do not change function name % Setup code end function teardown(testCase) % Do not change function name % Teardown code end