0

次の設定があります。

  • Visual Studio 2012/SQL Server 2012
  • TFS 2010、ビルド サーバーは、ビルド時に単体テストを自動的に実行します。
  • 多くのコードと 2 つのテスト プロジェクト (つまり、ビルド時に 2 つの個別のアセンブリ) を含むソリューションで、テストは Visual Studio の単体テスト フレームワークで実行されます。
  • 最初のアセンブリにはすべての実際の単体テストが含まれており、すべて正常に実行されます。ほとんどのテストでは、データベースにデータを書き込み、コードを実行してから、データを消去します。
  • データベースのシード処理には 2 番目のアセンブリを使用します。テストとアセンブリはアルファベット順にロード/実行されるため、名前が "Z" で始まる 2 番目のアセンブリにテストがあります (アセンブリ名も "Z" で始まります)。ビルド サーバー ログは、Z テストが最後に実行されたことも確認します。したがって、このテストはデータベースに一部のデータのみを書き込みます。Excel ファイルからデータを読み取り、SQL Server に書き込む既存のインフラストラクチャのため、DB プロジェクトを使用するよりもシード処理にこれを優先しました。

問題は、開発マシンですべてのテストを実行すると、Z テストが最後に実行され、シード データがデータベースに残ることです。テストがビルドサーバーで実行されると、Z テストも最後に実行されますが、データは db に残りません。

SQL Server プロファイラーによると、テーブルの挿入/作成が実行されるため、マシンとビルド サーバーの両方でデータがデータベースに取得されますが、ビルド サーバーでは挿入の直後にいくつかの削除/削除クエリが実行されます。彼らがどこから来たのかはわかりませんでした。

Z テスト アセンブリのみを実行してみましたが、データはデータベースに残ります。したがって、ドロップは何らかの形で他のアセンブリによって引き起こされたに違いありません。しかし、どのように?Visual Studio とビルド サーバーでテストを実行する方法に違いがあるのはなぜですか?

誰もこのようなことに遭遇したことがありますか?

4

2 に答える 2

2

単体テストの順序によっては危険です。まず、単体テストの全体的な考え方に違反します (順序に依存しない必要があります) が、保証できないことでもあります。

開発マシンで単体テストが常に同じ順序で実行されるのは偶然です。

他のテストを実行してデータベースをシードする前にコードを実行する必要がある場合は、Assembly Initialize属性を使用できます。このようにして、このメソッドが常に他のテストの前に実行されるようにすることができます。

データベースを使用する単体テストは、実際には統合テストです。このような構造を使用する場合は、非常に慎重になります。私はこれについて少し前にブログ記事を書きました。それはあなたが遭遇する可能性のある問題の種類を示すだけでなく、いくつかの解決策を示しています:単体テスト、地獄か天国か?

于 2013-02-11T08:16:23.870 に答える
0

最終的に修正することができました。最初のアセンブリには、[ClassCleanup] メソッドで実行されるクリーンアップ コードが含まれていることがわかりました。最初のアセンブリの ClassCleanup コードは、(2 番目のアセンブリからの) Z テストの後に実行されました。したがって、簡単な修正は、Z シード テストを、シードを行う [AssemblyCleanup] メソッドに置き換えることでした。

于 2013-02-11T09:49:26.747 に答える