MATLAB Coder を使用した外部 C コードのユニット テスト
この例では、MATLAB® Coder™ で MATLAB® ユニット テストを使用して外部 C コードをテストする方法を示します。
C コードをテストする場合、MATLAB Coder を使用して MATLAB にコードを取り込みます。次に、MATLAB テスト フレームワークを使用してユニット テストを記述します。MATLAB の高度な数値計算や可視化機能を利用して、柔軟で豊富なテストを作成できます。
以下の例では、次のような操作方法を説明します。
C コードを MATLAB Coder を使用して生成する MEX 関数として MATLAB に取り込みます。
MATLAB テスト フレームワークを使用してユニット テストを記述します。
MEX 関数上でテストを実行します。
Embedded Coder® がある場合は、ソフトウェアインザループ (SIL) 実行またはプロセッサインザループ (PIL) 実行によるユニット テストを使用して、生成されたスタンドアロン コードでユニット テストを実行できます。
例の背景
この例では、MATLAB Coder を使用してユニット テストを実行する方法を示すためにカルマン フィルターを使用しています。この例のテストでは、オブジェクトの軌跡とそのカルマン推定が指定された許容誤差内に収まるどうかを判定します。
この例では次のファイルを使用します。
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 コードを生成するようにアプリを構成します。
MATLAB Coder ツールストリップで [エントリ ポイント] ボタンをクリックして [エントリ ポイント] ペインを開きます。
callKalmanFilter
をエントリ ポイント関数として入力するか選択します。関数シグネチャを展開し、入力引数 2 が 2 行 310 列の double の配列であることを指定します。
MATLAB Coder ツールストリップで [ビルド タイプ]、[MEX] を選択します。
ユニット テストは変数 position
を position.mat
から読み込み、position
を callKalmanFilter
に渡します。したがって、callKalmanFilter
への入力には position
がもっているプロパティが指定されていなければなりません。MATLAB ワークスペースで、position.mat
を読み込むと、position
が 2 行 310 列の double の配列であることがわかります。
callKalmanFilter
関数は外部 C コードを統合するため、次の手順に従って C ソース ファイルと C ヘッダー ファイルを指定する必要があります。
[設定] をクリックして [MEX コード生成設定] ダイアログ ボックスを開きます。
[カスタム コード] 構成ペインの [ヘッダー ファイル] タブで「
#include "kalmanfilter.h"
」と入力します。[カスタム コード] 構成ペインの [追加ソース ファイル] ボックスに「
kalmanfilter.c
」と入力します。
MEX 関数を生成するには、MATLAB Coder ツールストリップで [コードを生成してビルド] ボタンをクリックします。
MEX 関数でのユニット テストの実行
MEX 関数でユニット テストを実行するには、MATLAB Coder ツールストリップで [MEX を使用して検証] ボタンを展開します。[生成されたコードを使用] が選択されていることを確認します。[実行ファイル: 実行する MATLAB ファイルを選択...] をクリックし、テスト ファイル run_unit_tests_kalman.m
を選択します。
アプリがテスト ファイルを実行すると、ユニット テストの 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.
参考
トピック
- Class-Based Unit Tests
- MATLAB Coder アプリのソフトウェアインザループ実行 (Embedded Coder)
- Software-in-the-Loop Execution from Command Line (Embedded Coder)
- MATLAB Coder による生成されたコードのユニット テスト