0

私はプロジェクトのテスト環境に取り組んでおり、DbUnit.NET を使用して多くのデータベース相互作用テストを行うことを検討しています。ただし、非常に大きな質問が 1 つあります。

私たちは Oracle に対して実行しており、開発者ごとに個別のテスト DB インスタンスを設定することは実際には現実的ではありません (特に、すでに時間に縛られている DBA が 1 人しかいないため)。これは、すべての開発者と継続的インテグレーション サーバーがすべて同じ DB スキーマを使用する必要があることを意味します。

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

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

4

3 に答える 3

1

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

于 2009-07-30T00:14:55.640 に答える
1

共有データベースで多数の開発者に対してデータベース テストを実行したとき、ロック トークンとして 1 つのレコードを持つダミー テーブルを使用しました。実際には、1 つのテスト ケースを実行したい開発者がスイート全体を実行している別の開発者が完了するのを待つ必要がないように、各テスト ケースのロックを個別に取得しました。各テストに独自のデータを設定しました - テスト方法間での持ち越しはありません。

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

私たちが問題に遭遇した唯一の場所は、開発者がデバッグ モードでテストを実行しようとしたときでした。そうすれば、彼がデバッガーをリリースするまで、テストを実行したい他の開発者をブロックすることになります。現在のユーザーの名前をダミー テーブルに書き込み、30 秒以上ブロックされた場合にロック メカニズムにメッセージを出力させました。

これは問題ありませんでしたが、維持するのは大変な作業でした。データベース テストの数を少なくし、ほとんどのテストをメモリ内の純粋な単体テストとして実行するようにしました。

于 2009-07-30T00:35:39.870 に答える
0

これといくつかの類似点がある問題で私がしたこと:

プログラムには、関連するすべてのアイテムの前に追加された構成変数がありました。各ステーションには独自の設定があり、適切に設定されていれば競合は発生しません。

于 2009-07-30T00:46:24.107 に答える