ホーム > ユーザーサポート > FAQ カバレッジマスターwinAMS
【質問】
テスト対象関数がスタティック変数を使っています。スタブ関数からこのスタティック変数を操作したいのですが、テスト関数とスタブ関数はソースファイルが別であるため、スタブ関数からは、テスト対象関数のソースにあるスタティック関数にアクセスできません。どのようにすれば良いでしょうか?
【回答】
例えば以下の様なテスト対象関数test_sample()と、サブ関数sub_sample()があるとします。
----- source.c ---- static int val=0; // スタブソースAMSTB_SrcFile.cからはアクセスできない void test_sample(void) { val = 0; // 初期値 sub_sample(); // サブ関数sub_sampleで、valが変化 if( val = 0 ) { 分岐処理0 } else { 分岐処理1 } } void test_sub(void) { valを操作する処理 }
サブ関数のスタブ関数は、上記のsource.cとは別の AMSTB_SrcFile.c に作成されるため、ここからはスタティック変数valが参照できません。
そこで、スタティック変数valを間接的に参照する方法を採ります。手順は以下の様にします。
1)スタブ関数のソースファイル内に、「static int val」と同じ型のグローバル変数のポインタを作成します。
2)スタブ関数内でstatic int valを操作する代わりに、作成したポインタの実体を操作するコードを作成します。
--AMSTB_SrcFile.c-- int *ptr_val; void AMSTB_test_sub(void) { static int INPUT_param; // CSVファイルからの入力変数を作成 ptr_val[0] = INPUT_param; // 入力変数値をptr_val[0]にセット }
3)テストCSVファイルの入力変数に、上で作成した「ptr_val」(CSV雛形作成画面で「アドレス設定」オプションで登録)と、「ptr_val[0]」(CSV雛形作成画面で「ポインタ添え字設定」オプションで登録)を登録します。
4)ptr_valのテストデータには、スタティック変数valのアドレス値を入力します。アドレス値はシンボル名で代用できますので、テストデータには「source.c/val」を指定します。これにより、テスト実行時には、スタブソースに作成した ptr_val にvalのアドレスが入り、ptr_val[0]はvalと同じメモリになります。
※ファイル内スタティック変数の書式は [ソースファイル名]/[変数名] です。
5)「INPUT_param」にはvalに与えたいテスト条件を入力します。
これにより、sub_sample()のスタブ関数実行時に、INPUT_param に与えたデータがptr_val[0]に代入されますが、ptr_val[0]はvalと同じメモリを指していますので、結果的にスタブ関数からvalの値を変更できます。