• 締切済み

【C言語】単体テストのイメージが全くつかない

閲覧ありがとうございます。 C言語での改修案件に携わっているのですが、当方C言語も開発も経験のないものでして、単体テストについてお伺いしたいです。 システムBの単体テストをしたいとします。 システムBは、別サーバにあるシステムAからソケット通信で電文を受け取り、同サーバにあるシステムCにメッセージキューで電文を送ります。 また逆に、システムCからメッセージキューで電文を受け取り、システムAにソケット通信で電文を送ることもあります。 基本的にデータの中継を担うシステムです。 このとき、一体システムBの単体テストはどのような項目をやるのが正しいのでしょうか? (※CUnit等は使えません) JavaはJUnitを使っての単体テストの学習はしたことがあるのですが、C言語での単体テストの項目もやり方も全く想像がつきません。 私にPGの才能がないことは重々承知しておりますので、出来れば分かりやすくお教えいただければ幸いです。 よろしくお願いいたします。

みんなの回答

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.5

>単体テストは詳細設計書を元に項目を作るものだと思ってました!ソースコードを元に書いてしまうと仕様通りにできてるか分からない気がしたので… 詳細設計書を元に項目を作るので合ってますよ。 ソースコードが詳細設計書に書かれた仕様に沿っているのかを調べるためのものなんですから、 ソースコードを元に作ってはいけません。 >何故かそれが結合なのか単体なのかよくわからなくなってしまったのです…。 あまり深く考えなくてもよろしいかと。 項目の作り方は単体でも結合でも変わらないですし、 単体テストもmain関数の階層に近づくにつれ結合ほとんど変わらなくなりますから。

sugaru1
質問者

お礼

回答ありがとうございます。 そうなんですね!認識間違ってなかったようでよかったです。 確かに単体と結合の区別をきっちりつけようとして混乱していたのかもしれません。 スタブを作るにしても作り方が分からず大変ですが、シンプルに考えることもしてみようと思います。

  • DESTROY11
  • ベストアンサー率23% (785/3379)
回答No.4

一般的に「単体テスト」とはメソッド(関数)レベルのデバックを言います。 あるメソッドが期待通りの動作をするかですね。 メソッドの引数に想定値、想定外値を入れて、内部のif文などが想定どおりの流れになるか、引数に応じた出力があるかを確認します。 ですから、システムAもBも関係ありません。 現場によってデバッカをつかう、テストプログラムをつくる、紙に出して机上で追うなど手法はいろいろあります。

sugaru1
質問者

お礼

回答ありがとうございます。 そうですよね、それがJavaだと理解できるのですが、Cになると全く理解できなくなってしまって…。 Cでも関数ごとのテストができるんですよね、きっと…どうしてこんなにイメージが湧かないのか自分でも不思議です。 ありがとうございます。

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.3

>このとき、一体システムBの単体テストはどのような項目をやるのが正しいのでしょうか? システムBの行うべき処理(サーバーAから電文を受信し、サーバーCにどのような電文を送信するのかなど)を項目としてあげていけばいいです。 これはJavaで作ったシステムであろうがCで作ったシステムであろうが変わりません。 むしろ、それができないという事であればシステムBが何をするシステムなのか把握していないという事です。 やり方としてはサーバーA、サーバーCのダミーを用意して実際に電文の送受信したり、送受信部分の関数をスタブ化して行うなど色々あります。

sugaru1
質問者

お礼

回答ありがとうございます。 何故かそれが結合なのか単体なのかよくわからなくなってしまったのです…。 単体テストがメソッドに引数を渡してその振る舞いを判定するものだと思ってるからだと思います。 回答で教えていただいたことをベースに考えてみたいと思います。ありがとうございます。

  • agehage
  • ベストアンサー率22% (2552/11349)
回答No.2

単体テストはソースコードをもとに試験項目を作っていきます なのでこの説明だけではまったく回答ができないのです ソースの流れに対して、すべての条件において期待通りの動きをするか?を確かめていきます 分岐があるならどの条件で分岐するか? 繰り返し処理があるなら、入力があるなら、出力があるなら、とソースの動きに対して試験していきます 少なくともAからの電文が入ったらどうなるか?電文の最大値ではどうなるか?最大値以上でどうなるか?電文が来なかったらどうなるか?使用できない文字があったらどうなるか?などは試験項目になりうるのではないでしょうか?

