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