11

Selenium などの統合テスト フレームワークから作成されたデータベース トランザクションをロールバックするためのベスト プラクティスまたは推奨される方法について、誰か提案はありますか?

現在の状況は次のとおりです。ユニット テスト環境で正常に動作する多数のユニット テストを含む .net Web プロジェクトがあります。各テストは、[SetUp] でトランザクションを開く親クラスを継承し、トランザクションをロールバックします。 [ティアダウン]。各テストの後、単体テスト データベースは元の状態に復元されます。

ただし、統合環境に到達すると状況が変わります。当社の継続的インテグレーション サーバーは、コミットを自動的にコンパイルしてテスト サーバーにプッシュするため、サーバーは常に最新のコードで実行されます。また、Selenium インスタンスをセットアップして、サイトとのユーザー インタラクションを自動化しました。Selenium テストは基本的に既存の Selenium サーバーと通信し、サーバーに次のように伝えます。「ブラウザーを起動してhttp://testsite/TestPage.aspxに移動し、id が「def」のフォーム フィールドにテキスト「abc」を入力します。アサートします。新しいページにテキスト 'xyz' が含まれています"

各テストはバニラ単体テストと同様の方法で実行されますが、重要な例外があります: Selenium によって行われた変更は、完全に異なるスレッド/アプリケーションで行われるため、できません (私は *できないと思います.少なくとも) テスト ティアダウンでそれらをロールバックします。

これに対する適切な解決策はまだ見つかっていません。現在、SqlCommand を使用して sql ステートメントを実行し、データベースをバックアップしています。テストの最後に、データベースをシングル ユーザーに設定し、現在のデータベースを削除して復元しています。古いコピー - これは理想的とは言えません。これは、DB にアタッチされたアプリケーションを事実上強制終了し、アプリを再度初期化する必要があるためです。

これは以前に解決された問題ですか?どんなアドバイスも素晴らしいでしょう。

ありがとう!

4

3 に答える 3

4

すべてのテストの前に、drop/create-table スクリプトを実行しています。これは非常に高速で、以前のテストから何も残っていないことが保証されます。

PS: このスクリプトをオンザフライで作成し、メモリ内の Sqlite でテストを実行する NHibernate を使用しています。これは非常に高速です。しかし、SqlServer に切り替えても、それでもかなり高速です。

于 2009-04-20T16:18:41.533 に答える
3

これは難しい問題であり、解決策は通常、アプリごとに異なります。主要なフレームワークが「推奨されるアプローチ」を採用するまで、これは苦痛であり続けるでしょう。

私の最善の推奨事項: アプリの開始時にこの使用法を計画してください。DB がアプリの下からリセットされた後にクリーンアップする API を含めます (つまり、キャッシュのリセット)。

于 2009-04-26T18:21:29.273 に答える
2

このシナリオ専用に設計されたAmnesia (詳細ドキュメント最近のコード)というプロジェクトがあります。これにより、MSDTC TransactionScope を使用してテストの変更をロールバックするプロセスが簡素化されます。(使用するには、ほとんどのアプリケーション、特にまだ MSDTC を使用していないアプリケーションで、データ アクセスに中程度の侵襲的な変更が必要になります。)

于 2011-12-06T19:38:33.870 に答える