人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

単体テストと結合テストについて教えて下さい。

単体テストとはどの範囲を単体テストと呼べば良いのでしょうか?
また同様に結合テストとはどの範囲を結合テストと呼ぶのでしょうか?

下記のような機能が二つある場合


【モジュール?(住所検索機能)】
Java1
Java2 この3つのモジュールで1機能とする場合
Java3

【モジュール?(情報データ登録機能)】
JavaA
JavaB この3つのモジュールで1機能とする場合
JavaC

モジュール?で、検索機能が正常動作するかを確認することを「単体テスト」
(1機能が正常に動くかどうかを視点とみるものが単体テスト)

モジュール?の検索機能を使用して、
モジュール?の情報データの登録を行う、1機能と1機能を併せて正常動作の確認することを「結合テスト」と呼ぶのでしょうか?
(2つ以上の機能を併せて動作確認を行う事が結合テストと呼ぶのでしょうか?)

参考サイトでは、
単体テストは仕様を十分満たしているかの確認、
システムテストはシステム全体が稼動するかどうかの確認と書かれていたのですが、
具体的に範囲を付けるとしたらどう境目を付ければ良いのでしょうか?

●質問者: like_aoihana
●カテゴリ:インターネット ウェブ制作
✍キーワード:いるか サイト システム システムテスト データ
○ 状態 :終了
└ 回答数 : 7/7件

▽最新の回答へ

1 ● KUROX
●30ポイント

単体テスト、結合テストをしやすい構造で作ることが前提です。

作ってから区別するのは至難の技です。

単体テストは、できる限りの範囲で範囲を小さくしてテストします。

結合テストは、単体テストではできない機能の組み合わせのテスト

となります。

WEBアプリとかのような場合は、単体テストと結合テストの切り分けが

きちんとできない場合が多いです。重要なのはテスト漏れがないように

テストするということです。

>具体的に範囲を付けるとしたらどう境目を付ければ良いのでしょうか?

単体テストは、テストできる最小単位にするしかありません。

http://q.hatena.ne.jp/answer

◎質問者からの返答

ご回答ありがとうございます。


>単体テストは、できる限りの範囲で範囲を小さくしてテストします。

ありとうございます。

目の前がパーーっと開けたような感じです。


1機能がどうこう言うよりも、

「最小の範囲でテストを行うこと」が単体テストなのですね。


>WEBアプリとかのような場合は、単体テストと結合テストの切り分けが

>きちんとできない場合が多いです。

おっしゃられている通りが数々の現場では、

幾つか現場で両方を行ったのですが、切り分けが抽象的なところがあったと思います。

現場のリーダーさんに聞いてみても、

「うちではこれを単体テストとしています」

という話の内容が多く、結局どこまでがどの工程なのか?

というところが明確に解りませんでした。


ある現場Aでは、

「単体テストと結合テストの内容、ケース数がほぼ同じ」という場所ありました。

(厳密には単体テストで使用する値は「アアア」などOK

結合テストで使用する値は「実際のシステムで使用される値」で検証。

という形でした。)


ある現場Bでは、

単体テストでは凄く時間を掛けて沢山のケースを行ったのに反して、

結合テストでは10分の1ほどのケースしか存在しないものがありました。


切り分けの視点としては

おっしゃられる「単体テストは、テストできる最小単位」と考えると、

色々な現場でテスト検証のポイントが違ったのも納得がいきました。


ありがとうございます、とても参考になります。


2 ● pahoo
●30ポイント

あくまで個人的な意見ですが、Javaでしたらこんな感じです。

設計書が、単体テスト/結合テストの違いを意識した構成になっていないと、単体テストに時間がかかったり、必要な結合テストをやり損ねたりします。


参考サイト

◎質問者からの返答

ご回答ありがとうございます。

個人的な意見、とても嬉しいです。


「変数に対して仕様を確認」、

こちら、ご確認をお願いしたいのですが


単体テストですと、

性別 "男性""女性" という変数が対象だった場合、

"男性"と"女性"の両方で試して、正常処理が行われるか(エラーが発生しないか)を確認する。

これをホワイトボックステストと呼ぶ、いう認識で良いでしょうか?


結合テストですと、

性別 "男性""女性" という変数が対象だった場合、

"男性"が"女性"どちらかだけ試して、正常処理が行われるか(エラーが発生しないか)を確認する。


