私たちはかなり大きなカジノ/ゲーム/財布/宝くじのプラットフォームに取り組んでいます。これは、4つのクライアントで現在使用されているターンキーアプリケーションであり、間もなくさらに多くの機能を提供します。以下のアーキテクチャに関していくつかの箇条書きを行いました。
いくつかの単体テストが実施されていますが、それは主にインフラストラクチャ関連のものです。ビジネス機能をテストするテストはそれほど多くありません。もう1つの問題は、手間のかかる作業の多くがストアドプロシージャで行われることです。回帰を防ぐために、コードの一部をリファクタリングする前に、いくつかの単体テストを追加するときがきました。私が探しているのは、これに対処するためのさまざまな方法のリストです。これは私がこれまでに思いついたものです:
SqlTransaction
を作成し、破棄されるとRollback
を呼び出して破棄するEFデータコンテキストの新しいオーバーライドを作成します行われたすべての変更私が持っている計画は、いくつかの優れたテストを作成することです。カードに多くのリファクタリングが含まれていない場合は、QA担当者に、すべてを設定しながら作成された例に基づいてテストを作成することでプログラミングを学んでもらいます。
大規模なプロジェクトに単体テストを追加するにはどうすればよいですか?データベース内のストアドプロシージャを呼び出すテストプロシージャをどのように処理する必要がありますか? 私が知りたいのは、多くのリファクタリングなしで単体テストをシム化するための最良の方法です。このコードベースをリファクタリングしてデータレイヤーを分離することは、一部のスポットでは難しくありませんが、他のスポットではやりにくいので、摩擦が最も少ない方法が最善です。
ストアドプロシージャとそれを使用するC#コードは異なるユニットであるため、1つのユニットテストで両方をテストすることはできません。個別の単体テストが必要です。
両方の箇条書きの単体テストでは、C#コードとストアドプロシージャの間のインターフェイスは同じままであると想定しています。しかし、リファクタリングを計画している場合は、そのインターフェースをリファクタリングする可能性が高いでしょう。ユニットテストはあなたを保護しません:インターフェースが変更された場合、両方のモックは古くなっており、テストを書き直す必要があります!
単体テストに焦点を当てるのではなく、統合テストにさらに焦点を当てるべきであることをお勧めします。つまり、1つのテストでC#コードとそれが使用するストアドプロシージャの両方をテストできます。これは、データベース(データのみ)をモックする必要がないため、テストの作成がはるかに簡単になることも意味します。
各テストでトランザクションを使用できるかどうかを確認してください。 BEGIN
テストを開始する前のトランザクション、およびテストの後でROLLBACK
トランザクション。そうすれば、テストごとにデータベースにデータを再入力する必要がなくなります。セッションのすべてのテストで同じ初期データベースが使用され、フレームワークはその後にクリーンアップします。