メインコンテンツ

MATLAB Coder による生成されたコードのユニット テスト

この例では、MATLAB® Coder™ での MATLAB® ユニット テストを使用して、生成されたコードの出力をテストする方法を示します。

コードの機能に不具合が発生していないかを監視するために、コードのユニット テストを記述できます。MATLAB では、MATLAB テスト フレームワークを使用してユニット テストを作成して実行できます。MATLAB コードから生成する MEX コードおよびスタンドアロン コードをテストするには、MATLAB コードのテスト時に使用するものと同じユニット テストを使用できます。

MEX 関数には、量産コードを生成する前に問題を検出するために役立つインストルメンテーションが含まれています。MEX 関数上でユニット テストを実行すると、MATLAB でインストルメント化されたコードがテストされます。生成されたスタンドアロン コード (スタティック ライブラリまたは共有ライブラリ) にはインストルメンテーションは含まれませんが、MEX コードにはない最適化を含めることができます。MATLAB 外部の異なるプロセスでスタンドアロン コード上でユニット テストを実行するには、ソフトウェアインザループ (SIL) またはプロセッサインザループ (PIL) 実行を使用します。SIL または PIL 実行を使用するには、Embedded Coder® がなければなりません。

以下の例では、次のような操作方法を説明します。

  1. MATLAB 関数を呼び出す MATLAB ユニット テストを作成します。この例では、クラスベースのユニット テストを使用します。

  2. MATLAB 関数から MEX 関数を生成します。

  3. ユニット テストを MEX 関数上で実行します。

  4. SIL を使用してユニット テストをスタンドアロン コード上で実行します。

ファイルの確認

この例では、MATLAB 関数 addOne から生成された MEX 関数上でユニット テストを実行します。この関数は、その入力引数に 1 を足します。

type addOne.m
function y = addOne(x) %#codegen
y = x + 1;
end

ファイル TestAddOne.m には 2 つのテストを含むクラスベースのユニット テストが含まれます。

  • reallyAddsOne は、入力が 1 である場合、解は 2 であることを確認します。

  • addsFraction は、入力が pi である場合、解は pi + 1 であることを確認します。

クラスベースのユニット テストの記述の詳細については、Class-Based Unit Testsを参照してください。

type TestAddOne.m
classdef TestAddOne < matlab.unittest.TestCase
    methods ( Test )

        function reallyAddsOne( testCase )
            x = 1;
            y = addOne( x );
            testCase.verifyEqual( y, 2 );
        end

        function addsFraction( testCase )
            x = pi;
            y = addOne( x );
            testCase.verifyEqual( y, x+1 );
        end
    end
end

ファイル run_unit_tests.mruntests を呼び出して TestAddOne.m でのテストを実行します。

type run_unit_tests.m
runtests('TestAddOne')

MATLAB Coder アプリを使用したユニット テストの実行

コードの生成

MATLAB Coder アプリを開くには、MATLAB のツールストリップの [アプリ] タブの [コード生成] の下で、MATLAB Coder アプリのアイコンをクリックします。

次の手順に従って、関数 addOne の MEX コードを生成します。

  1. MATLAB Coder ツールストリップで [エントリ ポイント] ボタンをクリックして [エントリ ポイント] ペインを開きます。

  2. addOne をエントリ ポイント関数として入力するか選択します。

  3. 関数シグネチャを展開し、入力引数 x が double のスカラーであることを指定します。

  4. MATLAB Coder ツールストリップで [ビルド タイプ] のリストから MEX. を選択します。

  5. MATLAB Coder ツールストリップで [コードを生成してビルド] ボタンをクリックします。

generate_and_build_mex.png

MEX 関数でのユニット テストの実行

MEX 関数でユニット テストを実行するには、[MEX を使用して検証] ボタンをクリックします。次に、テスト ファイル run_unit_tests.m を選択します。

verify_using_mex_succeed.png

テスト出力がコマンド ウィンドウに表示されます。ユニット テストをパスしました。

MEX 関数が誤った出力を返す場合にユニット テストに失敗することを確認するには、入力変数 x の型を変更して生成コードを変更します。[エントリ ポイント] ペインで、入力引数 x が single のスカラーであることを指定します。MATLAB Coder ツールストリップで [MEX を使用して検証] ボタンをクリックしてユニット テストを再度実行します。

