よくある質問(FAQ)

スタブ関数やダミー関数からテスト対象関数(別ファイル)のstatic変数を変更するには、どのようにすれば良いですか?

スタブ関数について

質問

スタブ関数を使用して、テスト対象関数のファイル内static変数を変更しようとしています。しかし、変数がstatic変数の場合、別ファイルにあるスタブ関数からテスト対象のstatic変数を変更する事が出来ません。どのようにすればファイル内static変数にスタブ関数からデータを入力できますか?

回答

ファイル内static変数は、メモリ上には静的にアドレスが配置されています。この特性を利用し、テスト用に新規作成したグローバルポインタを介して、ファイル内static変数へ間接的にアクセスする手法を採用します。具体的な手順は以下の通りです。

1)テストデータを入力したいファイル内static変数(例:static int staticValue)と同じ型のポインタ変数を、スタブソースファイル内にグローバル変数として新規に定義する(下記例:int *inputPointer)。

2)作成したグローバルポインタ変数(例:int *inputPointer)を、テストCSVの INPUT欄に登録する。

3)各テストケースにおいて、作成したポインタ変数の入力データ値として、入力したいstatic変数の「アドレス」を入力します。なお、データ欄には実際のアドレス値の代わりに、「シンボル名」(staticValue)を記述することが可能。

4)スタブ関数の内部では、対象のstatic変数に直接値を代入する代わりに、作成したポインタ変数(下記例:inputPointer[0])に対してデータを入力するコードを記述する。(下記例:inputPointer[0] = staticValue_data)

(例)
■main.c(テスト対象ファイル)


static int staticValue; // ファイル内スタティック変数


// テスト対象関数
int ParentFunc(void){
SubFunc(); // スタブ関数内でstaticValueにテストデータを入力
Output_Value = staticValue;
}


// サブ関数
int SubFunc(void){
if(staticValue == 0) staticValue = 1;
else staticValue = 0;
}


■AMSTB_SrcFile.c(スタブファイル)


int *inputPointer; // main.c内のstaticValueへのアクセス用ポインタ変数
// staticValueを参照するようにテストデータを設定します
int staticValue_data; // staticValueへ入力するテストデータ入力用の変数


// スタブ関数
int AMSTB_SubFunc(){
inputPointer[0] = staticValue_data; //ポインタを通してテストデータを入力
}

図:CSVファイルへの変数登録

図:作成したポインタ変数に 入力先のstatic変数のアドレスを設定