- 締切済み
C言語での単体テストの作成について質問です。
C言語での単体テストの作成方法がわからずに困っています。 以下のようなA.cの中のFuncA関数のテストを作成しています。 /*** A.c ********************/ #include "B.h" int FuncA (int n) { int temp; if (FuncB() == true) temp = n * 2; else temp = n / 2; return temp; } /****************************/ FuncA関数は中でB.c内のFuncB関数を読んでいますが、 これは、B.h、B.cに定義されている関数です。 このFuncB関数は本物のソースを使用せず、スタブを使用してテストを作成しています。 FuncB関数のスタブは以下のように考えています。 /*** BStub.h ********************/ extern bool retVal extern bool FuncB_Stub(void); /******************************/ /*** BStub.c ********************/ #include "BStub.h" bool retVal; bool FuncB_Stub(void) { return retVal; } /******************************/ できる限り、A.cに単体テスト用のコードを埋め込まずにテストを作成したいのですが、 FuncA関数がFuncB関数ではなく、BStubのFuncB_Stub関数を呼び出すようにするには どのようにしたらよろしいでしょうか?
- みんなの回答 (3)
- 専門家の回答
みんなの回答
リンクするとき、Bのオブジェクトコードを入れ替えればよいと思います。 テストするなら BStub.o を、そうでなければ B.o をリンクするように Makefile を書いて、makeのコマンドライン引数で簡単に切り替えられるようにするのがよいかと。(LinuxなのかWindowsなのかよく分かりませんが) もちろん、スタブの関数名はFuncB_SubではなくFuncBにして。
- hanabutako
- ベストアンサー率54% (492/895)
LD_PRELOADに近いですが、テストをリンクするときにstubとリンクするという方法もあるかもしれません。 よく使われる手にはfuncBの関数ポインターをfuncAに何らかの方法で渡し、それを実行するという方法もありますが、これはfuncAのファイルを書き換えるのでNGですよね。
- wormhole
- ベストアンサー率28% (1626/5665)
プラットホーム依存になりますがOSがlinuxやunix系OSの一部(HP-UX,FreeBSDなど)なら環境変数LD_PRELOADを調べてみるといいかもです。