「統合テスト詐欺」の削除-コラボレーションおよび契約テストの理解[終了]


8

私は最近、統合テストが JB Rainsbergerによる詐欺であることを確認しました。この件について、さらに資料を探しています。私は、Rainsbergerによって説明されている概念に興味をそそられ、どのようにそれらを適用するかについても混乱している(つまり、単体テストを行う必要がある場合の統合テスト)ことにどれほどの誤りがあるかについてショックを受けました。説明したコラボレーションテストとコントラクトテストの詳細を知りたいのですが、どこから始めればよいかわかりません。

私の心に残った唯一のことは、テストが尋ねる必要がある4つの質問です:

サイドA:

Do I ask the right question?
Can I deal with the answer?

サイドB:

Can I answer a question?
Do I answer correctly?

しかし、これをアプリケーションスタックのランダムなメソッドにどのように適用すればよいのでしょうか。

実世界の例を取り、孤立したマイクロテストのこれらのアイデアを適用する本、チュートリアル、または例がありますか?理想的には、この例ではJava、Spring + PowerMock / Mockito / EasyMoockを使用しています

これらの概念を一般的に扱っており、それらをよりよく理解するのに役立つ任意の文献をいただければ幸いです。

また、適切なユニットテストを行う方法、さらには既存のコードをリファクタリングしてサンプルを投稿する方法について、より詳細な質問をすることができるフォーラムがある場合は、すばらしいでしょう。

ありがとう!


編集-いくつかの追加の考え:

モックを使用する場合と、スタブを使用して、テスト対象のクラスをそのコラボレーターから分離する場合の一般的なルールはありますか?4つの質問に適用できますか?

最良のモックフレームワークはPowerMockのようで、モックしたいクラスとそれが返す必要があるクラスをテストごとに正確に定義できますか、それとも上記の質問に使用したものがありますか?PowerMockを使用して、DAOやGUIなど、実際のアプリケーションスタックの一部に特定の原則の一部またはすべてを適用する優れたチュートリアルはありますか?


編集2-例

テストしたいメソッドの種類と私の考えのほんの一例

注文を保存するWebサービスがあります。この段階では、最高のセキュリティについてあまり心配していません。そのため、いくつかのセキュリティを確保するために、サービスはユーザー名とパスワードを使用して保存要求を認証します。認証さOrderManagerれると、を保存するためにが呼び出されますOrder。内部的には、マネージャーは、新しい注文を作成する必要があるか、既存の注文を更新する必要があるかを決定します。(それはWebSericeにとって重要ではありませんよね?)

@WebService
public class OrderService {
    @Inject
    private AuthenticationManager authenticationManager;

    @Inject
    private OrderManager orderManager;

    public void save(String username, String password, Order order) {
        authenticationManager.authenticate(username, password);
        try {
            orderManager.save(orde);
        } finally {
            authenticationManager.logout();
        }
    }

今私は思っています:ここで正確に何をテストしていますか?認証の成功と失敗、および注文の保存の成功と失敗のテストがあるはずだと思います。

しかし、どうすればそれを4つの質問に分割できますか?テスト中の私のクラスは明らかにOrderService(OS)で、共同編集者はOrderManager(OM)とAuthenticationManagerです。(AM)だから私は以下のテストをしています、ここで私を訂正してください、私は声を出して考えているだけです:

OS <-> OM

  • OSはOMに注文の保存を要求します(ここでどのような種類のパラメーターをテストしますか?nullおよびが正しく初期化されているかOrderどうかOrderは重要ですか?)
  • OMは他の内部メソッドを呼び出すことで保存呼び出しに応答します。そのメソッドが呼び出されるかどうかをテストしますか?!
  • OMが失敗しない場合、OSは失敗しないはずです
  • OMが失敗した場合、OSは失敗するはずです

... ほかに何か?

そしてもちろんOS <-> AM

