テストに対する特定のアプローチがどれほど価値があるかは、開発中のシステムがミッションクリティカルであるかどうか、および他のミッションクリティカルなシステムがどれだけそれに依存しているかによって異なります。ウェブサイト用のシンプルなゲストブックスクリプトはミッションクリティカルとは考えられませんが、実行するウェブサイトがデータベースへのフィルタリングされていない入力を許可するバグによって潜在的に侵害され、そのサイトが重要なサービスを提供する場合、それは突然さらに多くなりますゲストブックスクリプトを徹底的にテストするために重要です。同じことがフレームワーク/ライブラリコードにも当てはまります。バグのあるフレームワークを開発する場合、そのフレームワーク機能を使用するすべてのアプリケーションにも同じバグがあります。
テスト駆動開発では、テストに関して安全性をさらに高めることができます。テストしたいコードと一緒に、またはテストの後でさえもテストを書くと、テストを間違えるという本当のリスクがあります。すべてのテストを最初に記述する場合、コードが内部でどのように機能するかはテストの記述に影響を与えないため、特定のエラー出力が正しいと考えるテストを不注意に記述する可能性は低くなります。
また、テスト駆動開発では、開発者がさらに多くの作業を行う必要がないため、テストが簡単なコードを作成することをお勧めします。テストが容易なコードは、理解、再利用、および保守が容易なコードである傾向があります。
そして、メンテナンスは本当にTDDの報酬を享受する場所です。ソフトウェアに費やされるプログラミング作業の大部分は、メンテナンス関連です。これは、ライブコードに変更を加えて、新しい機能を与えたり、バグを修正したり、新しい状況に適応させたりすることを意味します。このような変更を行う場合、変更が目的の効果を持っていることを確認する必要があります。さらに重要なのは、予期しないノックオン効果がないことです。コードの完全なテストスイートがある場合、行った変更が他の何かを壊していないことを簡単に確認できます。また、行った変更が他の何かを壊した場合、その理由をすばやく見つけることができます。利点は長期的です。
あなたはあなたの質問で次のように言った:
いくつかのテストを書くことにはいくつかの利点がありますが、ごくわずかです。そして、最初にテストを書くというアイデアは好きですが、実際のコードをデバッグするよりも、テストのデバッグに時間を費やして、自分の本当の意味を伝えるようにします。これはおそらく、テストコードがテストするコードよりもかなり複雑になることが多いためです。これが利用可能なツール(この場合はrspec)に不慣れであることを願っています。
これは、あなたがまったくテストを受けていないことを示唆しているようです。単体テストは非常に単純で、一連のメソッド呼び出しとそれに続くアサーションが予想される結果と実際の結果を比較するものであると想定されています。テストのバグは悲惨なものになるため、単純なものである必要があります。ループ、分岐、または他のプログラムがテストに制御をスローすると、テストにバグが導入される可能性が高くなります。テストのデバッグに多くの時間を費やしている場合は、テストが過度に複雑であり、テストを簡素化する必要があることを示しています。
テストを単純化できない場合、その事実だけでは、テスト対象のコードに何か問題があることを示唆しています。たとえば、クラスに長いメソッド、多数のif / elseif / elseまたはswitchステートメントがあるメソッド、またはクラスの現在の状態によって決定される複雑な相互作用を持つ多数のメソッドがある場合、テストは必然的に非常に複雑になります完全なコードカバレッジを提供し、すべての不測の事態をテストします。クラスに他のクラスへの依存関係がハードコードされている場合、コードを効果的にテストするためにジャンプする必要があるフープの数が再び増加します。
実行パスがほとんどない短いメソッドを使用して、クラスを小さく集中したままにして、内部状態を排除しようとすると、テストを簡略化できます。そして、これは問題の核心のようなものです。優れたコードは本質的に簡単にテストできます。コードのテストが容易でない場合は、おそらく何か問題があります。
単体テストを書くことは、長期的にはあなたに利益をもたらすものであり、それらを回避することは、後でトラブルを蓄積するだけです。あなたは技術的な負債の概念に精通していないかもしれませんが、それは金銭的な負債のように非常に機能します。テストを書いたり、コードをコメントしたり、ハードコードされた依存関係を書いたりすることは、借金をする方法です。早めにコーナーを切って時間を「借りる」ことで、締め切りに間に合うかもしれませんが、プロジェクトの早い段階で節約できる時間は貸し出しです。コードをクリーンアップしたり、適切にコメントしたり、テストスイートを構築したりせずに、毎日の作業に関心があります。それが長く続くほど、より多くの関心が蓄積されます。最終的に、コードが複雑な混乱になり、意図しない結果を引き起こすことなく変更を加えることができなくなることがわかります。
ユニットテストを早期に記述し、「技術的信用」の一形態として最新の状態に保つことを考えることができます。プロジェクトの早い段階でグッドプラクティスに従うことに時間を費やしています。この先見の明は、プロジェクトのメンテナンスフェーズに到達したときに興味を持ちます。変更を行う場合、変更の正確性と不要な副作用がないことを簡単に検証でき、更新をすぐに大騒ぎせずに入手できます。バグが見つかった場合は、バグを実行する新しい単体テストを追加して、コード内のバグを修正できます。次に単体テストを実行すると、バグが修正され、他の問題が発生していないことを確認できます。さらに、「回帰」を回避し、
TL:DR-はい、それらは現実の助けですが、投資です。利点は後で明らかになります。