2

テストに問題があります。いくつかの派手な手順のためのアルゴリズムがあります。このアルゴリズムは、範囲 [-999,999; から乱数を取得します。+999,999]、それをテーブルの ID 番号のように扱い、データベースでいくつかのランダム操作を実行します。これは、乱数分布が正しいことを確認するために、メソッドを何度も呼び出す必要があることを意味します。

TDD を使用してすべてのコードを作成したかった (もう少し学習するため)。

問題は、TDD の原則を念頭に置いてアルゴリズムをテストする方法がわからないことです。

TDD によれば、最初にテストを記述せずにコードを実行するべきではありません。

私が考えている解決策の 1 つは、メイン クラスに debug(text) というダミー メソッドを用意することです。このメソッドは、製品コードでは何もしません。ただし、このメソッドをオーバーロードしてサブクラスを作成し、今回はいくつかの興味深い情報を格納します。この情報は、関数が適切に機能するかどうかを確認するために、後でテストで使用できます。データベース接続はモックされ、何もしません。

別の解決策は、後でテストで使用される、興味深い情報を保存するモック データベース接続を作成することです。しかし、そのような接続を作成するには膨大な作業が必要になるため、時間をかける価値はないと思います。

データベースが適切に変更されているかどうかを確認するために、後で統合テストが行​​われます。ただし、統合テストは TDD の一部ではありません。

TDD が失敗し、役に立たなかったり、使いづらかったりする場所に行き着いてしまったことがありますか?

4

3 に答える 3

8

それはあなたの乱数関数ですか?

それは次のとおりです。乱数ジェネレーターは、それを使用するものの外部でテストする必要があります。

そうではありません: それがどれほどランダムかを検証する必要がない限り、まったくテストすべきではありません。IMO は大きな ROI ではありませんが、実際のニーズに完全に依存します。

DB 機能は、RNG が実際には R であると想定する必要があり、RNG とは別にテストする必要があります。テスト中は、RNG を使用したくない場合があります。少なくとも、テストを再現可能にするために RNG をシードすることをお勧めします。これにより、正確性の検証がより困難になる可能性があります。

于 2012-08-28T14:13:31.753 に答える
1

デザインをもう一度検討する必要があります。単体テスト (TDD を使用するか、後でテストを追加することによる) では、各クラスを完全に分離してテストする必要があります。

あなたの場合、いくつかの異なる機能があります。

  • 乱数発生器
  • データベースでのルックアップ
  • データベースに対して実行されるコード

これらのそれぞれは、依存性注入モッキングなどの設計パターンを使用して、互いに完全に分離してテストできます。

単体テストは、ランダムな動作に依存するべきではありません。そうすれば、それらはもろくなり、維持するのが難しくなります。

したがって、あなたの場合、乱数ジェネレーターをかなりの回数実行し、結果が期待される範囲内にあるかどうかを確認してテストします。そのテストは、時間帯に関係なく、実行されるたびに成功するはずです。

データベース部分については、データベース コードを非表示にするインターフェイスを作成します (リポジトリ パターンを見てください)。単体テストでは、このインターフェイスをモックして、正しい関数が正しい引数で呼び出されるかどうかを確認できます。統合テストでは、実際のリポジトリ実装を使用できます。

2 番目のテストでは、データベース ルックアップが機能しているかどうかを確認します。渡された「乱数」が正しく使用され、データベース モックで正しいメソッドが呼び出されているかどうかを確認します。

3 番目のテストでは、データベース モックに対して正しいコードが実行されるかどうかを確認します。

数か月前、ユニット テストといくつかのベスト プラクティスに関する .NET マガジンの記事を書きました。多分それは役立つかもしれません:単体テスト、地獄か天国か?

于 2012-08-28T14:21:14.190 に答える
1

コードベースのいくつかの仮定を次に示します。

1) ストアド プロシージャの呼び出しは、データ アクセス コードにあります。

2) データ アクセス コードはインターフェイスを実装します。

3) TDD で記述したいビジネス ロジックは、データ アクセス コードをそのコンストラクターに挿入できます。

その場合は、モック フレームワークを使用して、データ アクセス コードをモックできます。実際のストアド プロシージャは呼び出されません。

新しいコードは、TDD を使用して開発できます。

于 2012-08-28T14:22:54.657 に答える