単体テストと機能テスト


回答:


254

ユニットテスト-すべての依存関係をモックアップして、クラス内のメソッド(関数)などの個々のユニットをテストします。

機能テスト-別名統合テスト。システムの機能の一部をテストします。これは多くのメソッドをテストし、データベースやWebサービスなどの依存関係と相互作用する可能性があります。


170
「AKA統合テスト」に同意しません。統合テストでは、コード内の2つ以上のシステム/サブシステム間の統合をチェックします。たとえば、ORMを介してSQLクエリをチェックすると、ORMとデータベースが連携して機能するかどうかがチェックされます。機能テストAKA End to End IMHO。
グラフィク2014年

7
@graffic機能テストに同意します!=統合テスト永続化状態など、システムのサブコンポーネントの相互の「統合」を混乱させる必要があります。しかし、一般的に、統合テストの範囲ははるかに広いです。
nabster

4
いいえ、何も混乱していませんでした。
bpapa

3
統合テストIS-A機能テスト。しかし、その逆ではありません。Googleが「機能テストと非機能テスト」を行い、「画像」を確認します。
Andrejs

4
この答えは間違っています!機能テストは...でも近い統合テストにはありません
sotn

517

ユニットテストは、コードが正しく機能していることを開発者に知らせます。機能テストは、コードが正しいことをしていることを開発者に知らせます。

詳細については、単体テストと機能テストを比較してください。


ユニットテストと機能テストのよく説明された実例は、次のように説明できます。

多くの場合、システムの開発は家の建設に例えられます。このアナロジーは正確ではありませんが、単体テストと機能テストの違いを理解するために拡張できます。

ユニットテストは、家の建設現場を訪れる建物の検査官に似ています。彼は家のさまざまな内部システム、基礎、フレーミング、電気、配管などに焦点を当てています。彼は家の部分が正しく安全に機能すること、つまり建築基準法を満たしていることを確認(テスト)します。

このシナリオの機能テストは、この同じ建設現場を訪れる住宅所有者に似ています。彼は、内部システムが適切に動作し、建物の検査官が自分の仕事を実行していると想定しています。住宅所有者は、この家に住むことがどのようなものになるかに焦点を当てています。彼は家がどのように見えるか、さまざまな部屋が快適なサイズであるか、家が家族のニーズに合っているか、朝日を浴びるのに適した窓があるかどうかを心配しています。

住宅所有者は家の機能テストを行っています。彼はユーザーの視点を持っています。

建物の検査官が家のユニットテストを実行しています。彼はビルダーの視点を持っています。


まとめとして、

ユニットテストは、プログラマーの観点から書かれてます。これらは、クラスの特定のメソッド(またはユニット)が一連の特定のタスクを確実に実行するように作成されています。

機能テストはユーザーの観点から書かれています。ユーザーが期待するとおりにシステムが機能していることを確認します。


18
コンセプトに不慣れな人にとって、引用は少しあいまいです。

2
@ fig-gnuton、私はうまくいけばあいまいな説明を作らないように詳しく説明しようとしました。リンクの中では、それらが良い例を提供しています。もしそれがOPに役立つかもしれないと思うなら、私は引用で答えを更新できます。
Anthony Forloney 2010

148
おそらく別の言い方をすれば、「ユニットテストはプログラマが望むことをコードが実行することを確認し、機能テストはプログラマが顧客が望むことを実行していることを確認する」でしょうか?
JS。

3
私はそれが好きですが、それに合わせます。機能テストは、アプリケーションは、ユーザーがアクションを実行することができますを確認します。A ユニットテストは、必ずどのようにコードの振る舞いプログラマを期待します。
Adam

2
プログラマーが望んでいることは、エンドユーザーが望んでいるものに忠実ではありませんか?なぜ顧客の期待に応えないテストを書くのですか?
O.Badr 2018

