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;
}

このQ&Aに関連する最新のQ&A

A 回答 (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ということです。
    • good
    • 0

参考URL参照。



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

参考URL:http://codezine.jp/article/detail/1075
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q  単体テストを自分でも組めるのか?

  単体テストを自分でも組めるのか?
C++でOOPに挑戦しているんですが、CppUnit?とか全くわからないのですが
単体テストの概念は分かるのです。
自分はC++の経験が浅く使いこなすようになったばかりの新参者なんです。
この状態で単体テストというものを用いてプログラムを組むことは可能なんでしょうか?
もしくは開発効率は上がるんでしょうか?

Aベストアンサー

専門書を買って熟読することを勧めします
書店に読み切れないくらい置いてあります
お勧めは、「基本から学ぶソフトウエアテスト」分厚いけど
読んでいるか? いないか? その程度でも、差は出ると思ますよ

>この状態で単体テストというものを用いてプログラムを組むことは可能なんでしょうか?

誰しも、必要なスキルとしてとらえ努力して身につけています
誰でも、最初は初心者ですよ

>もしくは開発効率は上がるんでしょうか?

上がります
ただし、最低仕様書が書けないとダメ

>自分はC++の経験が浅く

それは努力で補いましょう
大丈夫、できなければ代わりはごまんと居ます

Qint select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)について

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識だとreadfds,writefdsが引数として与えられているとしても、
どちらかのfd_setのうち、一つでも動きがあればselect文は
抜けてしまうことになります。とすると、戻り値として
「readfds, writefds, exceptfds 中の 1 になっているビットの総数」
は常に1ということになってしまいます。しかし、総数というからには
複数同時に1になることもあるはずです。

私の認識が間違っているとは思うのですが、どう間違っているのかわかりません。
select文の動きについて詳しく教えていただけないでしょうか。
または良いページがあれば教えてください。

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きが...続きを読む

Aベストアンサー

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビットが一度にONになっているはずです。
一方、相手が、一切電文を送ってない状態で、selectを呼び出した場合は、何れかのビットがONになればリターンするので、そのときは、貴方が想像しているように
ビットの総数は1になる可能性が高いです。
従って、相手が電文を送る前にselectを呼び出すか、送った後にselectを呼び出すかは、その時のタイミングにより異なります。従って、ビット数の総和が常に1であるとは、考えない方が無難です。(1つのソケットしか使用しない場合は別ですが・・・)

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビ...続きを読む

Q単体テストについて

システム開発を行う際に、単体テストというものを
行うらしいですね。(勉強している身です。)

Webで情報を探すと、単体テストの重要性や
テストがいい加減になってきてる等の情報が数多くあり、
思うように欲しい情報が見つかりません。

単体テストを行うに当たって、何が必要ですか?
例えばソースコード。
必要なものと、何に使うかもご教授いただければ幸いです。

Aベストアンサー

ソースコードとは、プログラムそのものの事ですので
この場合、机上デバッグと呼ばれる単体テスト項目に該当しますね。
要するに見直し。

後は、そのアプリの動作を全て網羅する事。
インプットデータとアウトプットデータをそろえます。
テスト仕様書というものを作成し、チェックを行います。
納品物となる場合は、アウトプットを添付する場合も。
欲しい回答かどうかわかりませんけどうまく説明できてなかったらすみません。

Q「void ( *signal(int sig, void (*func)(int)) ) (int)」の (int)

signal関数の書式についてですが、

  void ( *signal(int sig, void (*func)(int)) ) (int);

最後に付く(int)は一体何でしょうか?
このような関数の書式ははじめて見ました。
UNIX系の何かでしょうか。
回答よろしくお願いします。

