単体テストと機能テストの違いは何ですか? 単体テストで関数もテストできますか?
15 に答える
単体テストは、コードが正しく動作していることを開発者に伝えます。機能テストは、コードが正しいことを行っていることを開発者に伝えます。
詳細については、ユニット テストと機能テストの比較を参照してください。
単体テストと機能テストの実際のアナロジーをよく説明すると、次のように説明できます。
多くの場合、システムの開発は家を建てることに例えられます。この類推は正確ではありませんが、単体テストと機能テストの違いを理解するために拡張することができます。
単体テストは、建築検査官が家の建設現場を訪れることに似ています。彼は、家のさまざまな内部システム、基礎、フレーム、電気、配管などに焦点を当てています。彼は、家の部品が正しく安全に機能すること、つまり建築基準を満たしていることを確認 (テスト) します。
このシナリオでの機能テストは、この同じ建設現場を訪問する住宅所有者に似ています。彼は、内部システムが適切に動作し、建物の検査官が自分のタスクを実行していると想定しています。住宅所有者は、この家に住むのがどのようなものになるかに焦点を当てています。彼は家がどのように見えるか、さまざまな部屋が快適なサイズであるか、家が家族のニーズに合っているか、窓が朝日を捉えるのに適した場所にあるかに関心があります。
住宅所有者は住宅の機能テストを行っています。彼はユーザーの視点を持っています。
建物検査官は、家の単体テストを実行しています。彼はビルダーの視点を持っています。
要約すると、
単体テストは、プログラマーの観点から書かれています。これらは、クラスの特定のメソッド (またはunit ) が一連の特定のタスクを実行することを保証するために作られています。
機能テストは、ユーザーの観点から書かれています。システムがユーザーの期待どおりに機能していることを確認します。
ユニット テスト - クラス内のメソッド (関数) などの個々のユニットを、すべての依存関係をモックアップしてテストします。
機能テスト - 別名統合テスト、システム内の機能の一部をテストします。これにより、多くのメソッドがテストされ、データベースや Web サービスなどの依存関係と相互作用する可能性があります。
単体テストは、独立した動作単位をテストします。行動の単位とは何ですか?これは、個別に単体テストできるシステムの最小部分です。(この定義は実際には循環的であり、実際にはまったく定義ではありませんが、直感的に理解できるため、実際には非常にうまく機能しているようです。)
機能テストは、機能の独立した部分をテストします。
動作の単位は非常に小さいです。私はこのばかげた「メソッドごとに 1 つのユニット テスト」というマントラは絶対に嫌いですが、サイズの観点からはほぼ正しいと言えます。動作の単位は、メソッドの一部といくつかのメソッドの間の何かです。多くても 1 つのオブジェクトですが、複数であることはありません。
機能の一部は通常、多くのメソッドで構成され、複数のオブジェクトにまたがり、多くの場合、複数のアーキテクチャ レイヤーにまたがります。
単体テストは次のようになります。
validate_country_code()
関数を呼び出して国コードを渡すと、'ZZ'
返されるはずfalse
です。機能テストは次のとおりです。配送フォームに国コードを入力
ZZ
すると、ヘルプ ページにリダイレクトされ、メニューから国コードを選択できるようになります。
単体テストは、開発者の観点から、開発者が開発者のために作成します。
機能テストはユーザー向けである場合があり、その場合、ユーザーの観点から、開発者がユーザーと一緒に (またはユーザー自身によっても適切なツールと適切なユーザーを使用して) 記述されます。または、開発者向けである可能性があります (たとえば、ユーザーが気にしない内部機能を説明する場合)。この場合、開発者によって開発者向けに作成されますが、それでもユーザーの視点から書かれています。
前者の場合、機能テストは受け入れテストとしても機能し、機能要件または機能仕様の実行可能なコード化としても機能し、後者の場合、それらは統合テストとしても機能します。
単体テストは頻繁に変更されますが、機能テストはメジャー リリース内で決して変更されるべきではありません。
TLDR:
質問に答えるには: 単体テストは機能テストのサブタイプです。
機能テストと非機能テストの2 つの大きなグループがあります。私が見つけた最高の (網羅的ではない) イラストはこれです (出典: www.inflectra.com ):
(1) 単体テスト:コードの小さなスニペット (関数/メソッド) のテスト。これは、(ホワイトボックス) 機能テストと見なすことができます。
機能がまとめられたら、モジュール = スタンドアロンの部品を作成します。おそらく、テスト可能なユーザー インターフェイスを備えています (モジュール テスト)。少なくとも 2 つの個別のモジュールができたら、それらを接着すると次のようになります。
(2) 統合テスト: 2 つ以上の (サブ) モジュールまたは (サブ) システムを組み合わせて、それらがうまく連携するかどうかを確認する場合。
次に、3 番目のモジュールを統合し、次に 4 番目と 5 番目のモジュールを、あなたまたはチームが適切と考える順序で統合します。
(3) システムテスト: SW全体をテストします。これはほとんど「すべてのピースをまとめた統合テスト」です。
それがOKなら、それから来ます
(4) 受け入れテスト:顧客が実際に要求したものを構築したか? もちろん、受け入れテストは、顧客がスポーツカーを欲しがっていてバンを作ったことに気付く最終段階だけでなく、ライフサイクル全体で実施する必要があります。
「機能テスト」とは、コード内の関数 (メソッド) をテストしていることを意味するものではありません。一般に、システムの機能をテストしていることを意味しますfoo file.txt
。コマンド ラインで実行するfile.txt
と、おそらく行が逆になります。対照的に、単一の単体テストは通常、単一のメソッドの単一のケースをカバーし、length("hello")
5 を返し、 length("hi")
2 を返す必要があります。
単体テストと機能テストの境界線に関する IBM の見解も参照してください。
ISTQBによると、これら2つは比較できません。機能テストは統合テストではありません。
単体テストはテスト レベルの 1 つであり、機能テストはテストの一種です。
基本的:
システム (またはコンポーネント) の機能は、「何をするか」です。これは通常、要件仕様、機能仕様、またはユース ケースで説明されます。
その間
単体テスト、モジュール テスト、プログラム テストとも呼ばれるコンポーネント テストでは、個別にテスト可能なソフトウェア (モジュール、プログラム、オブジェクト、クラスなど) の欠陥を検索し、その機能を検証します。
ISTQB によると、コンポーネント/ユニット テストは機能する場合と機能しない場合があります。
コンポーネント テストには、リソースの動作 (メモリ リークなど)、パフォーマンスまたは堅牢性テスト、構造テスト (意思決定範囲など) などの機能および特定の非機能特性のテストが含まれる場合があります。
Foundations of Software Testing からの引用- ISTQB 認定
Rails では、ユニット フォルダーはモデルのテストを保持するためのものであり、機能フォルダーはコントローラーのテストを保持するためのものであり、統合フォルダーは相互作用する任意の数のコントローラーを含むテストを保持するためのものです。フィクスチャは、テスト データを整理する方法です。それらはフィクスチャ フォルダにあります。test_helper.rb ファイルには、テストのデフォルト構成が保持されています。あなたはこれを訪問することができます。
私が考える方法は次のとおりです。単体テストは、コードが意図したとおりに動作することを確認します (たとえば、パラメーター a と b を追加したい場合、実際にはそれらを追加し、それらを減算しないでください)。機能テストでは、すべてのコードが連携して正しい結果が得られることをテストします。これにより、コードで意図したことが実際にシステムで正しい結果を得ることができます。
単体テスト
単体テストには、通常は関数またはメソッドであるコードの最小単位のテストが含まれます。単体テストは、関数のコアを理解しているため、ほとんどの場合、ユニット/メソッド/関数の開発者によって行われます。開発者の主な目標は、単体テストによってコードをカバーすることです。
一部の機能は単体テストでテストできないという制限があります。すべての単体テストが正常に完了した後でも。製品の正常な動作を保証するものではありません。単体テストは 1 回の使用のみを目的として作成されていますが、システムのいくつかの部分で同じ関数を使用できます。
機能テスト
これは、コードを調べずに製品の機能面についてテストを行うブラック ボックス テストの一種です。機能テストは主に専用のソフトウェア テスターによって行われます。これには、製品の指定された機能をテストするための標準化されていないデータを使用したポジティブ、ネガティブ、および BVA 手法が含まれます。テスト カバレッジは、単体テストよりも機能テストによって改善された方法で実施されます。テストにはアプリケーション GUI を使用するため、コードがどの機能を担当しているかを判断するよりも、インターフェイスの特定の部分が正確に何を担当しているかを判断する方が簡単です。
単体テスト:- 単体テストは、特に製品の開発中にコンポーネントごとに製品コンポーネントをテストするために使用されます。Junit および Nunit タイプのツールは、Unit に従って製品をテストするのにも役立ちます。**統合後に問題を解決するよりも、開発の早い段階で問題を解決する方が常に快適です。
機能テスト:- テストに関しては、1.機能テスト 2.非機能テストの 2 つの主なタイプのテストがあります。
非機能テストは、顧客が言及していないが、それらの品質属性が存在する必要があるすべての品質属性を製品が実行することをテスターがテストするテストです。同様に:-パフォーマンス、ユーザビリティ、セキュリティ、負荷、ストレスなどですが、機能テストでは:- 顧客はすでに要件を提示しており、それらは適切に文書化されています。提案されたシステムにかどうか。その目的のために、テスターは提案されたシステムで実装された機能をテストする必要があります。
単体テストは通常、開発者によって行われます。同じことを行う目的は、コードが適切に機能することを確認することです。一般的な経験則は、単体テストを使用してコード内のすべてのパスをカバーすることです。
Functional Testing : これは良いリファレンスです。機能テストの説明