web-dev-qa-db-ja.com

コーディングを開始する前にテストケースを作成する必要があるとよく言われるのはなぜですか?

コーディングを開始する前にテストケースを作成する必要があるとよく言われるのはなぜですか?
このアドバイスに耳を傾けない場合、その長所と短所は何ですか?

さらに、そのアドバイスはブラックボックステストまたはホワイトボックステスト、あるいはその両方に関するものですか?

34
Aquarius_Girl

実装前にテストを書くことは、テスト駆動開発(TDD)の背後にある中心的なアイデアの1つです。手順は次のとおりです。

  • 失敗したテストを書く
  • 他のテストを中断せずに、コードを変更して合格する
  • コードをリファクタリングし、すべてのテストがまだ成功することを確認します

この手順は、機能を実装する場合でも、バグを修正する場合でも同じです。多くの場合、「Red-Green-Refactor」と呼ばれます(赤=テスト失敗、緑=テスト合格)。この方法の利点は数多くあります。

  • テストは「完了」を構成するものを明確に定義します
  • テストは、コードの使用方法を文書化します
  • 正しく実行すると、開発プロセスの副産物として100%カバレッジの完全なテストスイートを構築します。つまり、何をしても、常に信頼できる回帰テストを手にすることができます。
  • テストケースを満たすためのコーディング(他には何もない)は、1つのタスクに集中し続け、機能のクリープを防止するのに役立ちます
  • 赤、緑、リファクタリングのサイクルは、すてきでクリーンで追跡可能なコミット履歴を作成し、機能ブランチリポジトリのアプローチによく適合します(各機能ブランチは、失敗したテストを追加するコミットで始まり、「緑」に達するまで1つ以上のコミットを行います。 、次に1つ以上のリファクタリングコミット)。
  • 定期的に作業バージョンを作成します-理想的には、赤、緑、リファクターの各サイクルは出荷可能な製品で終了しますが、少なくとも、失敗することなく構築され、すべてのテストに合格する必要があります。

今、不利な点について:

  • すべてのコードが自動テストに適しているわけではありません。これは、自動テストを考慮せずに作成されたレガシーコードベースであるためです。それは、問題の領域が特定のものをあざけることができないようなものである可能性があります。または、制御できない外部データソースに依存していて、複雑すぎてモックできない場合があります。等.
  • 優先度リストでは、正確性、保守性、安定性が十分でない場合があります。これは悪いことのように聞こえますが、そうである必要はありません。大量のドキュメントをバッチ変換するための使い捨てのスクリプトを作成している場合、テストを作成するのはまったく愚かです。結果、それだけです。自動テストは、ここでは何の価値も追加しません。
  • コードを書く前にテストを書くということは、あなたがしたいことをすでに正確に知っているということです。ただし、多くの場合そうではなく、特定の問題領域の感触を得るためには、かなりの量の探索的プログラミングが必要です。そして、たいていの場合、そのような探索的コーディングの結果は、実際の製品になるように形を整えられます。自動テストはそのような製品にとっても同様に価値がありますが、何を作成するのかを理解する前にそれらを追加することはあまり意味がありません。この場合、探索フェーズの最後にプロトタイプを取得し、テストを追加して、これまでに持っているすべてをカバーし、そこからred-green-refactorに切り替えることをお勧めします。
  • 実装前のテストは、すべての人のお茶ではありません。最初に実装を書くことはより自然に感じられ、一部の人々はその方法でフローに入るのが簡単になります
39
tdammers

コーディングを開始する前にテストケースを作成する必要があるとよく言われるのはなぜですか?

これは テスト駆動開発 の基本原則ですが、一般的な「ベストプラクティス」ではありません。誰もがTDDを望んでいるわけではなく、TDDを行う必要があるわけではありません。

このアドバイスに耳を傾けない場合、その長所と短所は何ですか?

利点は、コードを記述する前にテストの観点からコードについて考えることを強いられることです。これには2つの主な利点があります。特別なケースや境界条件を忘れる可能性が低く、コードをテスト可能にする必要があります。したがって、モジュール式です。もう1つの重要な利点:コードが思ったとおりに機能していることがいつでもわかります。

不利な点は、低レベルの詳細について考えることを奨励し、重要な設計の問題を見落とす可能性があることです(ただし、コーディングを開始しただけでも同じことが起こります)。また、最も簡単にテストできる設計は必ずしも最良ではありません(ただし、アドホックコーディングから成長したものよりもはるかに優れています)。

