テストドライバjavascript開発--4.テストドライバ開発プロセス(下)

5311 ワード

TDDは反復的な開発プロセスであり、彼は以下のステップを含む:1.テストの作成;2.テストを実行し、観察に失敗した.3.テストに合格することを確保する;4.再構築し、重複を減らす.
反復するたびに、テストは仕様です.開発が完了したら、テストに合格できます.その後、重複コードを削減し、設計を向上させる再構築作業を行い、テストを再実行し、合格を保証する必要があります.
TDDは予想される大きな設計を主張しませんが、TDDが始まる前に簡単な設計をする必要があります.私たちはどのように自分の最初のデザインを書きますか?テストを作成するのに十分な情報を得たとき、テストコードの作成自体が設計です.特定の場合の特定のコードの動作、システム間のコンポーネントがどのように応答するか、およびそれらの間でどのように結合するかを指定します.次に例を挙げて、みんながもっとよく勉強できるようにします.
TDDでの反復時間は短く,我々が置かれている段階を非常に明確にする必要がある.コードをいつ変更したり、いくつかの機能を削除したりしても、todoリストに記録して観察する必要があります.このリストは1枚の紙、あるいは手帳のようなもので、あなたの迅速な検索と記録を便利にすればいいです.これらの新しい修正点を処理する前に、まず今回の反復を終了する必要があります.今回の反復が終了したら、todoリストからタスクを取り出し、次の反復作業を開始します.
 

手順1:テストの作成


TDDが反復するたびに、まずしなければならないことは、ユニットテストを作成するための機能を選択することです.ユニットテストは短く、function上の機能点に焦点を当てる必要があります.比較的良いテストを書くルールは、できるだけ少ないテストコードを書くことでテストを失敗させることです.もちろん、テストは前のテストと繰り返すことはできません.1つのテストがシステムの2つ以上の側面に関連している場合は、このテストが大きすぎるか、重複したテストポイントが含まれているかを示します.
テストは私たちが実現した機能を説明する必要があります.私たちの機能コードは修正されていないので、テストコードを修正する必要はありません.
Stringを完了するとしますprototype.trim関数の開発は,文字列の前後のスペースを除去するために用いられる.この方法の良いテストでは、最初のステップは前のスペースが削除されたかどうかをテストすることです.
testCase("String trim test", {
  "test trim should remove leading white-space":
  function () {
    assert("should remove leading white-space", "a string" === " a string".trim());
  }
});

厳密には、文字列にtrimメソッドが含まれていると判断する必要があります.これは、追加したグローバル関数がサードパーティのコードと競合し、コードの前にtypeof""を追加する可能性があるためです.trim==「function」は、テストを実行する前に問題を発見するのに役立ちます.
ユニットテストに入力条件を提供し、実行後、出力条件が予想と一致するかどうかを判断します.入力条件は、関数のパラメータだけでなく、グローバル役割ドメイン、特定のオブジェクトの特殊な状態など、関数の依存項目も入力条件です.これと同様に、出力結果には、戻り値、グローバル役割ドメイン、または関連オブジェクトが含まれます.私たちは通常、入出力項目を直接と間接の2つに分けます.直接アイテム:関数のパラメータと戻り値;間接アイテム:パラメータ形式で入力されたパラメータと変更された外部オブジェクトではありません.
 

手順2:失敗したテストを観察する


テストの準備ができたら実行できます.実装コードを作成する前にテストを実行する理由はたくさんあります.最も主要なのは、コードの状態を決定するために使用できることです.テストを書くとき、テストがどのように失敗するかを明確に期待します.ユニットテストには論理的なブランチは存在せず,コードも比較的簡単であるが,他のコードのようにバグも存在する.しかし、それを実行して、期待された結果を比較すると、私たちはすぐにこれらのバグを発見します.
理想的には、新しいテストを追加した場合、すべてのテスト例を実行できるはずです.これにより、1つのテストが別のテストに依存するなど、干渉テストを容易にキャプチャすることができます.
実装コードを作成する前にテストを実行し、新しいことを教えてくれます.実装コードを書く前にテストが正常に合格する経験がある場合があります.一般的に、このようなことは起こるべきではありません.TDDは私たちに合格できないテストを書くように教えてくれました.私たちは先にテストコードを書くので、機能コードはまだ開発されていません.このとき、テストコードが通じると問題があることを示します.実行環境がこの方法の実装を提供しているかどうか、またはこのテスト例を保持する必要があるかどうかを決定する必要があります.
 

