2012-05-12 7 views
6

私はTDDの基本原則に精通だが、あること:なし実装の ダミーの実装と実際の実装の両方を持つインタフェースを使用している場合、ユニットテストの最適なアプローチは何ですか?

  • テストが
  • リファクタリングコード
  • に合格するために基本的な実装を書くため

    1. 書き込みテスト、これらは失敗します

      しかし、インターフェイスと実装がどこに適しているのか少し混乱しています。私は暇な時間にSpringのWebアプリケーションを作成しています。銃を燃やすのではなく、インターフェイス/実装を少し良くテストする方法を理解したいと思います。ここで作成した簡単なサンプルコードを取ってください。

      私はしかし、地面からアプリケーションを得るために、私はちょうど戻りますDummyUserService実装を置換しましたが、最終的にデータベースを照会します。このの実際の実装があるだろう、UserServiceインターフェースを作成しました
      public class RunMe 
      { 
      
          public static void main(String[] args) 
          { 
           // Using a dummy service now, but would have a real implementation later (fetch from DB etc.) 
           UserService userService = new DummyUserService(); 
           System.out.println(userService.getUserById(1)); 
          } 
      } 
      
      interface UserService 
      { 
          public String getUserById(Integer id); 
      } 
      
      class DummyUserService implements UserService 
      { 
          @Override 
          public String getUserById(Integer id) 
          { 
           return "James"; 
          } 
      } 
      

      いくつかの静的データ

      質問:上記のテスト方法をどのように実装できますか?

      は私がgetUserById()を呼び出すとき、それはJamesを返すだろうとテストDummyUserServiceTestというクラスとテストを作成することができ、時間の無駄でない場合は非常に簡単と思われます(?)。

      その後、というテストクラスを作成して、getUserById()がデータベースからユーザー名を返すことをテストすることもできます。これは私を少し混乱させる部分です。そうすることで、単体テストの境界を本質的に超えてしまわず、より多くの合同テスト(DB上でヒットします)になりますか?

      質問:ダミー/スタブ付きの実装と実際の実装のどちらを使用するか、どの部分をユニットテストする必要があり、どの部分をテストしないままにしておくことができますか?

      私は昨夜、このトピックにグーグルで数時間を費やし、そしてほとんどが実際にテストする必要がありますどのような助言の王国にあるものTDD上のチュートリアル、またはJUnitの使用方法の例が、何のいずれかを発見しました。しかし、私は十分な検索をしなかったし、適切なものを探していなかったことは全く可能です...

    答えて

    4

    ダミーの実装をテストしないでください:それらは実稼働環境では使用されません。それらをテストするのは本当の意味がありません。

    実際のUserService実装がデータベースにアクセスしてそのIDでユーザー名を取得する以外は何もしない場合、テストではそれが正しく実行されることをテストする必要があります。必要に応じて統合テストと呼んでください。それにもかかわらず、それは書かれ、自動化されるべきテストです。

    通常は、テストの@Before注釈付きメソッドで最小限のテストデータをデータベースに取り込み、データベースに存在するIDに対して対応するユーザー名が返されるかどうかをテストするメソッドをテストさせます。

    0

    JBの回答はいいです、私は私が使った別のテクニックを捨てると思っていました。

    元のテストを開発する場合は、最初にUserServiceのスタブを気にしないでください。実際には、本物のことを書いてください。 Kent Beck's 3 rulesに従ってください。

    1)動作させる。 2)正しいですか。 3)速くしてください。

    あなたのコードでは、find by idの動作を確認するテストが行​​われます。 JBが述べたように、あなたのテストはこの時点で統合テストとみなされます。パスしたら、ステップ1を成功裏に達成しました。次に、デザインを見てみましょう。そうですか?任意のデザインのにおいを微調整し、ステップ2を確認してください。

    ステップ3では、このテストを高速化する必要があります。すべてのトランザクション管理とデータベースの設定で統合テストが遅くなり、エラーが発生しやすくなります。コードが動作することがわかったら、私は通常、統合テストを気にしません。現時点ではダミーサービスを導入し、統合テストを効果的にユニットテストに変えることができます。これでデータベースには何も触れていないので、このテストが速くなっているので、リストからステップ3を確認できます。

    このアプローチの問題点は何ですか?さて、多くの人は、まだデータベースバックアップのためのテストが必要だと言うでしょうUserService。私は、通常、私のプロジェクトで統合テストを続けているわけではありません。私の意見では、これらのタイプのテストは遅く、脆く、ほとんどのプロジェクトで十分なロジックエラーをキャッチして自分自身で支払うことはできません。

    希望に役立ちます!

    ブランドン

    3

    は、私が最初にこの本を読むためにあなたをお勧めします:スティーブFreemandとNATプライスによってGrowing Object-Oriented Software Guided by Tests。 TDDに関連して、あなたの質問や他の多くの質問に答えます。

    具体的なケースでは、RealUserServiceをDBアダプターで構成して、実際のDB照会を行う必要があります。サービス自体はデータの永続性ではなくサービスになります。本を読む、それは多くの助けになります:)

    関連する問題