よくある質問(FAQ)

ライブラリ関数のスタブ関数を生成してテストに使用することはできますか?

スタブ関数について

質問

テスト対象関数からライブラリ関数が呼ばれています。カバレッジマスターのスタブ関数生成機能を用い、このライブラリ関数のスタブ関数を生成してテストに使用することはできますか?

回答

ライブラリ関数をスケルトン(空関数)化することで対応が可能になります。

本来、カバレッジマスターのスタブ作成機能を利用するためには、「元の関数がC言語で記述されていること」および「デバッグ情報が出力されていること」が必須条件となります。一般的なライブラリ関数にはデバッグ情報が含まれていないため、そのままではライブラリ関数を元にスタブを作成することはできません。たとえば、

unsigned int test(unsigned char a, unsigned char b)
 {
   unsigned int retVal = __mulu(a, b);
   return retVal;
 }

のようにコード内でライブラリ関数 __mulu() を呼び出している場合、そのプロジェクトをビルドしOMF変換を行っても、カバレッジマスターwinAMSの「スタブ設定」画面に __mulu は表示されず、スタブ化操作そのものが行えません。

対象のライブラリ関数をリンクせず、代わりに同一のAPIを持つダミー関数(空関数)をC言語で作成し、コンパイル・リンクし直すことで回避できます。例えば、上述の __mulu() の例であれば、

のように、スタブ関数作成画面にライブラリ(サブ)関数のシンボル名が表示されるようになります。これにより、通常のC言語関数と同様の手順で、ライブラリ関数を対象としたスタブ関数の作成が可能になります。

【参考】

空関数は手動で作成することも可能ですが、CasePlayer2の「定義のない関数のスケルトンを生成」機能を使用するとより効率的です。関数が抽出できない場合は、後述の【注意】をご確認ください。

「定義のない関数のスケルトンを生成」機能を利用するには、あらかじめ仕様書生成の設定で「スケルトン生成のための情報を生成する」を有効にした状態で、仕様書生成を実行しておく必要があります。この設定により、CasePlayer2は解析時にプロジェクト内のソースコードをスキャンし、実体が存在しない関数の情報を自動的に収集します。

CasePlayer2の [プロジェクト] メニューから [定義のない関数のスケルトンを生成] を選択し、ダイアログを表示します。左側の「<<スケルトン生成しない関数>>」 欄に、スケルトン化したいライブラリ関数(例:__mulu)が抽出されていることを確認してください。対象の関数を選択して [追加] ボタンをクリックし、右側の「<<スケルトン生成する関数>>」 欄へ移動させます。

これでスケルトン関数が実装された「CasePlayer2StubSrcFile.c」が自動生成されます。

 /* CP2_STUB_FUNC[__mulu] */
 unsigned int __mulu(unsigned char arg11,unsigned char arg15)
 {
   static unsigned char volatile CP2_AMOUT_arg11;
   static unsigned char volatile CP2_AMOUT_arg15;
   static unsigned int volatile CP2_AMIN_return;
   CP2_AMOUT_arg11 = arg11;
   CP2_AMOUT_arg15 = arg15;
   return CP2_AMIN_return;
 }

このソースをコンパイラのビルド対象に追加して、リビルド→OMF変換を再実施します。

【注意】
CasePlayer2は、関数の引数や戻り値の型情報をプロトタイプ宣言から取得します。そのため、ソースコード上に適切なプロトタイプ宣言が存在しない場合、「定義のない関数のスケルトンを生成」機能を利用することはできません。
(コンパイラの処理系によっては、インクルードされているシステムヘッダ内にプロトタイプ宣言が含まれているケースもあります。その場合は、CasePlayer2がそのヘッダを解析対象としていれば、自動的に情報を取得可能です。)

extern unsigned int __mulu(unsigned char, unsigned char);
ソースコードやヘッダファイル内にプロトタイプ宣言が存在しない場合は、対象のプロトタイプ宣言を記述したヘッダファイルを別途作成してください。作成したヘッダファイルを、CasePlayer2の設定画面にある「プレインクルードファイル」に追加して再度解析を行うことで、関数情報を正しく認識させることが可能です。