web-dev-qa-db-ja.com

単体テストと機能テスト

単体テストと機能テストの違いは何ですか?単体テストでも機能をテストできますか?

358
mousey

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

機能テスト - AKA統合テスト。システム内の一連の機能をテストします。これは多くのメソッドをテストし、データベースやWebサービスのような依存関係と相互作用するかもしれません。

222
bpapa

ユニットテストは開発者にコードが正しく動作していることを伝えます。機能テストは、コードが正しいことを行っていることを開発者に伝えます

もっと読むことができます 単体テスト対機能テスト


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

多くの場合、システムの開発は家の建設に例えられています。この類似性はまったく正しくありませんが、単体テストと機能テストの違いを理解する目的で拡張することができます。

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

このシナリオでの機能テストは、この同じ建設現場を訪れる住宅所有者に似ています。彼は、内部システムが適切に動作し、建物検査員が自分のタスクを実行していると想定しています。住宅所有者はそれがこの家に住むことがどのようになるかに焦点を合わせています。彼は家がどのように見えるか、様々な部屋が快適な広さであること、家が家族のニーズに合っていること、朝の太陽を捕らえるのに良い場所にある窓であることに関心がある。

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

建物の検査官が家の単体テストを行っています。彼は建築者の見解を持っています。


要約として、

単体テストはプログラマーの観点から書かれています。それらはクラスの特定のメソッド(またはnit)が一連の特定のタスクを実行することを保証するために作られています。

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

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

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


  • 動作の単位は非常に小さいです。サイズの観点からすると、この愚かな "1つのメソッドにつき1つの単体テスト"マントラは絶対に嫌いですが、それは正しいことです。動作の単位は、メソッドの一部とおそらく2つのメソッドの間のものです。せいぜいオブジェクトですが、複数のオブジェクトではありません。

  • 機能の一部は通常、多くのメソッドから構成されており、複数のオブジェクトにまたがって、多くの場合は複数のアーキテクチャー層を通過します。


  • 単体テストは次のようになります。validate_country_code()関数を呼び出して国コード'ZZ'を渡すと、falseが返されます。

  • 機能テストは次のようになります。出荷フォームにZZの国番号を入力すると、メニューから国番号を選択できるヘルプページにリダイレクトされます。


  • ユニットテストは、開発者の観点から、開発者のために開発者によって書かれています。

  • 機能テストはユーザーに面しているかもしれません、その場合それらは開発者によってユーザーと一緒に(あるいはおそらくユーザー自身でさえ正しいツールと正しいユーザーと一緒に)書かれます、ユーザーの観点から。あるいは、開発者が直面している可能性があります(たとえば、ユーザーが気にしない内部機能を記述している場合など)。その場合、開発者は開発者向けに作成されますが、それでもユーザーの観点から行われます。


  • 前者の場合、機能テストは受け入れテストとしても機能の要件または機能仕様の実行可能な符号化としても機能することができ、後者の場合、それらは統合テストとしても機能することができる。

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


134
Jörg W Mittag

TLDR:

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


2つの大きなグループがあります:機能的非機能的テスト。私が見つけた最良の(非網羅的な)イラストはこれです(出典: www.inflectra.com ):

enter image description here

(1)単体テスト:コードの小さな断片(関数/メソッド)のテスト。それは(ホワイトボックス)機能テストと見なされるかもしれません。

機能をまとめると、おそらくテスト可能なユーザインタフェースを持つモジュール(スタンドアロンテスト)を作成します(モジュールテスト)。あなたが少なくとも二つの別々のモジュールを持っていたら、そしてあなたはそれらを一緒に接着してそしてそれから来る:

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

それから3番目のモジュール、4番目と5番目のモジュールをあなたやあなたのチームが適当な順番で統合し、そしてすべてのジグソーパズルが一緒に配置されたら

(3)システムテスト:SW全体をテストします。これはほとんど「すべての部分の統合テスト」です。

それが大丈夫なら、それから来る

(4)受け入れテスト:顧客が実際に要求したものを構築しましたか? もちろん、受け入れテストは、顧客がスポーツカーを望んでいてバンを作ったことに気づいた最後の段階ではなく、ライフサイクル全体を通して行われるべきです。

enter image description here

83
Andrejs

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

IBMの単体テストと機能テストの間の境界線 も参照してください。

11
Mark Rushakoff

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

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

基本的に:

システム(またはコンポーネント)の機能は「それが行うこと」です。これは通常、要求仕様、機能仕様、またはユースケースで説明されています。

しながら

ユニットテスト、モジュールテストおよびプログラムテストとしても知られるコンポーネントテストは、別々にテスト可能なソフトウェア(例えば、モジュール、プログラム、オブジェクト、クラスなど)の欠陥を検索し、その機能を検証する。

ISTQBによると、コンポーネント/ユニットテストは機能的または機能的でないことができます。

構成要素試験は、機能試験およびリソース挙動(例えば、メモリリーク)、性能試験またはロバストネス試験、ならびに構造試験(例えば、決定範囲)のような特定の非機能特性を含むことができる。

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

7
Dominik

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

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

6
Humoyun

Railsでは、ユニットフォルダーはモデルのテストを保持するためのもので、機能フォルダーはコントローラーのためのテストを保持するためのものです。そして統合フォルダーは相互作用するコントローラーを含むテストを保持するためのものです。フィクスチャはテストデータを整理する方法です。それらはフィクスチャフォルダにあります。 test_helper.rbファイルには、テスト用のデフォルト設定が含まれています。 uは訪れることができます this

6

残念ながら、ユニットテストは機能テストではありません。小さな例で説明しましょう。ユーザーと同じように、Eメール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 [email protected], 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を使用して、無効な入力を入力したときに特定のエラーメッセージが表示されるを確認します。悪い入力がすべて拒否されたかどうかをテストしたくありません。それが単体テストの仕事です。

3
MasterJoe2

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

3
Yishai

ユニットテスト

単体テストには、通常は関数またはメソッドであるコードの最小単位のテストが含まれます。単体テストは主にunit/method/functionの開発者によって行われます。なぜならそれらは関数のコアを理解しているからです。開発者の主な目的は、ユニットテストでコードをカバーすることです。

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

機能テスト

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

2
Ashish Gupta

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

機能テスト: - テストに関しては、1.Functional Test 2.Non-Functional Testの2種類のテストがあります。

Non-Functional Testは、テスターがテストするテストです。製品は、顧客が言及していないすべての品質属性を実行しますが、それらの品質属性は存在する必要があります。以下のように: - 性能、ユーザビリティ、セキュリティ、負荷、ストレスなどが 機能テスト: - の中に既に存在しており、それらは適切に文書化されているアプリケーション機能が提案されたシステムに従って機能しているかどうか。その目的のために、テスターは提案されたシステムで実装された機能性をテストするべきです。

1
mohit sarsar

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

機能テスト:これは参考になります。 機能テストの説明

0
automationuser

非常に簡単に言うことができます:

  • ブラックボックス:機能テストのようなユーザーインターフェイステスト
  • ホワイトボックス:単体テストのようなコードテスト

続きを読む こちら