コードは完璧であり、バグは存在しないという考えを促進します
ほとんど間違いない。それはあなたのテストが失敗するべきではなく、それ以上でもそれ以下でもないという考えを促進します。テスト(多くの場合でも)が「完璧」または「バグなし」について何かを言うと仮定するのは誤りです。テストを浅くするか深くするかを決定することは、良いテストを書くことの重要な部分であり、テストのカテゴリを明確に分ける理由(「ユニット」テスト、統合テスト、キュウリの意味での「シナリオ」など)。
失敗する単体テストを考えるのは意欲をくじくものです。または、修正するのが難しい単体テストを確実に考え出してください。
テスト駆動開発では、コーディングを開始する前に、すべてのユニットテストが最初に失敗することが必須です。この理由から、「赤緑サイクル」(または「赤緑リファクタリングサイクル」)と呼ばれます。
- テストが失敗しないと、コードがテストによって実際にテストされているかどうかわかりません。2つはまったく関連していない可能性があります。
- テストを赤から緑に正確に変更するようにコードを変更することで、コードが意図したとおりに機能することを確信でき、それ以上(必要ないかもしれません)になります。
いずれかの時点ですべてのユニットテストが合格した場合、その時点でのソフトウェアの状態の全体像はありません。ロードマップ/目標はありません。
テストはもっと細かい目標です。テスト駆動開発では、プログラマは最初にテスト(単数形)を記述し、次にコードを実装するという明確な目標を持ちます。次のテストなど。
テストの機能は、コードが記述される前に完全に存在することではありません。
エラーメッセージ(例外/スタックトレース)が開発者に作業を実行する必要がある場所を直接示すことができるため、この方法に適した言語およびテストライブラリを使用して正しく実行すると、開発を実際に大幅にスピードアップできます次。
実装前に、事前に単体テストを書くことを思いとどまらせます。
この声明がどうなるかはわかりません。テストの作成は、実装の一部であることが理想的です。
ここに何かが足りませんか?組織がすべての単体テストに合格することを期待するのはなぜですか?
組織はテストがコードに関連することを期待しているためです。成功するテストを作成するということは、アプリケーションの一部を文書化し、アプリケーションがそのテスト(テスト)のとおりに動作することを証明したことを意味します。これ以上でもそれ以下でもありません。
また、テストを行うことの非常に大きな部分は「回帰」です。新しいコードを自信を持って開発またはリファクタリングできるようにします。大量のグリーンテストを行うことで、それが可能になります。
これは、組織レベルから心理レベルに移行します。自分のエラーがテストによってキャッチされる可能性が高いことを知っている開発者は、解決する必要のある問題に対するインテリジェントで大胆なソリューションを思いつくことができます。一方、テストを持っていない開発者は、しばらくすると、変更がアプリケーションの残りの部分を壊すかどうかわからないため、(恐怖のために)停止状態になります。
これは夢の世界に住んでいますか?
いいえ。テスト駆動型アプリケーションでの作業は純粋な喜びです。別の質問で説明できる何らかの理由(「より多くの努力」など)でコンセプトが気に入らない場合を除きます。
そして、それは実際にコードの本当の理解を妨げていませんか?
絶対にそうではない、なぜだろうか?
テストのほかに、テストをソフトウェアのメインドキュメントとして実際に使用する大規模なオープンソースプロジェクト(コードの「理解」とノウハウの管理が非常に差し迫ったトピックである)が多数あります。また、アプリケーション/ライブラリのユーザーまたは開発者向けに、実際に機能する、構文的に正しい例を提供します。これはしばしば見事に機能します。
明らかに、悪いテストを書くことは悪いことです。しかし、それはテスト自体の機能とは関係ありません。