もちろん、TDDがこれらすべての単体テストのコストを書くよりも時間を節約できるかどうかという問題があります。その支持者たちは確かにそう主張している。

さらに、そのアドバイスはブラックボックステストまたはホワイトボックステスト、あるいはその両方に関するものですか?

通常、TDDはホワイトボックステストである nit tests のみを扱います。 統合テスト は追加で実行する必要があります。

36

私が test first を書いているとき、それは私のコードが正しく機能していることを確認することではなく、実際には ブラックボックスホワイトボックス)の問題ではありません。 または 品質保証 に関連するもの、そしてここに理由があります...

長年にわたり、優れたテスターが必要であることを経営陣に説得するためのスキルを実践および磨いてきました 12 そして、これは私のコードが私がそれについて多くを考える必要なしに意図したように機能することを保証するのに十分です。

私が最初にテストを好む主な理由は、コードを設計して使いやすくする方法を理解するのに役立ちます。自分のモジュールが他のモジュールでどのように使用されるかを頭の中で想像するのは得意ではないので、それを過度に複雑にすることができます。

これは、自分でモジュールをコーディングする場合でも、他の誰かのためにモジュールをコーディングする場合でも、問題です。不便なインターフェイスを自分で使用するのと同様に、他のプログラマにその使用法を説明する必要があります。

http://i.stack.imgur.com/JwlL8.jpg

「テストファースト」のアプローチは、その苦痛から私を救います。この方法またはその方法で設計された場合に私のモジュールがどのように使用されるかを即座に確認するために想像力を必要とせず、より便利なものを簡単に選択できるようにします。

誰かのためにモジュールをコーディングするとき、それはまた、それを使用する方法を痛々しく説明する必要から私を救います。

ご覧のとおり、this testのコードは、そのモジュールの使用方法を示しています。実行すると、期待される結果もわかります。 this testに示されている以外の方法を使用するのは誤りです。さあ、離れて面白いことをさせてください。

7
gnat

[〜#〜] tdd [〜#〜] / [〜#〜] bdd [〜#〜] であり、design方法論、テスト方法論ではありません。

TDD/BDDの場合、アイデアは、APIを作成する前にAPIの使用を排除し、テストで進化させることです。

この観点から見ると、ポイントは、存在しないAPI呼び出しのテスト、または存在しないAPI動作のテストを記述して実装することです。

ブラックボックス/ホワイトボックスのテストと同様に、これもtestingではなく、design

5
Oded

コーディングを開始する前にテストケースを作成する必要があるとよく言われるのはなぜですか?

これが言われる理由はいくつかあります。

  • 契約としてテスト(ブラックボックス)に取り組む人もいます。これにより、テストを作成する人とコードを実装する人は、成功するための明確な基準のセットを持つ必要があります。これは、契約を満たすためのコードを書くことを意味し、必要な機能がいつ満たされるかを知ることができます。
  • TDD(テスト駆動開発)は、テストを通じてすべての開発を推進するプラクティスです。古典的には、これは単体テストで行われますが、最近では、製品やプロセスに適したレベルのテストが行​​われます。

このアドバイスに耳を傾けない場合、その長所と短所は何ですか?

長所

  • テストを作成する前に成功基準を理解する必要があるため、プロセスの早い段階であいまいさを排除します。
  • 一部の支持者は、疎結合とよりモジュール化された設計を強制するため、TDDをユニット化することには特に設計上の利点があると示唆しています。
  • コードが機能していることの信頼度(少なくともテストされる部分について)。

短所

  • 保守可能なテストを作成する方法を理解します。
  • 良いテストの書き方を理解する。
  • 非常に高価な優れたテストと低コストの優れたテストとの間でトレードオフを行うタイミングを理解します。
  • 維持するコードが増える

さらに、そのアドバイスはブラックボックステストまたはホワイトボックステスト、あるいはその両方に関するものですか?

場合によります。ほとんどの単体テストは、メソッドまたは関数の入力と出力を検査するという点で、よりブラックボックスになる傾向があります。ただし、実装に関する情報が必要になるため、モックまたはスタブがホワイトボックステストのようにする必要がある場合があります。開発者は通常、テストを記述しているため、TDDの目的にとっては問題になる可能性があります。

3
dietbuddha