verify_test_fail.png

ユニット テストに失敗します。

  • reallyAddsOne が失敗したのは、出力型のクラスが double ではなく single であるためです。

  • addsFraction が失敗したのは、出力クラスおよび値が想定されるクラスおよび値と一致しないためです。出力型は single であり、double ではありません。単精度出力の値 4.1415930 は倍精度の出力の値 4.141592653589793 と同じではありません。

ソフトウェアインザループ検証によるユニット テストの実行 (Embedded Coder が必要)

Embedded Coder® がある場合は、ソフトウェアインザループ (SIL) 検証を使用して、生成されたスタンドアロン コードでユニット テストを実行できます。

最初に、次の手順に従って addOne のスタンドアロンの静的な C ライブラリを生成します。

  1. MATLAB Coder ツールストリップで [ビルド タイプ] のリストから Static Library (.lib). を選択します。

  2. MATLAB Coder ツールストリップで [SIL を使用した検証] ボタンをクリックします。テスト ファイル run_unit_tests.m がアプリで使用されます。

verify_using_sil.png

コマンド ラインでのユニット テストの実行

コードの生成

コマンド ライン ワークフローを使用してコードを生成する場合、ユニット テストを実行するテスト ファイルを指定して coder.runTest を使用することで、MEX 関数上でユニット テストを実行できます。

addOne 関数の MEX 関数を生成します。サンプル入力値を提供することで、入力引数が double のスカラーであることを指定します。

codegen addOne -args {2}
Code generation successful.

MEX 関数でのユニット テストの実行

ユニット テストを MEX 関数上で実行します。テスト ファイルに run_unit_tests を、関数に addOne を指定します。coder.runTest がテスト ファイルを実行すると、addOne の呼び出しが addOne_mex の呼び出しに置き換えられます。ユニット テストは元の MATLAB 関数ではなく MEX 関数上で実行されます。ユニット テストをパスしました。

coder.runTest("run_unit_tests","addOne");
ans = 
  1×2 TestResult array with properties:

    Name
    Passed
    Failed
    Incomplete
    Duration
    Details

Totals:
   2 Passed, 0 Failed, 0 Incomplete.
   0.014247 seconds testing time.

MEX 関数が誤った出力を返す場合にユニット テストに失敗することを確認するには、入力変数 x の型を変更して生成コードを変更します。MEX 関数を再度生成し、入力引数が single のスカラーであることを指定します。

codegen addOne -args {single(2)}
Code generation successful.

変更した MEX 関数でユニット テストを実行します。ユニット テストに失敗します。

coder.runTest("run_unit_tests","addOne")
ans = 
  1×2 TestResult array with properties:

    Name
    Passed
    Failed
    Incomplete
    Duration
    Details

Totals:
   0 Passed, 2 Failed (rerun), 2 Incomplete.
   0.0068377 seconds testing time.

ソフトウェアインザループ検証によるユニット テストの実行 (Embedded Coder が必要)

Embedded Coder がある場合は、ソフトウェアインザループ (SIL) 検証を使用して、生成されたスタンドアロン コードでユニット テストを実行できます。

スタティック ライブラリの coder.EmbeddedCodeConfig オブジェクトを作成し、オブジェクトを SIL 用に構成します。

cfg = coder.config("lib");
cfg.VerificationMode = "SIL";

MATLAB 関数および SIL インターフェイスのコードを生成します。入力引数が double のスカラーであることを指定します。

codegen -config cfg -args {2} addOne
Code generation successful.

SIL インターフェイスを使用するユニット テストを実行するテスト ファイルを実行します。ユニット テストをパスしました。

coder.runTest("run_unit_tests",['addOne_sil.',mexext])
ans = 
  1×2 TestResult array with properties:

    Name
    Passed
    Failed
    Incomplete
    Duration
    Details

Totals:
   2 Passed, 0 Failed, 0 Incomplete.
   0.28996 seconds testing time.

clear addOne_sil
### Application stopped
### Stopping SIL execution for 'addOne'

参考

トピック