どちらかだけで良い理由としては、実際には単体テストで処理が正常に通る事が確認されているので、

動作確認だけで良い。

これをブラックテストと呼ぶ、という認識で合っていますでしょうか?


>設計書が、単体テスト/結合テストの違いを意識した構成になっていないと、単体テストに時間がかかったり、必要な結合テストをやり損ねたりします。

こちら、ありがとうございます。

設計書についてまだ良く分かっていないため、注意点について、とても為になります。


3 ● BAZZ
●60ポイント

モジュール? として Java1, Java2, Java3 があって、「この3つのモジュールで1機能」と表現されています。

ここで、モジュール?は「モジュール群」と考え、Java1,Java2,Java3 をそれぞれ「単体モジュール」と呼ぶことにして、以下に回答します。

・単体テスト:単体モジュール単位のテスト。つまり Java1,Java2,Java3 それぞれでのテストになります。したがって、 たとえば Java1 のテストをするためには、Java1 を稼動させるためのドライバを作成したりします。

・結合テスト:「モジュール群」としてのテストは結合テストになります。したがって、モジュール? の機能テストも、モジュール?の機能テストも、いづれも「結合テスト」です。

なお、結合テストはその結合の度合いから、複数の段階に分類されることがよくあります。例えば、「結合テストA」「結合テストB」と2段階に分けた場合、第一段階の「結合テストA」では、機能単位のテストのこと。「結合テストB」はサブシステム間のテストを意味します。

ご質問の例ですと、たかだか、Javaモジュール 6個程度ですし、モジュール群?は、モジュール群?が存在しないと稼動できないようなので、いづれの機能テストも「結合テストA」の範囲と思われます。検索システム と 情報データ登録システム というように、それぞれ独立した大きなサブシステムに分割が可能であるなら、「統合テストB」でテストすることになるでしょう。サブシステムとは、通常ある程度大きな単位のシステムです。

http://e-words.jp/w/E58D98E4BD93E38386E382B9E38388.html

◎質問者からの返答

>Java1,Java2,Java3 それぞれでのテストになります。

既にご回答下さった中で出ております「最小単位でのテスト」の観点から、

1機能ではなく、モジュール単位でテストできる場合は各モジュールが単体テストの対象となる、

という認識で合っていますでしょうか?


>・結合テスト:「モジュール群」としてのテストは結合テストになります。したがって、モジュール? の機能テストも、モジュール?の機能テストも、いづれも「結合テスト」です。

こちら分かったような気がします。

結合テストの見分け方としては、

1機能と1機能でというよりは、

モジュールとモジュールが2つ以上合わさってテストを行うものは、

結合テストになる、ということですよね?

(もっと厳密に言うと、他機能との関連が関係して動作する機能をテストの視点としておくものが、

結合テストである、ということで合っていますでしょうか?)


私にはシステムの切り分けの概念が無かったため、

今回のお話とても為になりました。

ありがとうございます。


4 ● garyo
●70ポイント ベストアンサー

他から切り離せる(外部仕様がある)モジュールに、他のモジュールがない状態で試験を行うものを「単体テスト」

単体でテストしたモジュールを複数組み合わせてテストするものを「結合テスト」といいます。

当然、見方によって、色々変わってきます。


例えばサーバークライアントシステムで

A社がクライアント側ソフト(モジュールA,B)、B社がサーバー側ソフト(モジュールC,D)を作る場合に、モジュールAはモジュールBがないと動作せず、モジュールCはモジュールDがないと動作しないとします。また、サーバー側ソフト、クライアント側ソフトも単体では動かないとします。

モジュールA,モジュールBをそれぞれ別な人が作っている(仕様がそれぞれ決まっているとする)とします。



モジュールAをデバッグするためには擬似的にモジュールBの代わりをするものが必要になります。

(モジュールBもモジュールAの代わりをするものが必要になります)

モジュールBの代わりをするものを仮につくり、モジュールAだけでデバッグすることを「単体テスト」といいます。


1)[モジュールA]-[擬似モジュールB]:モジュールAの単体テスト

2)[擬似モジュールA]-[モジュールB]:モジュールBの単体テスト


モジュールBとモジュールAがそれぞれ単体テストが終わった後、両方を同時に動かしてみることを「結合テスト」といいます。

3)[モジュールA]-[モジュールB]:モジュールA,Bの結合テスト