  • OSはAMに認証を要求します-私はAMがさまざまな種類のユーザー名/パスワードにどのように反応するかをテストしていると思いますか?
  • ...

今私の最初の結論

遠くWebSericeが懸念しているとして、私は唯一の4つの質問の2アウトをテストすることができます:横A.今、私が見ているOrderManagerAuthenticationManager、彼らはサイドB.右の質問に答えることができるかどうかを確認しますか?

次に、データベースアクセス:

認証と注文の永続化には、運用環境のデータベースにデータが必要であることは明らかです。ただし、単体テストでは必要ないので、呼び出しをモックして目的の結果を返しますよね?しかし、これをどうやって模倣するのですか?

AuthenticationManager.authenticate認証が失敗した場合はがスローされるためException、ほとんど何もする必要がありませんvoid。それ以外の場合は戻り値の型があります。OrderService.save()モックを使用するように指示するにはどうすればよいAuthenticationManager.authenticate()ですか?

そして、どうすれAuthenticationManagerば何もしないか、例外をスローするように設定できますか?

私がする春を伝えることができる注入嘲笑AuthenticationManagerそれは何もしません/スローException私にOrderService下のテスト?


こんにちはピート、あなたはDXMの答えからあなたが探していたものを手に入れたようですが、将来的には、質問ごとに1つの特定の問題に留めてください:非常に広範囲ですべてを網羅する質問は、Stack Exchangeスタイルには適合しませんQ&Aの

そうですか。1つの質問に固執し、将来的にはそのポイントに到達しようとします。私は一般的にこのテーマについてあまりにも多くの質問をしただけで、どこに質問すればよいかわからなかったと思います...
ピート

回答:


2

それは非常に長い質問です。お詫びしますが、私は追加の思考部分だけをざっと見ました。

私は2冊の優れた本を推薦できます:

彼らはあなたが述べた正確なフレームワークを使用していませんが、彼らが与えるアドバイスは非常に価値があり、OODのあらゆるシナリオに簡単に適用されます。どちらも、単体テストをセットアップしてテスト対象のコンポーネントだけを分離する方法と、モック/フェイク/スタブオブジェクトをリモートの依存関係にセットアップする方法について詳しく説明しています。

更新(以下のコメントへの応答):

この回答は、OPの回答です。

  • 「説明したコラボレーションテストとコントラクトテストの詳細を知りたい」-OPは統合テストを削除し、代わりにそのコンポーネントの明確に定義されたインターフェイスに対して個々のコンポーネントをテストする必要があるため、コントラクトテストは単体テストです。それは単体テストであり、正確にはそれらの本の内容です。
  • 「...ユニットテストを正しく行う方法や、既存のコードをリファクタリングする方法について、より詳細な質問をすることができます」
  • 「モックをいつ使用し、いつスタブをコラボレーターからテスト中のクラスを分離するのに、一般的なルールはありますか?」-これらの本は両方とも、モックオブジェクトの設定とそれらの適切な使用に非常に重点を置いています
  • 「実世界の例を取り上げ、孤立したマイクロテストのこれらのアイデアを適用する本やチュートリアルや例はありますか?」-はい、これは単体テストと呼ばれ、私がリストした2冊の本はこれを説明するのに優れています。

OPが指摘したように、統合テストは非常に複雑になり、非常に速く書くのが難しいため、多くの問題を引き起こします。優れた代替策は、ユニットテストと、パブリックインターフェイスに対して各クラスを分離してテストすることです。単体テストに加えて、これらの本はどちらも、統合テストについても説明しており、それを使用すべき場所と使用すべきでない場所について述べています。

さらに、OPの質問をさらにすくい取った後、多くの不確実性は特にモックオブジェクトの使用を中心に展開しているようで、どちらの本も実際にはモックオブジェクトの適切な使用方法に焦点を当てています(ただし、Springまたは特定のモックフレームワークについては触れていません) )


1
彼は単体テストについてではなく、統合テストについて尋ねています。したがって、私はあなたの質問答えとは思わない
BЈовић

@VJovic:私の応答は回答更新です。
DXM

詳細な回答ありがとうございます。以前にxUnit Bookを注文した。あなたがそれを音にするのと同じくらい良いことを願っています;)@VJovic:質問は私が一目で統合テストについて尋ねているように本当に見えますか?なぜなら私は本当にユニットテストについて質問していて、「統合テストは詐欺である」と呼ばれる会議ビデオを参照しているだけです。投稿が誤解を招きやすい場所を教えてください。
ピート

ところで、私は反対票を投じなかった(反対に、私は+1した)。@Pete 「統合テスト詐欺」の削除-コラボレーションおよび契約テストの理解 -これはあなたのタイトルです。統合テストについて話し、ユニットテストに関するいくつかの質問をしたため、誤解しているかもしれません。
BЈовић
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.