私は最近、統合テストが 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.今、私が見ているOrderManager
とAuthenticationManager
、彼らはサイドB.右の質問に答えることができるかどうかを確認しますか?
次に、データベースアクセス:
認証と注文の永続化には、運用環境のデータベースにデータが必要であることは明らかです。ただし、単体テストでは必要ないので、呼び出しをモックして目的の結果を返しますよね?しかし、これをどうやって模倣するのですか?
AuthenticationManager.authenticate
認証が失敗した場合はがスローされるためException
、ほとんど何もする必要がありませんvoid
。それ以外の場合は戻り値の型があります。OrderService.save()
モックを使用するように指示するにはどうすればよいAuthenticationManager.authenticate()
ですか?
そして、どうすれAuthenticationManager
ば何もしないか、例外をスローするように設定できますか?
私がする春を伝えることができる注入嘲笑AuthenticationManager
それは何もしません/スローException
私にOrderService
下のテスト?