Main Content

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 を使用してユニット テストをスタンドアロン コード上で実行します。

ファイルの確認

この例で使用するファイルにアクセスするには、[Open Script] をクリックします。

addOne.m

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

function y = addOne(x)
% Copyright 2014 - 2016 The MathWorks, Inc.

%#codegen
y = x + 1;
end

TestAddOne.m

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

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

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

クラスベースのユニット テストの記述の詳細については、MATLAB でのクラスベースのユニット テストの作成を参照してください。

classdef TestAddOne < matlab.unittest.TestCase
    % Copyright 2014 - 2016 The MathWorks, Inc.
    
    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.m

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

% Run unit tests
% Copyright 2014 - 2016 The MathWorks, Inc.

runtests('TestAddOne')

MATLAB Coder アプリを使用した MEX 関数上でのユニット テストの実行

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

コード生成の準備をするには、アプリの手順を進めます。

  • [ソース ファイルの選択] ページで、エントリポイント関数に addOne を指定します。

  • [入力の型を定義] ページで、入力引数 x に double のスカラー値を指定します。

  • [実行時の問題の確認] の手順で、代表的な入力を使用して addOne を呼び出すコードを入力します。例: addOne(2)。この手順を実行して、MATLAB 関数のコードを生成でき、生成されたコードには実行時の問題がないことを確認します。

さらに複雑な MATLAB 関数の場合、[入力の型を定義] および [実行時の問題の確認] 手順でテスト ファイルを指定する場合があります。このテスト ファイルは、代表的な型を指定して MATLAB 関数を呼び出します。アプリはこのファイルを使用して、入力型を決定します。このテスト ファイルには、ユニット テストに使用するファイルとは異なるファイルを使用できます。

MEX 関数を生成するには、[コード生成] ページで次の手順に従います。

  1. [ビルド タイプ] には、MEX を指定します。

  2. [生成] をクリックします。

生成された MEX 上でユニット テストを実行します。

  1. [コードの検証] をクリックします。

  2. テスト ファイルのフィールドで、run_unit_tests を指定します。

  3. [次を使用して実行][生成コード] に設定していることを確認します。

  4. [生成されたコードの実行] をクリックします。

アプリはテスト出力を [テスト出力] タブに表示します。ユニット テストをパスしました。

MATLAB コードの変更後のユニット テストの実行

addOne を変更して定数 1 を単精度にします。addOne を編集するには、アプリの左上隅の [ソース コード] の下の addOne をクリックします。

変更された関数の MEX 関数を生成するには、[生成] をクリックします。

ユニット テストを実行するには、次の手順に従います。

  1. [コードの検証] をクリックします。

  2. テスト ファイルを run_unit_tests に、[次を使用して実行][生成コード] に設定していることを確認します。

  3. [生成されたコードの実行] をクリックします。

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

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

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

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

Embedded Coder をお持ちの方は、ソフトウェアインザループ (SIL) 実行を使用して、生成されたスタンドアロン コード (スタティック ライブラリまたは共有ライブラリ) 上でユニット テストを実行できます。

addOne のライブラリを生成します。たとえば、スタティック ライブラリを生成します。

[コード生成] ページで、以下を実行します。

  1. [ビルド タイプ] には、Static Library を指定します。

  2. [生成] をクリックします。

生成されたコード上でユニット テストを実行します。

  1. [コードの検証] をクリックします。

  2. テスト ファイルのフィールドで、run_unit_tests を指定します。

  3. [次を使用して実行][生成コード] に設定していることを確認します。

  4. [生成されたコードの実行] をクリックします。

SIL 実行を終了するには、[SIL 検証を停止] をクリックします。

メモ: [C/C++ コード カバレッジを有効にする] オプションを使用するには、MATLAB® Test™ のライセンスが必要です。

コマンド ライン ワークフローを使用した MEX 関数上でのユニット テストの実行

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

テストする関数の MEX 関数を生成します。この例では、サンプル入力値を指定することで、入力引数に double のスカラー値を指定します。

codegen addOne -args {2}
Code generation successful.

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

coder.runTest('run_unit_tests', 'addOne')

コマンド ラインでのソフトウェアインザループ実行を使用したユニット テストの実行 (Embedded Coder が必要)

Embedded Coder をお持ちの方は、ソフトウェアインザループ (SIL) 実行を使用して、生成されたスタンドアロン コード (スタティック ライブラリまたは共有ライブラリ) 上でユニット テストを実行できます。

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

cfg = coder.config('lib');

SIL のオブジェクトを設定します。

cfg.VerificationMode = 'SIL';

MATLAB 関数および SIL インターフェイスのコードを生成します。

codegen -config cfg -args {2} addOne

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

coder.runTest('run_unit_tests', ['addOne_sil.', mexext])

SIL 実行を終了します。

[clear addOne_sil] をクリックします。

参考

関連するトピック