Aベストアンサー

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
より後半部分のtypedefを置き換えると
sighandler_t signal(int signum, void (*sighandler)(int));
つぎに戻り値の部分のtypedefを置き換えると
void (*signal(int signum, void (*sighandler)(int)))(int);
となります。
(
sighandler_t signal(int signum, void (*sighandler)(int));
の「signal(int signum, void (*sighandler)(int))」をAと置き換えて
sighandler_t A;
からtypedefを置き換えると
void (*A)(int);
となり、Aを戻すと
void (*signal(int signum, void (*sighandler)(int)))(int);
となる。
)

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
より後半部分のtypedefを置き換えると
sighandler_t signal(int signum, void (*sighandler)(int));
つぎに戻り値の部分のtypedefを置き換えると
void (*signal(int signum, void (*sighandler)(int)))(int);
となります。
(
sighandler_t signal(int signum, void (*sighandler)(int));
の「signal(int signum, void (*sighandler)(int))」をAと置き換えて
sighandler_t A;
からtypedefを置き換...続きを読む

Q単体テストのテストケースの考え方(あげかた)について

単体テストのテストケースの考え方(あげかた)について

最近、プログラム(java)をはじめたものです。
単体テストを行ううえで、
まず、テスト仕様書の作成を行う(正確にいえば詳細設計段階でやりますが…)と思いますが、
そのテストケースのあげかたはどういう着眼点であげればよいのでしょうか?

単体テストは、詳細設計に対してのテストだと思いますので、
基本的には、詳細設計で作成いたフローチャートの分岐をすべてのケース通るような仕様書を作成しています。

ただ、このやり方だと、問題があるような気がするのです。
たとえば、javaでMapを使用していて、
入力値が、値が固定のMap(例:1,2,3)に入っていればtrue、入っていなければfalseという処理があるとき、
フローチャートでは、trueかfalseかの2パターンしかなく、
実際のコードの記述もget(入力値)で、あるかないかだけ判断するため、2パターンです。
しかし、実際は、固定Mapの値1,2,3,とそれ以外という選択肢があるとおもうのですが、
こういう場合は、1、2、3、それ以外の4パターンのテストを行うべきでしょうか?
それとも、Mapにあるかないかだけの部分なので、trueの時とfalseの時の2パターンでいいのでしょうか?

単体テストのテストケースの考え方(あげかた)について

最近、プログラム(java)をはじめたものです。
単体テストを行ううえで、
まず、テスト仕様書の作成を行う(正確にいえば詳細設計段階でやりますが…)と思いますが、
そのテストケースのあげかたはどういう着眼点であげればよいのでしょうか?

単体テストは、詳細設計に対してのテストだと思いますので、
基本的には、詳細設計で作成いたフローチャートの分岐をすべてのケース通るような仕様書を作成しています。

ただ、このやり方だと、問題があるような気が...続きを読む

Aベストアンサー

単体テストは仕様書に従うべきものです。
Mapが出てきたのは結果論であって、例えば、switch文とか
if文を連ねるやり方も(定数なら尚更)あり得る話です。
フローチャートにしてもYes/Noだけではなく、多分岐的な
書式もあります。
仕様書では「1、2、3はtrue、他はfalse」と書かれているなら、
「1、2、3、それ以外」の全パターンを通過しないといけません。

Qvoid (*signal(int signum, void (*handler)(int)))(int);

の解釈を教えてください
最後の「(int)」については詳しくお願いします

Aベストアンサー

signalが

(1)1つ目の引数の型:int
(2)2つ目の引数の型:引数がintで戻り値がvoidである関数へのポインタ
(3)戻り値の型:引数がintで戻り値がvoidである関数へのポインタ(2と同じ)

を満たす関数である事を宣言しています。最後の(int)はsignalの戻り値の
関数ポインタがint型の引数を持つ事を示しています。

「引数がintで戻り値がvoidである関数へのポインタ」の型をHANDLERと表すと

HANDLER signal(int signum, HANDLER handler);

となります。

Qギヤードモーター単体テスト方法

ギヤードモーターについて単体テストをしたいのですがその方法を教えて下さい。宜しくお願いします。

Aベストアンサー

電源に接続する。
(12Vなら12Vに、1.5Vなら1.5Vに)

Qint *a = new int; エラー

下記をコンパイルすると、'int' 型は 'int *' 型に変換できない(関数 main() )
とエラーが出てしまいました。 何がおかしいのでしょうか ?
初歩的な間違いをしていると思いますが、アドバイスお願いします。

#include<iostream>
#include<stdlib>
#include<ctime>
using namespace std;

void main(void)
{
int *a = new int;
a=rand();
cout<<a<<endl;
delete a;

}

Aベストアンサー

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;

int main(void)
{
srand ( time(NULL));
int *a = new int;
*a=rand();
cout<<*a<<endl;
delete a;
return 0;
}

/*
多分こうだと思う。
想像以上に乱数の精度が悪いような気がする。
*/

Q単体テスト手順書

単体テストについて教えて下さい。
どういう順番で、何をやればいいのか
是非是非、ご教授願います。

Aベストアンサー

単体テストは、システム全体の中での位置づけを気にしない状態(単体)で
そのプログラム(で良いのかな?)に求められている機能について「のみ」、を
試験することでしょう。

「求められている機能」は仕様書に記述されていませんか?
操作手順書とも関連していると思います。


1.性別で「1」を選択して「男性」と表示されること。(OK/NG)
2.性別で「2」を選択して「女性」と表示されること。(OK/NG)
のような感じでしょうか。

Qint main の前のint add(int a,int b) ってなんですか?

int main の前のint add(int a,int b)
ってなんですか?

Aベストアンサー

関数のプロトタイプ宣言です。

賢いコンパイラだと後ろに書いてある実体を見て関数値や引数の型を読み取ってくれたりしますが、コンパイラによっては先に(つまりソースコードのより上の行に)型を宣言しておかないと正しく値の引き渡しができないものもあります。そういったトラブルを避けるために、add()という関数を使う箇所よりも上に、その返り値や引数の型を宣言しておくのです。

ちなみに、#include <stdio.h>というインクルードがありますが、このstdio.hファイルの中には、main()内で利用しているprintf()等の標準関数についてのプロトタイプ宣言なども書かれています。


人気Q&Aランキング

おすすめ情報