sugaru1
質問者

お礼

回答ありがとうございます。 単体テストは詳細設計書を元に項目を作るものだと思ってました!ソースコードを元に書いてしまうと仕様通りにできてるか分からない気がしたので… 情報が足りない中、アドバイスありがとうございます。 参考にさせていただきます。

  • sukeken
  • ベストアンサー率21% (1454/6648)
回答No.1

こんにちは。 チームで開発をされているのですよね? 指導(指示)してくださる方に、その辺は確認するべきではないでしょうか? テスト結果も成果物のひとつとして必要な場合もありますから、勝手なことをしたところで、なんの意味も無い可能性があります。

sugaru1
質問者

お礼

何度もすみません!私の質問の仕方が悪かったようです…。 正しいか?と聞かれればそれはその現場によるという風になってしまいますよね。 皆様ならどんなテストをしようと考えますか?というようなことが聞きたかったのですが、言葉を間違えてしまいました。 すみません。気付かせていただき、ありがとうございました!

sugaru1
質問者

補足

回答ありがとうございます。もちろん実際にテストをするとなれば項目について確認します。 ですが、項目を作成する前段階で、全くどのようなテストをすればよいかイメージすら掴めないので、経験豊富な方に、こういうテスト項目、こういう観点、こういうやり方がある、というようなことをお伺いしたかったのです。 環境的に1から10まで教えてもらえるような環境ではないので、皆様の知恵をお借りしたく質問した所存です。 アドバイスありがとうございました。

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

  • VC++ 6.0 のソケット通信について

    VC++6.0にてソケット通信プログラムを作成中(学習中)なのですが 以下のようなソケットのやり取りを想定しています。 A→B→C A←B←C 分かりづらいかもしれませんが、A,B,C三つのプログラムがあり まず、AはBに向けて電文を送信、Bはそれを受信し、Cに電文を送信 Cはそれに対してBへ電文を送信、BはCからの電文を受信しAへ電文を送信 こんな感じになっています。いうなればA,C間の中継器のような役割をBに持たせたいのです。 http://blog.livedoor.jp/akf0/archives/51585502.html ここのソースなどを参考にしてBのプログラムを組んでいるのですが サーバとクライアントでソースが分かれています。 Bはサーバもクライアントも兼ねるような仕様なのですが、この場合に使用するソケットは (1)Aからの受信を行う(待つ)ソケット (2)Cへ送信を行うソケット (3)Cからの受信を行う(待つ)ソケット (4)Aへ送信を行うソケット の4つのソケットが必要になるのでしょうか? ソケットの仕組みがうまく理解できていないので頓珍漢な質問かもしれませんが 回答よろしくお願いします。

  • c言語ネットワークプログラミングのAPIを乗せているwebページないですか?

    現在私はC言語でソケット通信を使って サーバとクライアントでメッセージのやり取りをおこなってみたいと思っているのですが どのライブラリのどの関数を使って通信できるのか全くわかりません。 (例えば、readの返り値ってなにを返すんだろう?とか) できればunix上(SunOS)でのc言語ネットワークプログラミングに関する APIが乗っているURLを教えていただけないでしょうか?(できれば日本語のwebページがいいです。)

  • Unix/Linux-Cを勉強したいのですが

    (C++が入っていてもいなくてもよい) ・セマフォ ・clone ・メッセージキュー ・ソケット通信 などのやさしい具体例が載っているいい本は無いでしょうか?

  • C言語について

    C言語を少しかじっている初心者です。こんな私が何故か今年会社の新人にプログラミングを指導することになりまして。。。ですが、あまりにもわからないことが多すぎるので、どなたかお助けください。 質問。 (1)C言語で開発されるシステムって実際にはどういうものが多いのでしょうか。 (2)CはVBなどのように、フォーム昨日がないですが、操作画面はどうやって作るのでしょうか。 (3)単体プログラムを結合をさせる時は、作った関数をヘッダファイルにして、mainで呼び出すのでしょうか。 また、研修の最後に成果を見せてもらうために、新人でプロジェクトを組んで簡単なシステムを作ってもらおうと思っています。設計から仕様書作成、結合、テスト・・・と一通りの開発手順を体験させたいのです。 でどんなシステムを作ってもらおうか悩んでいます。1プロジェクト6人で開発日数は3日。コンパイラはlsic-86で、ファイル処理関係がいいのです。なるべく実用的なもので・・・と考えているんですが、なにか良いネタはないですかね。。。 質問ずくめで申し訳ありませんが、どなたかよろしくお願いいたします。

  • RS-232Cのシュミレーターを探しています。

    ある機器(A)と機器(B)がRS-232Cケーブルでつながれているのですが、 機器Aから出力された情報を不正な電文に変更し、機器Bに送りつけるというテストを考えています。 PCで使用できるシュミレーターで 機器Aとシュミレーター用PCをRS-232Cケーブルで接続、 (1)機器Aから受けた電文を取得 その後RS-232Cケーブルを機器BとPCにつなぎ変え、 (2)取得した電文を編集して機器B送信 ということを行えるシュミレーターはないものでしょうか。 当方RS-232Cには全く詳しくないため、 わかりやすい、手っ取り早くテストできる方法を探しています。 また、そんなテスト方法はできない、 こうすればできるなどのご意見あれば教えてください。 よろしくお願いいたします。

  • 単体テストのテストケースにて引数に値を入れたいです

    使用言語:JAVA言語 単刀直入ですが、djunitでの単体テストのメソッドの引数に値を設定したいですがどうすればいいのでしょうか? 引数がString型 Messageクラス public class Messages { public String getMessage(String message) { return message ; } } テストケース作成 public void testGetMessage001() { System.out.println("[testGetMessage001]"); Messages messages = new Messages(); System.out.println(messages.getMessage("Hello")); } とやれば、インスタンス生成してgetmessageメソッドにHelloが入ります。 問題は次の場合で仮にAxxクラスとして Public class Axx{     Public void getAxx(HttpServletRequest request){ ~処理~ } } 引数に(クラス名 オブジェクト名?) この場合、テストケースに Axx axx = new Axx(); System.out.println(messages.getAxx("????")); のようにMessageクラスと同じようにできるのでしょうか? それとも別の方法でHttpServletRequest requestに値をセットできる方法があるのでしょうか? よろしくお願い致します。

    • ベストアンサー
    • Java
  • C言語の変数について

    C言語の変数について教えていただきたいです。 C言語で下記のような設定をした場合、変数A、Bに設定する値にはバイト数制限 はないのでしょうか? バイト数制限がなくなる場合、なぜそうなるのかを教えていただきたいです。 よろしくお願いします。 #include <stdio.h> void test( char **B); int main( int argc, char *argv[] ) { char *A = NULL; char *B = NULL; A = argv[1]; test( B ); return 0; } void test( char **B ) { strcpy(B, "ABCD"); return 0; }

  • 異なる言語間でのソケット通信について

    簡単なネットワークプログラムを作成して、ソケット通信の確認をしています。 クライアントとサーバが両方ともにC++の場合と、両方ともにJavaの場合で、正常に通信が行われていることは確認しました。 そこで、クライアントでC++のプログラムを動かし、サーバでJavaのプログラムを動かしてみたのですが、うまくいきませんでした。 (ポート番号を合わせたので、相互接続は出来てるみたいですが、データが渡ってきませんでした。OSはクライアント/サーバともに、Windowsです。) 言語が異なる場合の、ソケット通信について良いサイトをご存知でしたら、教えていただけないでしょうか?

    • ベストアンサー
    • Java
  • システムテストの効果的な方法

    30代男で、システム開発をしています。 今まで、プログラミング行程を中心にやってきたのですが、現在人手不足のため、設計からシステムテストも行うことが多くなってきています。 単体テストも大変な作業ですが、システムテストも別の意味で大変な作業ということを実感しています。システムの業務的な知識が必要であるため、いろいろなことを限られた時間で学ぶ必要があります。どのようなテストをすればいいのか、想像を働かせる必要があります。 あまり、時間的な余裕がないので、無理な相談と思いますが、効率的な方法な方法はないものでしょうか。 単体テストでは、JUnitやテスト自動化などの手法が考えられますが、システムテストでは簡単にいかないような気がします。

専門家に質問してみよう