2009-04-20 17 views
9

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

ここに私たちの現在の状況があります:ユニットテスト環境でうまくいくいくつかの単体テストを持つ.net Webプロジェクトがあります。各テストは[SetUp]でトランザクションをオープンする親クラスを継承し、トランザクションを[TearDown]に戻します。各テストの後、ユニットテストデータベースは元の状態に復元されます。

ただし、統合環境に移行すると状況は変わります。私たちの継続的な統合サーバーはコミットを自動的にコンパイルし、テストサーバーにプッシュします。そのため、サーバーは常に最新のコードで実行されます。また、サイトとのユーザーのやりとりを自動化するためにSeleniumインスタンスをセットアップしました。セレンテストは、基本的には既存のSeleniumサーバーと通信し、サーバーには「ブラウザを起動してhttp://testsite/TestPage.aspxに行きます」というメッセージが表示されます。「def」というIDを持つフォームフィールドに「abc」というテキストを入力します。

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

私たちはまだこのための良い解決策にはなりません。今、SqlCommandを使用してデータベースをバックアップするSQL文を実行し、テストの最後にデータベースをシングルユーザーに設定し、現在のdbを削除してから、リストアするこれは理想的ではありません。なぜなら、これはDBに接続されたアプリケーションを効果的に削除し、アプリケーションを再初期化する必要があるからです。

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

ありがとうございます!

答えて

3

すべてのテストの前に、ドロップ/作成テーブルスクリプトを実行しています。これは非常に高速で、以前のテストから何も残されていないことを保証します。

PS:私たちはこのスクリプトを即座に作成し、メモリ内のSqlite上でテストを実行するNHibernateを使用しています。これは光速です。しかし、SqlServerに切り替えるとまだかなり高速です。

+0

おかげでステファン、 これが最善の解決策であるように思わ - 我々だけで切り捨てテーブルに頼っとしまし再読み込みをすべてのテストの後の備品は、実際には*課税されていません。それはうまくいくようです。 もう一度おねがいします! – matt

+1

この操作をロールバックできないため、oracleでの切り詰めは非常に高速です。スクリプトは私たちの状況では簡単で、スクリプトはすでに利用可能で、他のものを保守する必要はありません。 –

+0

このスクリプトは、すべてのテストメソッドまたはテストケースの前に実行されますか?私はすべてのテストメソッドを仮定します....また、このスクリプトはどのように実行されますか?あなたはバックエンドにサービスAPIを持っていますか? – HDave

3

これは難しい問題です。このソリューションは、通常、すべてのアプリでユニークです。主要なフレームワークが「推奨されるアプローチ」を採用するまでは、これは引き続き苦痛である。

私のベスト・プラクティス:アプリの初めにこの使用法を計画してください。 DBがアプリケーションの下からリセットされた後にクリーンアップするAPIをインクルードします(つまり、キャッシュをリセットします)。