140
  • 単体テストは、独立した動作単位をテストします。行動の単位とは何ですか?これは、個別に単体テストできるシステムの最小の部分です。(この定義は実際には循環的で、IOWはまったく定義はありませんが、直感的に理解できるため、実際には非常にうまく機能しているようです。)

  • 機能テストは、独立した機能をテストします。


  • 動作の単位は非常に小さいです。私はこの愚かな「メソッドごとに1つのユニットテスト」のマントラを絶対に嫌っていますが、サイズの観点からはそれはほぼ正しいです。動作の単位は、メソッドの一部と、おそらくいくつかのメソッドの間の何かです。最大で1つのオブジェクトですが、1つ以下です。

  • 機能の一部は通常、多くのメソッドと複数のオブジェクトにわたるカットで構成され、多くの場合、複数のアーキテクチャーレイヤーを通過します。


  • ユニットテストは次のようなものです。validate_country_code()関数を呼び出して国コードを渡すと、'ZZ'返されるはずfalseです。

  • 機能テストは次のとおりです。国コードを配送フォームに記入ZZすると、メニューから国コードを選択できるヘルプページにリダイレクトされます。


  • 単体テストは、開発者の観点から、開発者向けに開発者によって書かれています。

  • 機能テストはユーザー向けの場合があります。その場合、ユーザーの観点から、ユーザー向けに開発者とユーザー(または適切なツールと適切なユーザー)がユーザー向けに作成します。あるいは、開発者向けの場合もあります(たとえば、ユーザーが気にしないいくつかの内部機能について説明する場合)。この場合、開発者向けに開発者が作成しますが、それでもユーザーの観点からです。


  • 前者の場合、機能テストは受け入れテストとして機能することも、機能要件または機能仕様の実行可能なエンコードとして機能することもできます。後者の場合、統合テストとして機能することもあります。

  • ユニットテストは頻繁に変更され、機能テストはメジャーリリース内で変更されるべきではありません。



すばらしい答え!一つのこと-「メジャーリリース内で機能テストを変更してはならない」なぜですか?
Lazer、

5
@ Lazer、@ cdeszaq:多くのプロジェクトでは、メジャーバージョン番号の変更は下位互換性がないことを示すために使用され、OTOHはメジャーバージョンが変更されない場合、下位互換性が保証されています。「後方互換性」とはどういう意味ですか?これは、「ユーザーに表示される動作を変更しない」ことを意味します。そして、機能テストは、ユーザーに見える動作の仕様の実行可能なエンコーディングです。したがって、メジャー番号が変更されない場合、機能テストも変更できません。逆に、機能テット変更された場合、メジャー番号も変更する必要があります。
イェルクWミッターク

2
注:機能テストの追加については何も言いませんでした!以前になかった機能を追加することが下位互換性のない変更となるかどうかは、プロジェクトによって異なります。エンドユーザーソフトウェアの場合は、おそらくそうではありません。しかし、プログラミング言語については?多分:たとえば、新しいキーワードを導入すると、たまたまそのキーワードを変数名として使用している現在機能しているプログラムが無効になり、下位互換性のない変更になります。
イェルクWミッターク

3
@JörgWMittagはそのアイデアが大好きです:「機能テストはユーザーに表示される動作の仕様の実行可能なエンコーディングです...」他のスーパーエキスパートが実際に同意するかどうかに関係なく、元の質問で、「 「em」
マイクげっ歯類

1
「機能テストは次のとおりです。国コードZZを配送フォームに記入すると、メニューから国コードを選択できるヘルプページにリダイレクトされます。」これはちょっとしたことですが、私はそれを「受け入れテスト」と呼んでいます。機能テストでは、配送フォームにZZを入力すると、ユーザーが正しいURLに転送されたか、特定の例外またはエラーがスローされたかがテストされます。
ボブ・レイ

98

TLDR:

質問に答えるには、ユニットテスト機能テストのサブタイプです。


:二つの大きなグループがある機能非機能テスト。私が見つけた最高の(網羅的ではない)イラストはこれです(ソース:www.inflectra.com):

ここに画像の説明を入力してください

(1)ユニットテスト:コードの小さなスニペット(関数/メソッド)のテスト。これは(ホワイトボックス)機能テストと見なすことができます。

関数をまとめると、モジュール=スタンドアロンピースが作成されます。テスト可能なユーザーインターフェイスを使用することもできます(モジュールテスト)。少なくとも2つの個別のモジュールが用意できたら、それらを接着して、次のようになります。

(2)統合テスト: 2つ以上の(サブ)モジュールまたは(サブ)システムを組み合わせて、それらがうまく機能するかどうかを確認します。

次に、3番目のモジュールを統合し、4番目と5番目のモジュールを、自分またはチームが適切と考える任意の順序で統合します。すべてのジグソーピースを一緒に配置すると、

(3)システムテスト:ソフトウェア全体をテストします。これはほぼ「すべての要素を統合した統合テスト」です。

それでいいのなら

