よくある質問(FAQ)

同じ関数が何度も呼び出される場合、スタブ関数はどのように作成すると良いですか?

スタブ関数について

質問

テスト対象関数が同一のサブ関数を何度も呼び出す場合、戻り値などを呼び出し毎に変更したり、呼び出し毎に与えた引数を確認するには、スタブ関数をどのように作成すれば良いですか?

【テスト対象関数の例】
// sub_func()が2回呼ばれている場合

int a,b,c,d;
void func(int x)
{
    a = sub_func(x); // 1回目
    if ( a ) b++;
    c = sub_func(b); // 2回目
    if ( c ) d++;
}

回答

上記の様に sub_func() が2回呼び出される場合、呼び出しごとに異なる戻り値を設定するための変数(グローバル変数または関数内スタティック変数)と、渡された引数を格納するための配列を定義し、これらをCSVファイルの入力/出力変数に指定します。例えば、以下のようなスタブ関数を実装し、呼び出されるたびに配列のインデックス(DBG_func_idx)をインクリメントさせることで、呼び出し回数に応じた戻り値の制御や引数のキャプチャが可能になります。なお、用意する配列の要素数は、テストで想定される最大呼び出し回数分を確保する必要があります。

【sub_func()の スタブ関数の例】
int DBG_func_arg[2]; /* 関数の引数保存域(2回分) */
int DBG_func_ret[2]; /* 関数の戻り値(2回分) */
int DBG_func_idx; /* 上記配列用のインデックス*/
int AMSTB_sub_func(int i)
{
    DBG_func_arg[DBG_func_idx] = i; /* 引数を保存域に転送*/
    return DBG_func_ret[DBG_func_idx++]; /* 指定の戻り値でリターン*/
}

この外部変数DBG_func_arg[]をテスト入力変数に、DBG_func_ret[]をテスト出力変数に指定します。

  • 上の説明と、テストデータのイメージをまとめたPDFファイルを掲載しています。 PDF閲覧