2017-10-16 5 views
3

Visual Studioの組み込みユニットテストツールを使用してC#プロジェクトの単体テストを作成していますが、これらのテストの多くはファイルTestData.xlsxを使用する必要があります。同じファイルリソースに依存する単体テストを安全に記述しますか?

現在、私がテストを実行したとき、私は、前回のテストでは、次回のテストで使用するためにファイルを保持していないことに気付いています。これにより、テストが失敗します。これを防ぐためにテストを書くにはどうすればいいですか?ここで

は私が扱ってるものの例である:

[TestClass] 
    public class ExcelWorksheetExtensionTests 
    { 
     private ExcelPackage excelPackage; 

     private ExcelWorksheet excelWorksheet; 

     [TestInitialize] 
     [DeploymentItem(@"Assets\TestData.xlsx")] 
     public void TestInitialize() 
     { 
      FileInfo fileInfo = new FileInfo(@"Assets\TestData.xlsx"); 
      this.excelPackage = new ExcelPackage(fileInfo); 
      this.excelWorksheet = this.excelPackage.Workbook.Worksheets["Sheet1"]; 
     } 

     [TestCleanup] 
     public void TestCleanup() 
     { 
      this.excelPackage.Dispose(); 
     } 

     // This test may succeed... 
     [TestMethod] 
     public void TestGetRowIndexForExistingName() 
     { 
      Assert.AreEqual(this.excelWorksheet.GetRowIndex("Object49").Value, 6); 
     } 

     // ...But this test will fail because TestInitialize re-runs too quickly. 
     [TestMethod] 
     public void TestGetRowIndexForMissingName() 
     { 
      Assert.IsFalse(this.excelWorksheet.GetRowIndex("NonExistentName").HasValue); 
     } 
    } 
+0

「ExcelPackage」とは何ですか? 'IDisposable'を実装していますか? – Lee

+0

その場合、テストティアダウンメソッドで 'excelPackage'を処理する必要があるようです。 – Lee

+0

@Lee ExcelドキュメントとやりとりするためのEPPlusというライブラリのクラスです。良いキャッチ; Dispose()を呼び出すTestCleanupメソッドを追加しました。しかし、私はそれらが並行して走っていると信じているので、テストはまだ失敗します。 –

答えて

2

私はEPPlusとあまり慣れていないんだけど、私は見ることができるものからすると、共有リソースExcelWorksheetを持っており、それが始まりだということです各テストでは異なるスレッドからアクセスされます。クエリ呼び出しがスレッドセーフであるかどうかを確認する必要がありますか?

使用している「EPPlus」のバージョンはわかりませんが、最新バージョン(4.1.1)ではGetRowIndexという機能はありませんが、次のようにテストを改善しました:

[TestClass] 
public class ExcelWorksheetExtensionTests 
{ 
    private FileInfo _fileInfo; 

    [TestInitialize] 
    public void TestInitialize() 
    { 
     _fileInfo = new FileInfo(@"C:\Test.xlsx"); 
    } 

    // This test may succeed... 
    [TestMethod] 
    public void TestGetRowIndexForExistingName() 
    { 
     using (var excelPackage = new ExcelPackage(_fileInfo)) 
     { 
      var excelWorksheet = excelPackage.Workbook.Worksheets["Sheet1"]; 
      Assert.AreEqual(excelWorksheet.GetValue(1, 1), 6.0); 
     } 
    } 

    // ...But this test will fail because TestInitialize re-runs too quickly. 
    [TestMethod] 
    public void TestGetRowIndexForMissingName() 
    { 
     using (var excelPackage = new ExcelPackage(_fileInfo)) 
     { 
      var excelWorksheet = excelPackage.Workbook.Worksheets["Sheet1"]; 
      Assert.IsFalse(excelWorksheet.GetValue(1, 1) == null); 
     } 
    } 
} 

は今、各テストは、それが今ExcelWorksheetのインスタンスだと、以前の共有リソース上の潜在的な競合状態が両方のテストは今見事に合格して排除されています。

+0

ありがとう、これは動作します。混乱を避けるため、 'GetRowIndex()'は自分自身を追加した拡張メソッドでした。 –

関連する問題