(4)受け入れテスト:お客様が実際に要求したものを作成しましたか?もちろん、受け入れテストは、顧客がスポーツカーを望んでいて、バンを製造したという最終段階だけでなく、ライフサイクル全体を通じて行う必要があります。

ここに画像の説明を入力してください


2
グーグルで「単体テスト」を「機能テスト」のようなものとして描いた写真をたくさん見ました。しかし、ここで他の回答がまったく異なる概念を説明しているのはなぜですか。「機能テスト」はむしろエンドツーエンドのテストであり、単体テスト機能テストではないのですか?私は混乱しました。「機能テスト」という用語を異なるように定義する2つの異なる「宗教」がありますか、それとも何ですか?
Ruslan Stelmachenko 2017

回答(非常に賛成の回答であっても)も間違っている可能性があります;)
Andrejs

1
私は絵が好きですが、システム統合テストの場合、パズルは「完成」しているように見え、他のピースを接続する場所はこれ以上ありません。
Jonathon Reinhart

4
@JonathonReinhart-必ずしもそうではありません。オープンエッジは、新しい機能を備えたシステムの容易な拡張性を表すことができます。これは、アジャイルのような開発アプローチを使用する場合に特に役立ちます。
Myles

上記の複数の矛盾する回答から、明らかにFunctional Test標準化された用語ではなく、人々によって意味が異なります。
Penghe Geng

12

「機能テスト」は、コード内の関数(メソッド)をテストしているという意味ではありません。これは、一般に、システムの機能をテストしていることを意味します。foo file.txtコマンドラインで実行するfile.txtと、おそらく行が逆になります。対照的に、単一の単体テストは通常​​、単一のメソッドの単一のケースをカバーしますlength("hello")。5 length("hi")を返し、2を返す必要があります。

単体テストと機能テストの境界にあるIBMの見解も参照してください。


まあ、興味深いですが、表示するリンクは別の意味を持っています。機能とは、実装を通じて実行する機能に関するものです。つまり、ユーザーの観点からのテスト、つまりユーザーのための機能です。
Stefano Scarpanti、

8

ただし、基本的な違いは、機能テストではユーザーの視点から、アプリケーションを外部からテストすることです。ユニットテストは、プログラマーの観点から、アプリケーションを内側からテストします。機能テストは、適切な機能を備えたアプリケーションを構築するのに役立ち、誤ってそれを壊すことがないことを保証します。単体テストは、クリーンでバグのないコードを書くのに役立ちます。

Harry Percivalによる「Python TDD」の本から引用


8

ISTQBによると、これら2つは比較できません。機能テストは統合テストではありません。

単体テストはテストレベルの1つであり、機能テストはテストの一種です。

基本的に:

システム(またはコンポーネント)の機能は、「機能」です。これは通常、要件仕様、機能仕様、または使用例で説明されています。

ながら

単体テスト、モジュールテスト、プログラムテストとも呼ばれるコンポーネントテストでは、個別にテスト可能なソフトウェア(モジュール、プログラム、オブジェクト、クラスなど)の欠陥を検索し、機能を検証します。

ISTQBによると、コンポーネント/ユニットテストは機能する場合と機能しない場合があります。

コンポーネントテストには、機能テスト、およびリソース動作(メモリリークなど)、パフォーマンスまたは堅牢性テスト、構造テスト(決定カバレッジなど)などの特定の非機能特性のテストが含まれる場合があります。

ソフトウェアテストの基礎からの引用-ISTQB認定


私は綿毛が多すぎることに同意しますが、とにかく彼らはそこで最大のプレーヤーであり、この質問は理論に関するものでしたので、ISTQBで十分だと思います。
ドミニク2016年

6

Railsでは、ユニットフォルダーはモデルのテストを保持するためのものであり、機能フォルダーはコントローラーのテストを保持するためのものであり、統合フォルダーは相互作用する任意の数のコントローラーが関与するテストを保持するためのものです。フィクスチャは、テストデータを整理する方法です。これらはフィクスチャフォルダにあります。test_helper.rbファイルは、テストのデフォルト構成を保持します。あなたはこれを訪問することができます。


3

私の考えは次のとおりです。ユニットテストは、コードがコードに意図したとおりに機能することを確立します(たとえば、パラメーターaとbを追加したかったのですが、実際にはそれらを追加し、それらを減算しません)。機能テストでは、すべてのコードが連携して正しい結果が得られるかどうかをテストします。そのため、実際にコードで意図したことは、システムで正しい結果を得ることができます。


3

