8

私は現在、TDD の方法で JDBC ドライバーの実装を作成しています (はい、あなたはそれを正しく読んでいます)。この時点ではクラス スタブといくつかのマイナーな機能しか完成していませんがStatement、 forPreparedStatementは のスーパークラスですCallableStatement。実際にこれらのクラスの実装のテストを書き始めたらどうすればよいでしょうか。次のうちどれを実行すればよいでしょうか。

  1. のテスト スイートを作成し、Statementそのスイートを の追加テスト用に拡張してからPreparedStatement、 に対して同じことを行いCallableStatementます。
  2. スーパークラスから継承されたメソッドを無視して、各実装を個別にテストします。
  3. 実装クラスごとにすべてのメソッドを個別に厳密にテストします。結局、一部の継承されたメソッドは実装によって異なる動作をする可能性があります。これの穏やかなバリエーションは、実装が使用するすべての継承されたメソッドをテストすることです。

2 番目が最も自然に感じますが、3 番目の理由から、そうするのが賢明かどうかはわかりません。それで、私は何をすべきだと思いますか

4

4 に答える 4

11

「実装クラスごとにすべてのメソッドを個別にテストする」

特に、スーパークラス メソッドを適切にオーバーライドできないことは、一般的なバグです。サブクラスの作成者は、スーパークラスに関する仮定を行います。スーパークラスが変更され、サブクラスが壊れています。

于 2009-01-01T19:38:42.103 に答える
7

これが各テスト サブクラスに対して同じテストを繰り返し実行することを意味する場合、代替案 1 (テスト クラス階層を実際のクラス階層と同じにする) は特に行いません。また、一般的なユーティリティ基本クラス以外のテスト クラスをサブクラス化することにも、一般的に懐疑的です。

私は通常、抽象かどうかにかかわらず、階層内のクラスごとに 1 つのテストを作成します。したがって、基本クラスには個別のテストがあり (通常は、それを具体的にテストするために使用されるテストローカルのプライベート サブクラスを使用)、サブクラスに関する知識を使用して、各サブクラスに適切なテストを記述します。カバレッジ ランでは何が欠けているテストなのかを確認できるので、通常は前もってあまり形式化されていません。

于 2009-01-01T19:24:59.447 に答える
4

実装に関する知識に基づいて、快適に感じるように十分なテストを提供してください。単体テストを完全なブラック ボックス テストとは見なしません。基本クラスが仮想メソッドをまったく呼び出さないことがわかっている場合 (または、少なくともオーバーライドされたメソッドがない場合)、その事実に注意してください。ただし、既に取得した単体テストを効果的に複製しないでください。

単体テストは、確かに極端に行うことができます。単体テストから得られる価値と、コストがかかる労力とのバランスを取ることは常に価値があります。

于 2009-01-01T19:21:15.087 に答える
1

TDD では、メソッドをテストするのではなく、コードの動作や機能をテストする必要があります。したがって、サブクラスを実装するときは、基本クラスとは異なる動作のみをテストするように制限できます。疑わしい場合は、新しいテストを作成してください。

于 2009-01-01T19:35:28.350 に答える