クラス ベースのユニット テスト
matlab.unittest.TestCase クラスから継承するテスト クラス内でユニット テストを作成することで、MATLAB® ソース コードをテストできます。TestCase クラスは、MATLAB 内のすべてのテスト クラスのスーパークラスであり、テスト フィクスチャのセットアップ ルーチンや破棄ルーチンを含む、テスト内容を記述および識別するためのインターフェイスを提供します。
テスト クラス定義ファイル内に Test メソッドとしてクラスベースのユニット テストを記述します。Test メソッドは、Test 属性をもつ methods ブロックで定義されたメソッドです。Test メソッドでは、値をテストしてエラーに対応するための検定を使用できます。TestCase サブクラスは、Test 属性に加えて、さまざまなフレームワーク固有の属性を活用して、テストおよびテスト フィクスチャを指定できます。たとえば、TestMethodSetup および TestMethodTeardown メソッド属性を使用して、テスト クラス内の各テストのセットアップ コードおよび破棄コードを指定できます。
テスト クラスの定義
クラスベースのテストを記述するには、まず matlab.unittest.TestCase クラスから派生するクラスを作成します。次に、テスト クラス内で Test 属性をもつ methods ブロックにメソッドを追加して、ユニット テストを指定します。たとえば、MyTestClass クラスには 2 つのテスト (test1 と test2) が含まれています。Test メソッドへの最初の入力は TestCase オブジェクトでなければなりませんが、テストのロジックで必要ない場合は無視できます。Test メソッドに渡される TestCase オブジェクトは、対応するテストにテスト環境固有の情報を提供します。
さらに、MyTestClass クラスはフレームワーク固有のメソッド属性を使用して、setup メソッドと teardown メソッドを定義します。テスト フレームワークでは、各テストの前と後に、これらのメソッドをそれぞれ実行します。テスト クラスのセットアップ コードおよび破棄コードの詳細については、クラスを使用するセットアップ コードと破棄コードの記述を参照してください。
classdef MyTestClass < matlab.unittest.TestCase methods (TestMethodSetup) function setup(testCase) % Setup code end end methods (TestMethodTeardown) function teardown(testCase) % Teardown code end end methods (Test) function test1(testCase) % Test code end function test2(testCase) % Test code end end end
ユニット テストには通常、値をテストしてエラーに対応するための検定が含まれます。たとえば、関数をテストする場合、Test メソッドでは関数の実際の戻り値と予期される戻り値を指定し、検定メソッドを使用してそれらの等価性をテストできます。説明のために、PlusTest テスト クラスには、plus 関数をテストするための Test メソッドが含まれています。(実際には、テスト クラスはユーザー定義のコードをテストします。)myTest メソッドは、verifyEqual 検定メソッドを呼び出して、plus(2,3) で予期される値 5 が生成されるかを検証します。独自のテスト クラスを作成する際に、matlab.unittest.qualifications 名前空間内の検定ライブラリ全体にアクセスできます。使用する検定を決定するには、検証、アサーション、その他の検定の表を参照してください。
classdef PlusTest < matlab.unittest.TestCase methods (Test) function myTest(testCase) actual = plus(2,3); expected = 5; testCase.verifyEqual(actual,expected) end end end
クラスベースのユニット テストを作成して実行する方法の簡単な例については、クラスを使用する単純なテスト ケースの記述を参照してください。
テスト クラスの実行の仕組み
クラスベースのテスト (たとえば、results = runtests(["TestClassA" "TestClassB" "TestClassC"])) を実行すると、テスト フレームワークはまず、共有テスト フィクスチャに基づいてテスト クラスをグループに分割します。(共有テスト フィクスチャは、TestCase サブクラスの SharedTestFixtures 属性を使用して指定されたフィクスチャです。)各グループには、まったく同じ共有テスト フィクスチャをもつテスト クラスが含まれます。必要なセットアップ アクションと破棄のアクションを最小限に抑えるために、フレームワークは、共有テスト フィクスチャを 1 回セットアップおよび破棄することで、各グループ内のテスト クラスを実行します。つまり、グループごとにフレームワークは以下を行います。
グループ内のテスト クラスを実行する前に、共有テスト フィクスチャを設定します。
グループ内の各テスト クラスを実行します。
グループ内のすべてのテスト クラスを実行した後、共有テスト フィクスチャを破棄します。
次の図に、手順 2 でテスト フレームワークが各テスト クラスを実行する方法を示します。
フレームワークは、テスト クラスを実行するときに次の手順に従います。
クラスレベルの
TestCaseオブジェクトを作成する — フレームワークはテスト クラスのオブジェクトを作成します。クラスレベルのセットアップ コードを実行する — フレームワークは、クラスレベルの
TestCaseオブジェクトを使用して、TestClassSetupmethodsブロックで指定されたクラスレベルのセットアップ コードを実行します。クラスレベルのTestCaseオブジェクトは、クラスレベルのセットアップ コードの結果として更新された環境を反映します。テストのループ:
メソッドレベルの
TestCaseオブジェクトを作成する — フレームワークは、クラスレベルのセットアップ コードの実行後に環境を反映するクラスレベルのTestCaseオブジェクトをコピーして、メソッドレベルのTestCaseオブジェクトを作成します。次に、フレームワークはこのオブジェクトをテスト クラスのTestMethodSetup、Test、およびTestMethodTeardownメソッドに渡します。メモ
テストが他のテストの環境に影響を与えないようにするために、異なる
Testメソッドに渡されるTestCaseインスタンスは独立したコピーです。つまり、Testメソッド内のテスト ケースへの変更は、そのメソッドの範囲内にとどまり、テスト クラス内の他のTestメソッドには伝播されません。メソッドレベルのセットアップ コードを実行する — フレームワークは、メソッド レベルの
TestCaseオブジェクトを使用して、TestMethodSetupmethodsブロックで指定されたメソッド レベルのセットアップ コードを実行します。メソッド レベルのTestCaseオブジェクトは、メソッド レベルのセットアップ コードの結果として更新された環境を反映します。テストを実行する — フレームワークは、メソッド レベルの
TestCaseオブジェクトを使用して、テストに対応するTestメソッドを実行します。テストがパラメーター化されている場合、フレームワークはパラメーター化情報を使用してメソッドを実行します。メソッドレベルの破棄コードを実行する — フレームワークは、メソッド レベルの
TestCaseオブジェクトを使用して、TestMethodSetupmethodsブロックまたはTestMethodTeardownmethodsブロック内のaddTeardownメソッドの呼び出しを使用して指定されたメソッド レベルの破棄コードを実行します。メソッドレベルの
TestCaseオブジェクトを削除する — フレームワークは、テストの実行に使用されたメソッド レベルのTestCaseオブジェクトと、それに対応するメソッド レベルのセットアップ コードおよび破棄コードを破棄します。
クラスレベルの破棄コードを実行する — フレームワークは、クラスレベルの
TestCaseオブジェクトを使用して、TestClassSetupmethodsブロックまたはTestClassTeardownmethodsブロック内のaddTeardownメソッドの呼び出しを使用して指定されたクラスレベルの破棄コードを実行します。クラスレベルの
TestCaseオブジェクトを削除する — フレームワークは、テスト クラスでテストを実行するために使用されるクラス レベルのTestCaseオブジェクトを破棄します。
メモ
キャッチされないエラーや検定エラーは、テスト実行ワークフローに影響を与える可能性があります。たとえば、TestClassSetup または TestClassTeardown methods ブロックで仮定エラーが発生した場合、テスト フレームワークはテスト クラス全体をフィルター処理済みとしてマークし、Test メソッドのループをスキップします。
テストの独立性と反復性
matlab.unittest.TestCase サブクラス内のユニット テストは、意図しない形で相互に影響を与えることなく、独立して実行する必要があります。また、反復可能である必要があり、テストの実行が同じテストの後続の再実行に影響してはなりません。テストの独立性と反復性を確保するには、テスト クラスを作成する際に次のベスト プラクティスに従います。
テスト環境をセットアップするためのコードをテスト クラスに追加する場合は、対応するセットアップ アクションの逆の順序で対称的に破棄アクションを実行することで環境を元の状態に復元するコードも含めます。
MATLAB 検索パスや出力表示形式などのグローバル状態にアクセスするには、既定のプロパティ値ではなくメソッドを使用します。
テスト パラメーター値を指定するには、ハンドル オブジェクトではなく値オブジェクトを使用します。
詳細については、Write Independent and Repeatable Testsを参照してください。
クラスベースのテストの機能
クラスベースのテストでは、複数の高度なテスト オーサリング機能が用意されており、MATLAB ユニット テスト フレームワークのすべての機能にアクセスできます。たとえば、クラスベースのテストでは、制約、実際値のプロキシ、許容誤差、テスト診断などの高度な検定機能を使用できます。さらに、クラスベースのテストでは、以下ができます。
テスト クラス間でフィクスチャを共有する。詳細については、共有フィクスチャを使用するテストの記述を参照してください。
テストをカテゴリ別にグループ化してから、指定されたタグを使用してテストを実行する。詳細については、ユニット テストのタグ付けを参照してください。
指定されたパラメーターのリストにあるテストを組み合わせて実行するパラメーター化テストを記述する。詳細については、クラスベースのテストでのパラメーターの使用を参照してください。
サブクラス化と継承を使用して、テスト内容の共有と再利用を行う。たとえば、サブクラスを派生させることにより、テスト クラスに定義されたパラメーターとメソッドを再利用できます。詳細については、クラスの階層 — 概念を参照してください。