ここでA社がクライアントソフトを動かす時に、サーバー側ソフトが出来ていなければ、擬似のサーバーソフトが必要になります。

これはクライアントソフトの単体テストになります。


4)[[モジュールA]-[モジュールB]]-[擬似サーバー]:クライアントソフトの単体テスト

同じようにサーバー側も擬似のクライントソフトが必要になります。

5)[擬似クライアント]-[[モジュールC]-[モジュールD]]:サーバー側の単体テスト


サーバー・クライアントの双方のデバッグが終わると結合テストになります。

6)[クライアント]-[サーバー]:サーバーとクライアントの結合テスト


ここで3)と4)はほとんど同じような試験ですが、それぞれ視点により単体テストとも結合テストとも呼べます。


プログラムは小さなモジュールが組み合わさって大きな機能モジュールになり、それがまた組み合わさってさらに大きなモジュールになり・・・という入れ子構造になっているため、下からみると結合テストだが、上からみると単体テストになるというのを繰り返しているわけです。


http://e-words.jp/w/E58D98E4BD93E38386E382B9E38388.html


そのため、どこまでが単体テストでどこからが結合テストかというのは複雑なシステムほどわかりにくくなるわけです。

◎質問者からの返答

具体的なご回答ありがとうございます。

「単体テスト」「結合テスト」境目が掴めた気がします。


擬似モジュール、擬似サーバーとありますが、

因みにこちら、必ずしも擬似モジュールではなくてはならない、

というものではなく、場合によっては本モジュールを使用する場合もあるという認識で良いでしょうか?

(擬似を、本として使う場合が現場で実際にありましたので。

もしかしたら、現場でそう知らされていないため、そう思い込んでいただけかもしれないのですが…汗)


>そのため、どこまでが単体テストでどこからが結合テストかというのは複雑なシステムほどわかりにくくなるわけです。

現場で定義が曖昧だった理由(説明を大体で覚えておいてくれ)と言われる理由が少し分かった気がします。

私の知識不足、理解不足な点もあり、余計に分かり辛くなっていたのかもしれません(汗)


サーバー側の単体テストについては行った事も無く、

別の視点として知ることができました。ありがとうございます。


5 ● pahoo
●60ポイント

#2で回答した者です。コメントが付けられないので、回答欄でレスします。

単体テストですと、

性別 "男性""女性" という変数が対象だった場合、

"男性"と"女性"の両方で試して、正常処理が行われるか(エラーが発生しないか)を確認する。

これをホワイトボックステストと呼ぶ、いう認識で良いでしょうか?

仕様上、「男性」「女性」の2値しかとらないなら、それで結構です。


結合テストですと、

性別 "男性""女性" という変数が対象だった場合、

"男性"が"女性"どちらかだけ試して、正常処理が行われるか(エラーが発生しないか)を確認する。

違います。「男性」「女性」以外の値も投入し、プログラムが仕様通りに動作することを確認します。


つまり、ホワイトボックステストは仕様書通りに動くことを確認するだけで済みますが、ブラックボックステストはあらゆるケース(悪意を持った攻撃を含めて)を想定して実施しなければなりません。当然、ブラックボックステストには莫大な工数がかかります。

よって、結合テストの工数を押さえ込む意味でも(もちろん、プログラムの安全性を担保するためにも)、設計時に、publicやI/Fメソッドなど結合テストの対象になる機能は限定すべきです。

◎質問者からの返答

再度のご回答ありがとうございます。

>仕様上、「男性」「女性」の2値しかとらないなら、それで結構です。

>違います。「男性」「女性」以外の値も投入し、プログラムが仕様通りに動作することを確認します。

ありがとうございます。


ホワイトボックスとブラックボックスの検証視点としては


ホワイトボックス:想定した範囲内の値で検証(主に単体テストの検証)

ブラックボックス:想定内と想定外の範囲外の値を含めての検証(主に結合テストの検証)


という認識で合っていますでしょうか?


また質問が多くて申し訳ないのですが、

もしご回答頂けましたらお願いしたいと思います。


「単体テスト」後の「結合テスト」を行う理由について

--------------------------------------------

・結合テストでは「異常値」を入れてテストする事でより深いテストを行う

・結合テストでモジュールの結合によって思わぬ不具合が発生しないかの確認をする

という認識で合っていますでしょうか?



「I/Fメソッド」について

----------------------

こちらはどのようなメソッドなのでしょうか?


1-5件表示/7件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