• ベストアンサー

単体テスト スタブ作成に関して

同一ファイル内にテストする関数とその関数から呼び出される関数があった場合、どのようにスタブは作成すればいいのでしょうか? test.c ------------------------------ funcA(){ //funcA()のテスト funcB(); } funcB(){ } //funcB()のスタブを作りたいが同じファイルにあるため自動的に本物の関数がリンクされてしまう。 ----------------

質問者が選んだベストアンサー

  • ベストアンサー
  • ken-etsu
  • ベストアンサー率46% (55/119)
回答No.1

別のファイルにする、ってんじゃダメなんですか? そうでなければ、 #define FUNCB funcB と #define FUNCB funcB_stub で切り替えるとか、一時的に本物のfuncBをコメントアウトするとか。

関連するQ&A

  • 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関数を呼び出すようにするには どのようにしたらよろしいでしょうか?

  • [単体テスト] static関数のstub

    以下の構成の関数Bをテストしようとしています。 [xxx.c]--------- A() { B(); } ---------------- [yyy.c]--------- B() { C(); } static C() { } ---------------- テスト対象がBのため、driverAとstubCを作成しました。 また、本体xxx.c, yyy.cは共有ライブラリにしているため、A関数・C関数とも名前衝突は起きません。 期待するコールとしては、A(driver)→B(ライブラリ)→C(stub)です。 しかし現状A(driver)→B(ライブラリ)→C(ライブラリ)となってしまいます。 これは、C関数がstaticな為、ビルド時にstubではなくライブラリを優先してリンクしてしまうからだと思います。(そもそもライブラリしか探索しないのか。。。) 本体のソースコードに手を加えず、A(driver)→B(ライブラリ)→C(stub)のテストを行う方法はありますでしょうか。 ※環境 linuxのgcc ご教授宜しくお願いいたします。

  • [Delphi]入れ子(?)になったプロシージャ

    こんにちは、honiyonです。  あるプロシージャだけが呼び出す関数がある為、次のように定義しました。  procedure Subfunc;   function funcA:integer;   begin    ~    function funcB;    ~   end;   function funcB:integer;   begin    ~    function funcA;    ~   end;  begin   ~  end;  funcAとfuncBは協調して動作するのですが、当然funcAからfuncBは見えていませんので、「funcBが見つからない」とエラーになります。  しかし、この場合どのようにfuncBの存在を定義すれば良いのかわかりません。  あまりこのような形で作成するケースが少ないようで、資料がなく困っています(^^;;  宜しくお願いします(..

  • サブルーチン内のサブルーチン定義について

    サブルーチン内で定義したサブルーチンで、思い通りにならない挙動で困っています。 'test'を10万回繰り返す文字列の生成を行い、その文字列長を表示する関数を funcA とします。その生成過程では、自分の関数内で宣言した再帰関数 funcB を呼び出します。 #! /usr/local/bin/perl use strict; my $time0; for(my $i=0; $i<10; $i++){   $time0 = times();   &funcA();   print((times() - $time0). "\n"); # funcAに掛かった時間 } sub funcA {   my $buffer = '';   &funcB(1);   print length($buffer) . " : "; # $buffer の文字列長      sub funcB{     my $n = shift;     $buffer .= 'test';     return if($n==100000);     funcB($n+1);   } } この結果が、 400000 :3.063 0 :0.468 0 :0.594 0 :0.766 0 :0.859 0 :1.11 0 :1.187 0 :1.141 0 :1.343 0 :1.469 となり、初回以降 $buffer の長さが0となるのも不可解ですが、funcA の実行時間が増加していくのも理解できません. これを #! /usr/local/bin/perl use strict; my $time0; my $buffer; # 注1 $buffer をファイル内大域変数として宣言 for(my $i=0; $i<10; $i++){   $time0 = times();   &funcA();   print((times() - $time0). "\n"); } sub funcA {   $buffer = ''; # 注2 レキシカル変数宣言をやめた   &funcB(1);   print length($buffer) . " : ";      sub funcB{     my $n = shift;     $buffer .= 'test';     return if($n==100000);     funcB($n+1);   } } とすると、結果は 400004 :3.188 400004 :0.234 [以降、上にほぼ同じ] と文字列長は正しいものの,初回以降のfuncA実行時間が極端に減ります. 内部ではどういうことが起こっているのでしょうか.

    • ベストアンサー
    • Perl
  • javaのスタブを作成するコツ

    javaのテストモジュールに対するスタブモジュールを作成する上で考え方等のコツをおしえてください。 抽象的な質問で申し訳ありませんが、思ったことは何でもいいのでお願いします。

    • ベストアンサー
    • Java
  • C言語で、記憶クラス指定子extern・staticを関数に指定

    C言語の本に、「関数の定義と呼び出す側が別ソースファイルの場合、プロトタイプはヘッダーファイルに書き、定義側と呼び出し側の両方でインクルードしましょう」ということが書かれていました。 例えば、 ===code1a.c=== extern void funcB(int); static void funcA() { funcB(1); } ===code1b.c=== void funcB(int a) { printf("%d\n",a); } このような場合には、もしcode1b.cの中の関数funcBに引数を追加した場合、再コンパイルしても気づかないのでよくない。 そこで、次のようにヘッダーファイルを作り、プロトタイプはそこに書くべきだ。 ***code2b.h*** extern void funcB(int); ***code2a.c*** #include "code2b.h" static void funcA() { funcB(1); } ******code2b.c**** #include "code2b.h" void funcB(int a) { printf("%d\n",a); } 記述は以上のようなことです。 #include "code2b.h" とは、 extern void funcB(int); が書いてあるのと同じだと思います。 私が思ったのは、本の勧める方法では、 funcBを定義しているcode2b.cで、プロトタイプの記憶クラス指定子が、externになっているが良いのか(externとは、別のソースファイルで定義されているという意味ではないか)ということです。 extern, staticは、プロトタイプに書くべきなのか、関数の定義に書くべきなのか、も両方に書くべきなのでしょうか。 私の処理系では、 ・プロトタイプ宣言でexternを付けて関数定義でstaticを付ける、 ・staticを付けた関数を他のソースファイルで呼ぶ、 などの明らかに矛盾する場合は、コンパイルエラーになります。 でも、extern単独での役割はなさそうです。 他の処理系でも同じでしょうか。 (main等省略)

  • C/C++ return文で関数の返却値を返却

    まず、処理がエラーだと-1を返し、正常だと0を返す関数が2つあり、それぞれint funcA()、int funcB()とします。 この時、それらとは別の関数で以下のようにreturn文を書くとどのように値を返しますか? return funcA() || funcB(); 共に0を返す時、どちらかが0を返し他方は-1を返す時、共に-1を返す時についてご教示願います。 またあえてこのように記述するくらいならノーマルに以下の記述の方が良いですか? if (funcA() != 0 || funcB() != 0 ) { return -1; } else { return 0; } (インデントしていないので読みづらかったらすみません)

  • CからC++の関数呼び出し

    CからC++の関数を呼び出して値を取得したいのですが、コンパイルエラーになってしまいます。 呼び出す関数内でさらに同じクラスの関数を呼び出して値をreturnしたいだけなのですが、 ご教示願います。 ソースは下記のような感じです。 Cソース(AAA.c) main(){ ・・・・・ if ( funcA() ){ ・・・・ } } C++ソース(BBB.cpp) int clsB::funcB { return iflg; } extern "C" { int funcA() { return funcB(); } } ※上記externは特に何かの関数内に書いているわけではありません。 C++ヘッダ(BBB.hpp) class clsB : public XXX { private: int iflg; ・・・・ public: int funcB(); ・・・・ } 上記にコンパイルすると、 externしている箇所でfuncBはスコープにありません?のようなエラーが出てしまいます。 ラッパ関数を使って使用するなどと聞いたのですが、やり方がいまいちわかりません。 どうか教えていただけますでしょうか。 また、他にやり方があるかと思いますが、いいやり方があれば教えていただけると幸いです。 以上です、よろしくお願いいたします。 不足内容あれば指定願います。

  • 単体テストのやり方

    単体テストってどうやってするのですか?教えてください。 例えば、この関数だったらどういうテストコードを書けばいいですか? bool isStart(char c){ if(c == 'Y'){ return true; } else if(c == 'N'){ return false; } }

  • C言語:引数の型だけ異なる関数を一つにまとめる方法

    以下の引数の型だけ異なる関数を、どうにかして一つにまとめたいのですが、 何か良い方法はないでしょうか? void funcA(_MNGR_TAG mngr){ 処理X; } void funcB(_COPY_MNGR_TAG mngr){ 処理X; } 補足: ・_NODE_TAGと_COPY_NODE_TAGは構造体です。ただし中身は異なります。 ・(引数名が同じため)funcAとfuncBで行っている処理は全く同じです。 注意事項: 関数テーブルやC++言語を使用する方法は除いて下さい

専門家に質問してみよう