• ベストアンサー

コマンド分岐処理 単体テスト

C言語勉強中です。Sub関数の単体テストを行いたいのですが、どうすれば良いのか分かりません。疑似mainを作ってそこに実行された関数の戻り値を返す?というのはなんとなく分かります・・。どういう風に書けばよいのか良いのですか?? #include<stdio.h> int sub_command(int icmd,LINE **stt_pnt,LINE **cur_pnt,LINE **help_pnt,char *afname) { static char *adress=NULL; static int iupdate=0; int ret; int pret; switch(icmd){ case 1: *cur_pnt=(*cur_pnt)->next; Sub_current(*stt_pnt,*cur_pnt); } break; case 2: Sub_apend(stt_pnt,cur_pnt); iupdate==1; break; case 3: Sub_delete(stt_pnt,cur_pnt); iupdate==1; Sub_current; break; case 4: Sub_past(cur_pnt,adress); iupdate==1; break; case 5: ret=Sub_save(*stt_pnt,iupdate,afname); if(ret==0){ iupdate==0; } break; case 6: adress=Sub_copy(*cur_pnt,adress); break; case 7: Sub_help(help_pnt); break; case -1: pret=Sub_quit(iupdate); break; } return pret; }

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

  • ベストアンサー
回答No.2

プログラム文が長いため、簡単なプログラムで説明します。 10倍にするsub_addの単体テスト #include <stdio.h> int main( ) { int i = 1; int j = sub_add( i ); printf( " %d " , j ); } sub_add( int k ){ return k*10; } これで、sub_add関数の結果をmain文で表示してあげることによって、sub_add関数が動作していることを確認できるので、これで10が表示できれば、単体テストOKということです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

参考URL参照。 printfやassertだけでもテストはできます。 要は適当な引数の組み合わせで関数を呼び出し、 期待する結果が得られたかを確認するだけです。

