よくある質問(FAQ)

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

スタブ関数について

質問

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

回答

ライブラリ関数をスケルトン(空関数)化することによって可能になります。

カバレッジマスターのスタブ作成機能でスタブ関数を作成するためには、元の関数がC言語で、且つデバッグ情報が出力されている必要があります。通常はライブラリ関数にはデバッグ情報が出力されていませんので、ライブラリ関数を元にスタブを作成することはできません。たとえば

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

のようにライブラリ関数__mulu()が呼ばれているコードをビルド/OMF変換しても、WinAMSの「スタブ設定」画面に「__mulu」は現れません(したがってスタブ化の操作もできません)。

ライブライ関数をリンクせず、その代わりにC言語関数としてのAPIを持つダミー関数(空関数)を作成しコンパイル&リンクしてオブジェクトファイルを作成し直すことで、回避できます。たとえば上述の例の場合

のように、スタブ関数作成画面にライブラリ(サブ)関数のシンボル名称が表示されますので、これを元にスタブ関数を作成することが可能になります。

【参考】

空関数は手動で作成しても支障ありませんが、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は関数の引数/戻り値の型の情報をプロトタイプ宣言から取得しますので、ソースコード上にプロトタイプ宣言がないと、『定義のない関数のスケルトンを生成』機能は使えません(処理系によってはインクルードされているシステムヘッダにプロトタイプ宣言がある場合もあります)。

extern unsigned int __mulu(unsigned char, unsigned char);
ソースもしくはヘッダ内にプロトタイプ宣言がない場合は、上記プロトタイプ宣言を記載したヘッダファイルを作成して、CasePlayer2の「プレインクルードファイル」に追加してください。