AFAIK、単体テストは機能テストではありません。小さな例で説明しましょう。ユーザーと同じように、メールWebアプリのログイン機能が機能しているかどうかをテストします。そのため、機能テストは次のようになります。

1- existing email, wrong password -> login page should show error "wrong password"!
2- non-existing email, any password -> login page should show error "no such email".
3- existing email, right password -> user should be taken to his inbox page.
4- no @symbol in email, right password -> login page should say "errors in form, please fix them!" 

機能テストでは、無効な入力でログインできるかどうかを確認する必要がありますか?例えば。メールに@記号がなく、ユーザー名に複数のドット(1つのドットのみが許可されています)、@の前に.comが表示されます。一般的にはありません!この種のテストは、単体テストに入ります。

以下のテストに示すように、ユニットテスト内で無効な入力が拒否されているかどうかを確認できます。

class LoginInputsValidator
  method validate_inputs_values(email, password)
    1-If email is not like string.string@myapp.com, then throw error.
    2-If email contains abusive words, then throw error.
    3-If password is less than 10 chars, throw error.

機能テスト4は、実際には単体テスト1が行っていることを行っていることに注意してください。機能テストは、さまざまな理由で、単体テストで行われたテストの一部(すべてではない)を繰り返すことがあります。この例では、機能テスト4を使用して、無効な入力を入力したときに特定のエラーメッセージが表示されるかどうかを確認します。すべての不正な入力が拒否されるかどうかをテストしたくありません。それが単体テストの仕事です。


1
機能テストの範囲は、単体テストよりも範囲がはるかに狭いことがよくありますが(機能テストは、期待される機能が本質的に達成されることを証明することに重点が置かれている点で)、さまざまな側面(単体テストの構成)について説明していると思います対目的機能テスト中)。一部の単体テストは機能テストであり、一部の機能テストは単体テストですが、重複しないVennもたくさんあります。
Myles

機能テストの対象範囲と対象範囲外の良い例。
Myles

2

ユニットテスト

単体テストには、通常は関数またはメソッドであるコードの最小単位のテストが含まれます。ユニットテストは、関数のコアを理解しているため、ほとんどの場合ユニット/メソッド/関数の開発者によって行われます。開発者の主な目標は、ユニットテストでコードをカバーすることです。

単体テストでは一部の機能をテストできないという制限があります。すべての単体テストが正常に完了した後でも、製品の正常な動作を保証するものではありません。ユニットテストは1回の使用のみで記述されていますが、同じ機能をシステムのいくつかの部分で使用できます。

機能テスト

これはブラックボックステストの一種であり、コードを調べなくても製品の機能面でテストが行​​われます。機能テストは、ほとんどが専用のソフトウェアテスターに​​よって行われます。これには、製品の特定の機能をテストするための標準化されていないデータを使用するポジティブ、ネガティブ、およびBVAテクニックが含まれます。テストカバレッジは、単体テストよりも機能テストによって改善された方法で実施されます。テストにはアプリケーションGUIを使用するため、インターフェイスの特定の部分が正確に何を担当しているかを判断するのは、コードが担当する機能を判断するよりも簡単です。



1

単体テスト:-ユニットテストは、特に製品の開発中に、コンポーネントごとに製品コンポーネントをテストするために使用されます。JunitおよびNunitタイプのツールも、Unitごとに製品をテストするのに役立ちます。**統合後の問題を解決するのではなく、開発の早い段階で解決することが常に快適です。

機能テスト:-テストに関しては、1.Functional Test、2.Non-Functional Testの2つの主要なタイプのテストがあります。

非機能テストとは、テスターが、製品が顧客が言及していない品質属性をすべて実行することをテストするテストですが、これらの品質属性はそこにあるはずです。のように:-パフォーマンス、使いやすさ、セキュリティ、負荷、ストレスなどですが、機能テストでは:-顧客はすでに彼の要件を提示しており、それらは適切に文書化されています提案されたシステムかどうか。その目的のために、テスターは提案されたシステムで実装された機能をテストする必要があります。


0

単体テストは通常、開発者によって行われます。同じことを行う目的は、コードが正しく機能することを確認することです。一般的な経験則は、ユニットテストを使用してコード内のすべてのパスをカバーすることです。

機能テスト:これは良いリファレンスです。機能テストの説明


6
最も重要なテキストを回答に貼り付けてください。ページがいつ削除されてリンクが無効になるかはわかりません。
Andrejs
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.