2017-10-16 52 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這是一個名爲EPPlus的類庫,用於與Excel文檔進行交互。接得好;我添加了一個調用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()'是我自己添加的擴展方法。 –