2009-08-18 7 views
11

私は新しいアプリケーションを開発し、可能な限り忠実に「テストファースト」開発に固執しようとしています。私はいくつかの既存の単体テストを無効にする効果を持つ機能を実装/変更する必要がある状況に自分自身を見つけています。私はこれにどのように対処すべきですか?私はそれを見ると、3つのオプションがあります。新しい機能によって既存の単体テストが無効になる場合はどうすればよいですか?

  • Updateまたは

  • 実装し、機能を実装(これ以上、必要に応じての追加)新しい機能要件を満たすためにすべて既存のテストを削除第一の特徴、失敗を確認するためにテストを実行し、更新またはいずれかを削除(これ以上必要に応じての追加)テストに失敗しまし

  • 古いのを見るためにすべてのテスト を実行し、 は機能を実装し、新機能のための新しいテストを追加します。 ESが必要

として古いテストに失敗し、削除または 更新最初のオプションは、TDDに接着するが、耐え難いほど非生産することができます。 2番目のオプションが最も簡単ですが、最初に忠実にテストするのではなく、適切に "カバーされない"こともあります。 3つ目の選択肢は両方の妥協点であり、ある程度は魅力的ですが、古いものを更新したばかりのテストを書き直すリスクがあります。

私はここに明確な戦略があるとは思わない。あなたはこれらの状況で何をしていますか?

+0

これは、私が最終的にゴミ箱に入ったすべてのコードを考えたときに私がしていることです:http://www.youtube.com/watch?v=tgBI3-q5COM – Will

+2

これは、正しく)いくつかの単体テストを破る可能性があります。 1つか2つかもしれないが、いくつか?ユニットテストが重なり過ぎる可能性はありますか? – Beta

+0

@Beta、実装に追加の依存クラスが必要であるという要件を追加するとします。他のテストでは従属オブジェクトの模擬実装が提供されていないので、実行時にヌル参照例外群が得られます。次に、戻って設定コードを修正して渡す必要があります。 – tvanfosson

答えて

8

私は1つのテストを選択し、それを変更して新しい機能を要求します。明白な候補がない場合、すなわち真に新しい候補の場合は作成します。私はそのテストに合格するためのコードを記述します。その時点で私は他のテストを実行し、それらのいくつかが失敗することに気付きます。その時点で、私は順番にテストを修正して、新しいフィーチャを反映するようにテストを修正するか(他のコード変更なしでパスする)、新しいフィーチャに関するテストを更新します。テスト中のコード)。

4

新しいフィーチャーのテストを作成し、フィーチャーに合わせて既存のテストを更新します。既に動作しているテストを中断した場合は、修正する必要があります。

4

の実装には、ユニットテストの書き込み/更新が含まれます。これはテスト駆動開発の基本です。したがって、2つ目のオプションは、最初のものだけでなく、TDDでもあります。実際に私はあなたには、いくつかの改造を使用して第三の選択肢をお勧めします疑いがある:(それはあなたがそれのためにあなたのAPI/UIを検証することができますので)機能の

  1. 書き込みテスト
  2. 機能に
  3. レビューを書きます(それらを修正、
  4. ランを破るテスト
  5. が壊れたものを修正しなければならない、といずれかが壊れていなかったこと#3から、あなたのリストにある場合に、それらを参照するには、一般エリアでユニットテスト彼らは持っているべきです 壊れた)。あなたが特定しなかったものが見つかった場合は、それが実際に正しいことを確認するために調査します。テストまたはフィーチャを適切なものに修正します。
  6. 利益;-)
0

は古いテストを取り除き、新しいものを書きなさい。いくつかの場所で古いテストのコードを借りることができるかもしれませんが、古いテストの性質を変更しようとするよりも、哲学的にテストを行うほうがよいでしょう。

テストは、あなたが達成しようとしていることをサポートするためのものであり、あなたに対抗するべきではありません。

0

私はここで考慮すべき2つのことがあると思います。私はあなたが1つだけまたは両方を考えているかどうかは分かりません。

最初の部分は、仕様(または予期される動作)が変更されてから機能を変更したことです。この場合、正しいことは、もはや有効ではない動作を記述するすべてのテストを削除することです。私は怠け者なので、私はそれらをコメントアウトするか、今はスキップします。次に、新しいテストを書く(または古いもののコメントを外す/修正する)ことで、新しい動作を完了するまで記述するようになります。

新しい機能で他のコンポーネントで使用されているインターフェイスが変更され、その機能を変更しただけでテストが失敗した場合は、2番目の部分があります。この場合、フィーチャーが完成した後にテストを修正するだけです。

1

私はすべてのアプローチが妥当だと思います。あなたは同じ結果になります。

TDDの本来的な意図では、より小さなステップが好きで、より多くのことをする人もいます。テストの行を書き、それを修正して繰り返すコード行を書く。これがあなたの場合は、最初に古いテストを段階的に行い、新しいシステムに進化させるか、削除します。

大きなチャンクを嫌うなら、新しいものを修正してダイビングしてください。私はこれがより自然であることがわかりました。特にペアプログラミングのときは、少し太字にすることができます。

本当にあなたの快適さと信頼水準に左右されることがあります。

私は、理想的には1つのテストで1つのテストを中止すればよいという考え方よりも、テストコードをリファクタリングして、これがあなたの持つ動作になるようにしたいと考えています。共有セットアップ方法のいくつかのソートが解決策かもしれません。

関連する問題