2009-07-30 24 views
0

私はプロジェクトのテスト環境で作業しており、DbUnit.NETを使用して多くのデータベース対話テストを行っています。DbUnit複数のテストが同時に実行されるのを防ぐ方法を教えてください。

私たちはOracleに対して実行しており、開発者ごとに別々のテストDBインスタンスを設定することは実際には不可能です(特に、DBAが1人しかいないため) 。これは、すべての開発者とContinuous Integrationサーバーがすべて同じDBスキーマを使用する必要があることを意味します。

質問:1人以上の人が同時にテストするのを防ぐ良い方法はありますか?テストが実行されていることを示すレコードをdbテーブルに格納しておき、テストが終了したら削除しますが、NUnitはテストセッションの開始時と終了時に何かを実行する方法がありません。

他の考えはありますか?それはかなり一般的な問題であるように思われる...または誰もがテストを実行する可能性のあるすべての開発者/テスターのために実際に別々のDBインスタンスを実行していますか?

答えて

1

私たちは、共有データベース上の多数の開発者のデータベーステストを実行したときに、単一のレコードを持つダミーテーブルをロックトークンとして使用しました。実際には、個々のテストケースごとにロックを取得しているため、1つのテストケースを実行する開発者は、スイート全体を実行している別の開発者が終了するまで待つ必要はありません。私たちは、それぞれのテストを独自のデータに設定しました。テスト方法間で繰り越されることはありません。

データベースのロック機構を使用して、他の誰かが既にテストを実行しているときに失敗するのではなく、実際にテストをキューに入れました。私はオラクルのロックアルゴリズムは少し違うと思うので、どのように動作するのかわかりません。

問題が発生したのは、開発者がデバッグモードでテストを進めたいときだけでした。デバッガをリリースするまで、テストを実行したいと思っていた他の開発者をブロックすることになります。現在のユーザーの名前をダミーのテーブルに書き込んで、ロック機構が30秒以上ブロックされた場合はメッセージを表示します。「Bobは現在テストを実行しており、過去5分間ありました」

これは問題ありませんでしたが、維持する作業が多かったです。私たちは、データベーステストの数を少なく抑えようと努力しました。そして、私たちのテストの大半はメモリ内の純粋なユニットテストとして実行しました。私はこの1つに、いくつかの類似点を問題にしなかった

+0

これは基本的に私がやると思ったものです。私の大きな問題は、たくさんのレガシーpl/sql(かなりの10k行以上)を処理していて、ほぼすべてのテーブルでトリガしており、現在はすべてテストされていないということです。だから私はOracleとそのトリガとsprocsを通過する必要があります。そうでなければ、メモリ内のSQLite DBなどを試してみたいと思います。 – CodingWithSpike

1

[TestFixtureSetUp]属性を使用して、 "真の"セマフォをシミュレートする方法としてテストが実行されていることを示すフラグを挿入できます。

0

何か:

プログラムは、すべての関連する項目の前に追加されたコンフィギュレーション変数を持っていました。各駅はそれ自身の設定を持っていた、適切に設定されて競合がないでしょう。

関連する問題