メインコンテンツ

MATLAB Coder を使用した外部 C コードのユニット テスト

この例では、MATLAB® Coder™ で MATLAB® ユニット テストを使用して外部 C コードをテストする方法を示します。

C コードをテストする場合、MATLAB Coder を使用して MATLAB にコードを取り込みます。次に、MATLAB テスト フレームワークを使用してユニット テストを記述します。MATLAB の高度な数値計算や可視化機能を利用して、柔軟で豊富なテストを作成できます。

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

  1. C コードを MATLAB Coder を使用して生成する MEX 関数として MATLAB に取り込みます。

  2. MATLAB テスト フレームワークを使用してユニット テストを記述します。

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

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

例の背景

この例では、MATLAB Coder を使用してユニット テストを実行する方法を示すためにカルマン フィルターを使用しています。この例のテストでは、オブジェクトの軌跡とそのカルマン推定が指定された許容誤差内に収まるどうかを判定します。

visualization.png

この例では次のファイルを使用します。

  • kalmanfilter.c は、例でテストされる C 関数です。移動するオブジェクトの位置を、その過去の位置に基づいて推定します。

  • kalmanfilter.h は、kalmanfilter.c のヘッダー ファイルです。

  • position.mat には、オブジェクトの位置が含まれます。

  • callKalmanFilter.m は、coder.cevalを使用して kalmanfilter C 関数を呼び出します。

  • TestKalmanFilter.m は、予測位置と実際の位置の間の誤差が指定された許容誤差を超えているかどうかテストします。

  • run_unit_tests_kalman は、runtestsを使用して TestKalmanFilter.m のテストを実行します。

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

MEX 関数をテストする場合でも、TestKalmanFilter でのユニット テストは、生成された MEX 関数から元の MATLAB 関数を呼び出します。MATLAB Coder がテストを実行する場合、MATLAB 関数の呼び出しは MEX 関数の呼び出しに置き換えられます。MATLAB は callKalmanFilter 内の coder.ceval 呼び出しを認識しないため、これらのテストを MATLAB で直接実行することはできません。

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

コードの生成

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

次の手順に従って、関数 callKalmanFilter の MEX コードを生成するようにアプリを構成します。

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

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

  3. 関数シグネチャを展開し、入力引数 2 が 2 行 310 列の double の配列であることを指定します。

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

configure_mex.png

ユニット テストは変数 positionposition.mat から読み込み、positioncallKalmanFilter に渡します。したがって、callKalmanFilter への入力には position がもっているプロパティが指定されていなければなりません。MATLAB ワークスペースで、position.mat を読み込むと、position が 2 行 310 列の double の配列であることがわかります。

callKalmanFilter 関数は外部 C コードを統合するため、次の手順に従って C ソース ファイルと C ヘッダー ファイルを指定する必要があります。

  1. [設定] をクリックして [MEX コード生成設定] ダイアログ ボックスを開きます。

  2. [カスタム コード] 構成ペインの [ヘッダー ファイル] タブで「#include "kalmanfilter.h"」と入力します。

  3. [カスタム コード] 構成ペインの [追加ソース ファイル] ボックスに「kalmanfilter.c」と入力します。

configuration_dialog.png

MEX 関数を生成するには、MATLAB Coder ツールストリップで [コードを生成してビルド] ボタンをクリックします。

generate_mex.png

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

MEX 関数でユニット テストを実行するには、MATLAB Coder ツールストリップで [MEX を使用して検証] ボタンを展開します。[生成されたコードを使用] が選択されていることを確認します。[実行ファイル: 実行する MATLAB ファイルを選択...] をクリックし、テスト ファイル run_unit_tests_kalman.m を選択します。

verify_using_mex.png

アプリがテスト ファイルを実行すると、ユニット テストの callKalmanFilter の呼び出しが callKalmanFilter_mex の呼び出しに置き換えられます。ユニット テストは元の MATLAB 関数ではなく MEX 関数上で実行されます。テスト出力がコマンド ウィンドウに表示されます。誤差が run_unit_tests_kalman.m で指定された許容誤差を超えないため、ユニット テストにパスします。

ユニット テストに失敗した場合はどうなるかを確認するには、テスト ファイル run_unit_tests_kalman.m で許容誤差を小さくします。その後、MATLAB Coder ツールストリップで [MEX を使用して検証] ボタンをクリックします。

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

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

コードの生成

callKalmanFilter 関数は外部 C コードを統合するため、MEX 構成オブジェクトを作成して C ソース ファイルと C ヘッダー ファイルを指定する必要があります。

cfg = coder.config('mex');
cfg.CustomSource = 'kalmanfilter.c';
cfg.CustomHeaderCode = '#include "kalmanfilter.h"';

codegen関数を使用して MEX 関数を生成します。coder.typeof関数を使用して、callKalmanFilter の入力引数が 2 行 310 列の double の配列であることを指定します。

codegen -config cfg -args {coder.typeof(0,[2 310])} callKalmanFilter
Code generation successful.

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

coder.runTest 関数を使用して MEX 関数でユニット テストを実行します。テスト ファイルに run_unit_tests_kalman を、関数に callKalmanfilter を指定します。coder.runTest がテスト ファイルを実行する場合、ユニット テストの callKalmanFilter の呼び出しが callKalmanFilter_mex の呼び出しに置き換えられます。ユニット テストは元の MATLAB 関数ではなく MEX 関数上で実行されます。

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

    Name
    Passed
    Failed
    Incomplete
    Duration
    Details

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

参考

トピック