私はこれについて疑問に思っていました。設計と検証とは正確にはどういう意味ですか。
TDDを適用して、コードがSOLIDであることを確認し、外部の動作が正しいかどうかを確認しないでください。
動作が正しいことを確認するためにBDDを使用する必要がありますか?
私が混乱するのは、TDDコードKatasについてもです。私にとって、彼らは設計よりも検証のように見えました。 TDDカタスではなくBDDカタスと呼ばれるべきではありませんか?
たとえば、ボブおじさんのボウリングカタは、最終的にはシンプルで素敵な内部デザインにつながると思いますが、プロセスのほとんどはデザインよりも検証に集中していると感じました。設計は、外部の動作を段階的にテストすることの副作用のようでした。設計に重点を置いているのではなく、検証に重点を置いているとは感じませんでした。通常は反対のことを言われますが、TDDでは検証が副作用であり、設計が主な目的であるとされています。
だから私の質問は、TDDを行うときに正確に何に焦点を当てるべきかということです:SOLID、外部APIのユーザビリティ、または何か他のもの?
そして、検証に焦点を当てずにそれを行うにはどうすればよいですか?
TDDを実践しているとき、皆さんは何に力を注いでいますか?
TDDコードカタは学習 TDDの実践とそれらがどのように設計を推進するか(そしてそのように優れた設計を学ぶ-はい、通常これはSOLIDコード)の書き方を学ぶことを意味します) 。
つまり、TDDは優れた設計を実現することですが、問題を解決しない適切に設計されたコードを使用しても意味がありません。ここで検証が行われます。これは多くの形式であり、BDDは多くの自動受け入れテスト手法の1つとしてその1つです。
検証とは、記述されたコードが正しい問題を解決していることを確認することです。
したがって、TDDを行うときは、設計に焦点を当ててください。クリーンで確実であることを確認してください。
ただし、単体テストと受け入れテスト(および必要と思われるその他のテスト)を追加することを忘れないでください。
検証 は、製品が指定されたすべての要件を満たしていることを確認することです。 テスト駆動開発 自体は、記述されたテストの品質を指定していないため、製品が仕様に完全に準拠していることを保証できません。最初にテストを書くときは、簡単にテストできるソフトウェアの作成に集中する傾向があります。大量の 機能コードカバレッジ を達成し、APIがどのように見えるかについて考える機会がありますバッキング機能を作成する前にテストを作成します。
テストを作成するときは、検証についても検討する必要があります。テストを要件にマッピングし、関数内の他のコードパスについて検討します(より高いステートメントまたは決定範囲を実現します)。しかし、TDDはこれらについて何も述べていません。最初にテストを記述してから、テストに合格するために最小限のコードを記述する必要があるとだけ言っています。テストの要件カバレッジとパスカバレッジを少なくとも完全に確保しないと、テストが検証目的に適さない可能性があります。
> tdd is about design not verification.
これを"tddの利点は優れた設計である"に変換します。
Tddでは、検証コードの記述に集中します。
Tdd(=コードを実装する前に単独でテストを作成する)を実行することにより、副作用として自動的に優れた設計(=最小結合)が得られます。
コードを実装した後に自動テストを作成するのとは対照的に、検証も得られますが、追加の設計上の利点はありません。
それは実際には両方についてですが、検証はコードの後にテストを書くことによって達成できる素晴らしい副作用です。 TDDの本当の利点と最初にテストを作成することは、各論理ユニットまたはビジネスルールの設計を洗練し、設計の他のユニットを壊してそれらを維持せずに残りの論理ユニットを構築することにより、設計を具体化するのに役立ちます。過度に結合されることから。
たとえば、一部の開発者は、最初にテストとコードがすべて同じファイルに存在する「ホワイトボード」のようにTDDアプローチを使用します。これにより、テストでロジックを進化させたり、アイデアをテストしたりすることができます。次に、設計が進化するにつれて、コードがテストモジュールからアプリケーション自体に抽出されます。
結果のテストは、さらにリファクタリングが行われるときに検証に使用できます。