私のために今起こっていることから、関連する逸話があります。私はTDDを使用しないプロジェクトに取り組んでいます。私たちのQAの人々は私たちをその方向に動かしていますが、私たちは小さな衣装であり、長く引き抜かれたプロセスでした。
とにかく、私は最近、サードパーティのライブラリを使用して特定のタスクを実行していました。そのライブラリの使用に関して問題があったので、本質的に同じライブラリのバージョンを自分で書くことになりました。合計で、約5,000行の実行可能コードと約2か月の時間になりました。私はコードの行が貧弱なメトリックであることを知っていますが、この答えのために私はそれが規模のまともな指標だと感じています。
任意のビット数を追跡できるようにするために必要な特定のデータ構造が1つありました。プロジェクトはJavaであるため、Javaを選択BitSet
して少し変更しました(先頭0
のsも追跡する機能が必要でしたが、JavaのBitSetは何らかの理由でこれを行いません....)。〜93%のカバレッジに達した後、私が書いたシステムに実際にストレスをかけるテストをいくつか書き始めました。機能の特定の側面をベンチマークして、それらが最終要件に十分対応できるようにする必要がありました。当然のことながら、BitSet
インターフェイスからオーバーライドした機能の1つは、大きなビットセット(この場合は数億ビット)を処理するとき、とてつもなく低速でした。他のオーバーライドされた関数はこの1つの関数に依存していたため、大きなボトルネックでした。
私がやったことは、描画ボードに行き、の基本的な構造を操作する方法を見つけ出すことでしBitSet
たlong[]
。アルゴリズムを設計し、同僚に入力を求めてから、コードを書き始めました。次に、ユニットテストを実行しました。それらのいくつかは壊れており、それを修正するためにアルゴリズムを調べる必要がある場所を正確に指し示しました。単体テストからのすべてのエラーを修正した後、私は関数が本来どおりに機能すると言うことができました。少なくとも、この新しいアルゴリズムが以前のアルゴリズムと同様に機能することを確信できました。
もちろん、これは防弾ではありません。単体テストがチェックしていないバグが私のコードにある場合、私はそれを知りません。しかし、もちろん、そのまったく同じバグは、遅いアルゴリズムでも同様でした。 ただし、その特定の関数からの誤った出力を心配する必要はないと自信を持って言うことができます。既存の単体テストにより、新しいアルゴリズムが正しいことを確認するために何時間、おそらく何日かを節約できました。
それが、TDDに関係なく単体テストを行うポイントです。つまり、コードをリファクタリング/保守するときに、TDD内およびTDDの外部で単体テストが行われます。もちろん、これは通常の回帰テスト、煙テスト、ファジーテストなどと組み合わせる必要がありますが、ユニットテストは名前が示すように、可能な限り最小の原子レベルで物事をテストし、エラーが発生した場所の方向性を示します。
私の場合、既存の単体テストがなければ、アルゴリズムが常に機能することを保証する方法をどうにかして考えなければなりません。結局のところ、ユニットテストによく似ていると思いませんか?