手順3:テストに合格したことを確認する


失敗したテストコードを実行する準備ができたら、実装コードを作成し、テストコードが実行できることを保証します.時にはハードコーディングも必要です.このステップで私たちのコードがどんなに悪いか心配する必要はありません.後の再構築の一環で彼を最適化することができます.実装コードを作成するときは、最も明らかな簡潔な実装方法を探します.もし私たちが彼を偽造することができなければ、具体的な実装を後ろに遅らせることができます.

  1.君は彼を必要としない


限界プログラミングでは、TDDの真髄は「彼を必要としない」であり、必要になるまで関連機能を追加する必要があるという意味です.仮定に基づいて、後で使用する可能性のあるコードを追加すると、私たちのコードが膨張します.動的言語、特にjavascriptでは、この原則に違反すると、コードの柔軟性を高めることができます.1つの例は、関数にパラメータを追加しすぎます.そんな需要がない限り、そうしないでください.

  2.Stringを通ります。prototype.trimテスト


次のコードは、以前のテストを満たすために開発されたものです.
String.prototype.trim = function () {
  return this.replace(/^\s+/, "");
};

この実装はまだ完全ではなく,左スペースのみが除去されていることがわかる.しかしTDDはこのようにして、一歩一歩小さくて、テストを通過させることができればいいです.新しい需要点を発見したら、テストコードを作成し、実装コードを改善し、テストに合格します.

  3.仕事ができる最も簡単な案


最も簡単なソリューションは、製品にハードコーディングのコードを追加する可能性があることを意味する場合があります.一般的なソリューションがそれほど明らかではない場合があるため、ソリューションがあるまでハードコーディングでプロジェクトを推進することができます.ハードコーディングは私たちのプロジェクトを推進することができますが、コードの品質は私たちの最終目標です.

手順4:重複するリビルドを除去する


最後に、最も重要で最も面白い仕事はコードをきれいにすることです.実装コードの開発が完了し、テストが順調に実行されると、再構築の作業を考慮し、重複したコードを削除することができます.この期間には1つのガイドラインしかありません.テストは通過しなければなりません.再構築に関する良い提案は、毎回1つの操作だけを修正し、テストが合格することを保証することです.再構築は既存のコードのメンテナンス修正なので、テストに失敗することはできません.
重複するコードは、ハードコーディングの解決策を解決するために異なる場所に現れる可能性があります.もし私たちがハードコーディングの偽の応答があれば、私たちは彼に別のテストを追加して、彼を異なる入力の条件の下で失敗させる必要があります.ハードコーディングを置き換える案は思いつかないかもしれませんが、少なくとも問題の存在を知っています.彼は私たちに十分な情報を提供して、最終的な解決策を見つけるのに便利です.
重複するコードは、setupのリクエストオブジェクトや偽の依存などのテストコードにも存在する可能性があります.テストコードもコードであり、同様にメンテナンスが必要であり、重複コンテンツを削除する必要があります.テストコードとシステムが結合しすぎる場合は、ヘルプメソッドを抽出し、構造を再構築する必要があります.setupおよびteardownは、オブジェクトの作成と破棄を集中的に設定するために使用できます.
再構築中にテストを失敗させることはできません.再構築の過程でより少ないコードで作業を完了しなければ、作業を後で託すことを考慮する必要があります.

手順5:繰り返し作業


すべての作業が完了し、コードが重複したり、再構築作業が必要になったりしたら、todoリストから新しいタスクを探して、上記の手順を繰り返します.必要に応じてこのような仕事を繰り返す.この過程を熟知した後、足どりを拡大することができますが、周期が短いことを確保することで、タイムリーなフィードバックを得ることができます.
機能がニーズを満たした後、テストのオーバーライド率を向上させ、境界値のテスト、依存項目のテスト、異なる入力タイプのテスト、異なるコンポーネント間の統合テストなどを追加することができます.次はStringですprototype.trimが追加した2番目のテスト:
"test trim should remove trailing white-space":
function () {
  assert("should remove trailing white-space", "a string" === "a string ".trim());
}