参考URL:
http://codezine.jp/article/detail/1075
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 単体テストの方法が分からない・・。

    表示開始行から終了行までの内容を表示させるSub関数です。iは行カウンタ、sttは先頭エリアポインタ、isttlineは表示開始行、iendlineは表示終了行です。 開始行から終了行まで内容を表示できるか確認したいです。 iとisttlineとiendlineに適当な数を入れて疑似mainにprint文で表示?させればよいのでしょうか・・? どう書けばよいのかいまいち分かりません。 どなたか教えてください。 #include<stdio.h> int Sub_disp(LINE *stt_pnt,int isttline, int iendline) { int i=1; while(i!=isttline){ stt_pnt=stt_pnt->next; } while(i!=iendline){ printf("%d:" "%s", i, stt_pnt->buf); i++; stt_pnt=stt_pnt->next; } return 0; }

  • またまたテストの復習なんですが・・・

    処理内容 基数、および変換対象数値(10進数)を入力させ、それに応じた基数変換を行う。その結果を画面に出力する。 ソースプログラム #include<stdio.h> #define MAX_OUT (16) int InputNum(int, int); char ChangeNum(int); /* メイン処理 */ main(){ int i; /* カウンタ */ int num; /* 対象数値 */ int num_base /* 基数 */ int num_next, num_out; char str[MAX_OUT]; /* 変換後文字格納用 */ while (1){ printf("基数を入力してください(2~32)\n"); printf("(2~32以外の入力で終了)\n"); num_base=InputNum(2,32); if (-1==num_base) { break; } printf("対象の数値を入力してください(0~65535)\n"); printf("(0~65535以外の入力で終了)\n"); num=InputNum(0,65535); if (-1==num) { break; } /* 変換開始 */ ( 1 ) for (i=0; i<MAX_OUT; i++){ /* 変換終了か判定する */ if (num_base>num_next){ /* 変換後文字の格納 */ str[i++]=ChangeNum(num_next); break; } /* 数値文字を抽出 */ num_out=( 2 ) str[i]=ChangeNum(num_out); /* 次の行へ */ num_next=( 3 ) } /* 変換結果を出力 */ printf("対象数値%dの%d進数表現は\n",num, num_base); for (i -= 1; 0<=i; i--) { printf("%c", str[i]); } printf("\nです\n"); } printf("終了します\n"); } /* 数値入力処理 */ int InputNum(int min, int max){ int ret; scanf("%d", &ret); if ((min>ret) || (max<ret)){ ret=-1; } return ret; } /* 数値を文字に変換 */ char ChargeNum(int num){ char ret=0; if (10>num){ ret=num+'0'; } else{ ret=( 4 )+'A'; } return ret; } という問題なんですが、(1)~(4)の答えと説明をどなたかして頂けないでしょうか?どうぞよろしくお願いします!ちなみにwhile(1)は無限ループです。

  • こんな処理は可能ですか?(動的な命名)

    以下のように、switchでnumの値を分岐させてその値ごとに tmp[j][i]に格納する変数を変えたいのですが、こういうことはもっと スマートにできないでしょうか? int num = (ランダムな数取得); for ( int j = 0; j < 100; j++ ){   for ( int i = 0; i < 100; i++ ){     switch ( num ){     case 1: tmp[j][i] = num1[j][i]; break;     case 2: tmp[j][i] = num2[j][i]; break;     case 3: tmp[j][i] = num3[j][i]; break;      ・      ・      ・     }   } } ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 上のコードを int num = (ランダムな数取得); char *str = "num"; strcat( str, (char *)num ); //文字列の連結 tmp[j][i] = (*str)[j][i]; 見たいな雰囲気でスマートにできるのではないかと思ったのですが・・。 動的な関数呼び出しとか##演算子とかそういうのと組み合わせてこんなことは 実現できないでしょうか?

  • ポインタの引数を持った関数の呼び出し方

    ポインタの引数を持った関数の呼び出し方がわからず困っています。 呼び出したい関数は下記 enum{ TEST_TOP_MENU=0, TEST_MAIN1_MENU, TEST_MAIN2_MENU, TEST_MAIN3_MENU, TEST_AREA_TOP_MENU, }; void test_menu_mode(LCD_VIEW_MODE *view) { int ret_menu; switch(view->sub){ case TEST_MAIN1_MENU: ret_menu = test_main1_menu(); break; case TEST_MAIN2_MENU: ret_menu = test_main2_menu(); break; case TEST_AREA_TOP_MENU: ret_menu = test_area_top_menu(); break; } } この関数を呼び出すために main(){ //中略 LCD_VIEW_MODE test; test->sub = TEST_MAIN1_MENU; test_menu_mode(test); //中略 } このようにtest_menu_mode関数を呼び出すとエラーが出てコンパイルできないのですが、どこが問題なのでしょうか?

  • C++DLLからC#へのコールバックに文字列の配列を渡したい

    教えてください! C++のアンマネージドDLLから、複数のファイル名(文字列)をC#に渡したいです。 ステップとしては、 C#から、C++のDLLの関数を最初に呼んで、コールバック関数を渡しています。 次に、DLLからコールバック関数を呼ぶ時に、複数のファイル名を渡したいです。 以下のコードを動かすと、、 C++からは2つ渡しているつもりなのに、 C#ではfilesがサイズ1のString配列として引数に入ってきます。 なぜでしょう? またどうすればC#から複数受け取れるでしょうか? 教えてください! C# public delegate int StringArrayCallback(String[] files); // C# -> C++ public static int start() { StringArrayCallback cb = new StringArrayCallback(onReceivedFiles); int ret = start(cb); return ret; } // C++ -> C# callback public static int onReceivedFiles(String[] files) { return 1; } C++コード typedef int (__stdcall *OnReceivedFilesProc )(char**); int start( OnReceivedFilesProc callback ) { std::string message1_ = "from C++1"; std::string message2_ = "from C++2"; char* messages_[2] = { (char*)message1_.c_str(), (char*)message2_.c_str() }; int ret_ = callback(messages_); std::cout << "[from c#]" << ret_; }

  • char*の実体の数値をchar変数に格納する方法

    ある関数の戻り値がchar*でその関数の戻り値をchar変数に格納したいです。 char *ret_ch() { char *p="12"; return p; } int main(){ char res; //ここでret_ch()の戻り値の実体数値を代入 res=*ret_ch(); cout<<"RET=="<<ret<<endl; return 0; } char型は1バイトなので一文字しか入りません。 char型に数値として扱い、上記のポインターの 実体数値を格納するにはどのようにしたらいいのでしょうか? よろしくお願い致します。

  • 出力されない・・・。

    #include <stdio.h> #include <stdlib.h> #include <string.h> void Rank(int, char*); main() { int a; char msg[100]; printf("数字を入れてください\n"); scanf("%d",&a); Rank(a, msg); printf("順位%s\n",msg); } void Rank(int a_p, char *msg_p) { switch(a_p) { case 1: msg_p = "1番"; break; case 2: msg_p = "2番"; break; case 3: msg_p = "3番"; break; case 4: msg_p = "4番"; break; case 5: msg_p = "5番"; break; } } 上のプログラムのように関数を使ってプログラムを作ったのですがmsgが出力されないのはなぜでしょうか?

  • 複数の戻り値

    関数にポインタを渡して、結果を格納してもらう方法で 複数の戻り値を得ようとしたのですがうまく行きません どうしたら複数戻せますか? ---ソース--- #include <stdio.h> #include <stdlib.h> void check(int a,char *b,char *c); void main(void){ int a; char *b,*c; int i; char *va[5]={"2","3"}; for(i=0;i<5;i++){ //ここ何とかなったらwhileにしとこ if(va[i]!=NULL){ a=atoi(va[i]); check(a,b,c); printf("%s%s\n",b,c); } } } void check(int a,char *b,char *c){ switch(a){ case 0: b="0:×\n"; c="0:○\n"; break; case 1: b="1:×\n"; c="1:○\n"; break; case 2: b="2:×\n"; c="2:○\n"; break; case 3: b="3:×\n"; c="3:○\n"; break; case 4: b="4:×\n"; c="4:○\n"; break; } }

  • 文字列処理関数について

    おみくじのプログラムを書きました。初めのが私のもので、次のが参考書のものなのですが、なんでわざわざ 文字列処理関数を使うのかがわかりませんでした。 教えてください!! int main() {   int r =0;   int i =0;   srand(time(NULL));   r = rand()%3+1;   for(i=0;i<2;i++){    if(r == 1)    {  printf("大吉:充実した1日\n");    }    else if(r == 2)    {  printf("小吉:充実した1日\n");    }    else    {       printf("凶:衝動買いに注意\n");    }    return 0; } ********************** ********************** main(){     int kuji;     char kekka[6];     char str[45];     srand(time(NULL));     r = rand()%3+1;     switch(kuji){     case 1:           strcpy(kekka,"大吉");         strcpy(str,"金運アップ");         break;    /*case2,3は省略します*/           default:    break; } printf("%s:%s",kekka,str); return 0; }

  • C言語のコンパイルエラー

    次のようなコードで (宣言等は省略します) extern int main( int argc, char *argv[]) { short ret ; ret = aaa(); } static short aaa() { /* aaa()関数の処理 */ XXXXXXXXX return 1; } というようなコードをコンパイルすると ワーニングで warning: 'aaa' was declared implicitly `extern' and later `static' warning: previous declaration of `aaa' warning: type mismatch with previous implicit declaration というようなメッセージが出ます。 これは、他のソースをまねて作ってるのですが、 参考にしたコードもこのような宣言の仕方になっているのにエラーはでまでん。 何か他にもaaaという関数の定義をしなくてはいけないのでしょうか? どうもstatic宣言とexternのところがよくわかりません。 宜しくお願いします。