2011-02-02 8 views
12

CQRSを実装するためのアドバイスのいくつかは、データベース(またはおそらくLINQベースのORM)に対するADO.NETクエリなどの、メッシュに近いクエリの実装を推奨していることを考えると、ユニットテスト?CQRSの適用 - ユニットが薄い読み取り層をテストする必要がありますか?

本当に必要なのかなと思いますか?問題の

私の考え:

  1. mockable「シン読むレイヤー」を提供するために追加のアーキテクチャ上の複雑さを最小限に建築式典を保つために助言の性質そのものに反対のようです。
  2. ユーザーが作成する可能性のあるすべてのクエリの角度を効果的にカバーするための単体テストの数は、恐ろしいものです。

具体的には、私はASP.NET MVCアプリケーションでCQRSを試していますが、コントローラのアクションメソッドをテストするユニットを悩ますか、代わりにドメインモデルをテストするかどうかは疑問です。

事前に感謝します。

+0

"ユーザーが作成する可能性のあるすべてのクエリの角度を効果的にカバーする単体テストの数は、恐ろしいものです。"これ以上説明できますか?なぜユーザーはクエリを作成しているのでしょうか?クエリの側面はこれに重大な影響を及ぼすものでなければならず、次にクエリ/ビューサービスをテストすることができます(実際にはビューの範囲を縮小する必要がある場合) – roundcrisis

+0

2 - おそらく、ユーザーが実際に必要とするものを考え、有望な完全な自由の代わりに。 –

+0

あなたがヨーロッパやアメリカに住んでいれば、ユニットテストは費用対効果がなく繰り返しているように見えるかもしれません... –

答えて

4

私はこの種のコードを単体テストすることはそれほど有益ではないことにあなたは同意しがちです。しかし、いくつかの有用なテストの範囲はまだあります。

ユーザーの読み取りクエリパラメータの検証を実行している場合は、無効な要求パラメータが適切な例外をスローし、有効なパラメータが許可されているかどうかをテストする必要があります。

ORMを使用している場合、マッピングコードをテストするには費用対効果の比が大きすぎます。あなたのORMがすでにテストされているとしたら、マッピングにエラーがあるかもしれませんが、すぐにORMを見つけて修正します。

また、同じテストフレームワークを使用していくつかのインテグレーションテストを作成すると、データベースに接続でき、ORM構成でマッピング例外が発生しないことがわかります。あなたは確かに実際のdbを照会する単体テストを書くことは望ましくありません。

1

私がこのユニットのようなものをテストしたことは、ユニットテストでデータベースのセットを作成し、ユニットテストを実行してから作成したものを取り除くことです。

これまでの仕事の1つでは、オブジェクトとその関係を記述するためにデータ構造を使用してこの設定を非常にきれいに設定しました。これはORMを介して実行され、これらのオブジェクトを作成しました。それらのデータはクエリに使用され、ORMはオブジェクトの削除に使用されました。単体テストでこれらの値をオーバーライドしなかった場合に使用するすべてのクラスの既定値を簡単に設定できるようにする。次に、単体テストのデータ構造は、デフォルト以外の値を指定するだけで済みました。これにより単体テストのセットアップははるかにコンパクトになりました。

これらの単体テストは非常に便利で、データベースのやりとりにいくつかのバグがありました。

+0

提案していただきありがとうございますが、それは厳密に単体テストではなく、統合テストです。私の開発マシンでは、そのためのオーバーヘッドが本当に必要ではありません。 –

0

私のasp.net mvcアプリケーションでは、私もsqrcを適用しました。しかし、SQLと 'ADO.NETクエリ'または 'Linq'の代わりにdocument database(mongodb)を使用し、各コマンドまたはイベントハンドラはデータベースを直接更新します。

私は1つのコマンド/イベントハンドラに対して1つのテストを作成しました。 100%単体テスト後、私のドメイン作業は95%正しいことがわかります。 しかし、アクション/コントローラ/ UIについては、私は(seleniumを使用して)UIテストを適用しました。

ドメイン(コマンド/イベントハンドラとデータベースへの直接更新)の両方のユニットテストで、uiが「統合テスト」をテストしているようです。

すべてのロジックがコマンド/イベントハンドラでカプセル化されているため、少なくともドメイン部分をテストする必要があると思います。

FYI:私はまた、ストアドプロシージャを使用してデータベースに直接更新するよりも、エンティティフレームワークからドメインパートを開発し始めましたが、ドキュメントデータベースには本当に満足していました。私はいくつかの異なる文書データベースを試しましたが、mongodbは私のために最もよく似ています。

2

おそらくすでにわかっているように、単体テストは、コードカバレッジとバグを防ぐことは、それが良いデザインよりも少ないことが分かっています。私が急いでいるときに、読まれたモデルのイベントハンドラをテストすることをしばしばスキップしていますが、コードがTDDにされるべきすべての理由のためにおそらく実行されるはずです。

HTTPアクションのユニットテストもしていません(私はNancyではなく.NET MVCを使用しているので、コントローラ自体はありません)。

これらは統合ポイントであり、ほとんどがコマンドハンドラとドメインモデルにカプセル化されているため、多くのロジックを含む傾向はありません。

これらをテストしないとかなり簡単だと思う理由は、それらが非常に単純で非常に繰り返し的であるため、読み取りモデルへのイベントの非正規化には深い考えがほとんどないからです。私のHTTPハンドラーでも、要求を処理してドメインにコマンドを発行するだけで、クライアントへの応答を返すための基本的なロジックがあります。

私はTDDを使用していた場合、このコードで間違いを犯すことがよくありますが、これらのミスははるかに少なくなりますが、ずっと時間がかかり、これらの間違いは見つけやすくなります。

私はまだTDDを適用しなければならないと言いますが、それでもまだ非常に疎結合しているので、テストを書くのは難しくありません。コントローラにコードの臭いを示す可能性のあるテストを書くのが難しい場合は、

2

良い正規化されていない読み込みモデルを作成する場合は、読み込みの90%〜99%を実行してくださいユニットテストが必要です。

私は、CQRSアプリケーションをTDDにする最も効果的で効率的な方法は、コマンドをドメインにプッシュする統合テストを作成し、クエリを使用してアサーションのDBからデータを取り戻すことです。

関連する問題