何であるユニットは本当に、テスト?そして、ここで実際にそのような大きな二分法がありますか?
私たちは、文字通りバッファの終わりを少し過ぎて読むとプログラムを完全にクラッシュさせたり、完全に不正確な結果を生じさせたり、最近の「HeartBleed」TLSバグによって証明されるように、おそらく安全なシステム全体を置く分野で働いています欠陥の直接的な証拠を作成せずに開きます。
これらのシステムからすべての複雑さを排除することは不可能です。しかし、私たちの仕事は、可能な限り、その複雑さを最小限に抑え、管理することです。
ユニットテストは、たとえば、予約が3つの異なるシステムに正常にポストされ、ログエントリが作成され、電子メールの確認が送信されることを確認するテストですか?
私はノーと言うつもりです。それは統合テストです。そして、それらは最も確実に自分の場所を持っていますが、彼らはまた別のトピックです。
統合テストは、「機能」全体の全体的な機能を確認するために機能します。しかし、その機能の背後にあるコードは、シンプルでテスト可能なビルディングブロック、つまり「ユニット」に分割する必要があります。
そのため、単体テストのスコープは非常に限られている必要があります。
これは、単体テストでテストされるコードのスコープが非常に限られていることを意味します。
さらに、優れたデザインの柱の1つは、複雑な問題を(可能な範囲で)小さく、単一の目的に分割し、互いに分離してテストできることを意味します。
最終的には信頼できる基礎コンポーネントで構成されたシステムが完成します。正確なことを伝えるために、シンプルで小さな限定的なスコープテストを記述したため、これらの基礎的なコードのいずれかが壊れるかどうかがわかります。
多くの場合、おそらくユニットごとに複数のテストが必要です。テスト自体は単純で、可能な範囲で唯一の動作をテストする必要があります。
自明ではない、精巧で複雑なロジックをテストする「ユニットテスト」の概念は、ちょっと矛盾したものだと思います。
そのような意図的な設計の内訳が行われた場合、テストされたコードユニットの基本機能が変更されない限り、ユニットテストは突然どのように誤検知を開始しますか?そして、それが起こった場合、プレイ中にいくつかの非自明な波及効果があると信じる方が良いでしょう。誤検知を引き起こしていると思われる壊れたテストは、実際に何らかの変更がコードベースの依存関係のより広い範囲を壊したことを警告しており、それを調べて修正する必要があります。
これらのユニットのいくつか(それらの多く)は、モックオブジェクトを使用してテストする必要があるかもしれませんが、それは、より複雑なテストや複雑なテストを記述する必要があるという意味ではありません。
予約システムの不自然な例に戻ると、コードを単体テストするたびにライブ予約データベースまたはサードパーティサービス(またはその「開発」インスタンス)にリクエストを送信することはできません。
したがって、同じインターフェイスコントラクトを提示するモックを使用します。その後、テストは、比較的小さな決定論的なコードチャンクの動作を検証できます。ボード全体に緑色が表示されると、基礎を構成するブロックが破損していないことがわかります。
ただし、個々の単体テストのロジック自体は可能な限りシンプルなままです。