2017-12-13 21 views
4

MSTestを使用して統合テストをセットアップしました。私の統合テストは、偽のデータを作成してデータベースに挿入します(実際の依存関係)。私はすべて偽物[AssemblyCleanup]でクリーンアップガベージデータの統合テスト

public static EventAction Mock() 
{ 
    EventAction action = Fixture.Build<EventAction>().Create(); 
    action.Add(false); 
    AddCleanupAction(action.Delete); 
    AppendLog("EventAction was created."); 
    return action; 
} 

public static void CleanupAllMockData() 
{ 
    foreach (Action action in CleanUpActions) 
    { 
     try 
     { 
      action(); 
     } 
     catch 
     { 
      AppendLog($"Failed to clean up {action.GetType()}. It is possible that it was already cleaned up by parent objects."); 
     } 
    } 
} 

すべてのビジネス・オブジェクトのために、私は「偽」を作成し、DBに挿入し、このような方法を、持っています今、大きな問題があります。私の継続的な統合環境(TeamCity)では、テスト用に別々のデータベースを用意しており、テストを実行するたびに自分自身をクリーンアップしますが、ローカル環境では、さて、何らかの理由でテストをキャンセルすると、CleanupAllMockData()が呼び出されないため、ローカルデータベースにガベージデータが残ってしまいます。

これを処理する最善の方法は何ですか?私はMSTestのテストキャンセルを傍受する方法を見つけることができませんでした。

+0

すべてのテストの後でCleanupAllMockData()を実行できますか? – Kris

+0

@Kris、最初は、[TestCleanup]で実行していましたが、パフォーマンスに悪影響を与えました。試運転は20分〜6分かかりましたが、もう一度、私がテストをキャンセルすれば、偽物はきれいにならないでしょう。 –

答えて

1

私はあなたの問題を解決するための2つのオプションを参照してください。それぞれの開始前に

  1. クリーンアップモックデータを。始める前に。
  2. 各テストは、コミットされないdb-transactionとしてラップされます。私は説明します このオプションhere
+0

次のシナリオで2番目のアプローチが機能しますか? DBにレコードの束を追加して、それらのレコードを選択してアサートする必要があります。 –

+0

@ShervinShahrdar、はい。はい、1つのテスト方法の中で動作します。トランザクションのロールバックは、メソッドが終了した後、すなわちアサート・ブロックの後に行われる。テストメソッドの間に追加された行を保存する必要がある場合、 'SetUp'メソッドと' TearDown'メソッドで同様のものを実装する必要があります –

+0

私は両方の提案を試みました。もう1つは何らかの理由でパフォーマンスの問題があり、データのコミットが必要なためテストの一部が失敗していました。私は最初の選択肢に行くことになった。しかし、実際の偽のオブジェクトを削除する前に、偽のデータクリーンアップコードを最適化してから、まずすべての依存関係を削除する必要がありました。パフォーマンスは現在受け入れられています。 –