簡體   English   中英

如果找不到csv文件,則跳過單元測試

[英]Skip unit test if csv file not found

我有許多依賴於csv文件存在的單元測試。 如果此文件顯然不存在,它們將拋出異常。

是否有任何Gallio / MbUnit方法可以有條件地跳過測試運行? 我正在運行Gallio 3.1並使用CsvData屬性

[Test]
[Timeout(1800)]
[CsvData(FilePath = TestDataFolderPath + "TestData.csv", HasHeader = true)]
public static void CalculateShortfallSingleLifeTest()
{
    .
    .
    .

謝謝

根據這個問題的答案,如果文件丟失,你需要創建一個調用Assert.Inconclusive的新TestDecoratorAttribute

Assert.Inconclusive非常適合您的情況,因為您並不是說測試通過或失敗; 你只是說它無法在當前狀態下執行。

你在這里所擁有的不是單元測試。 單元測試測試單個代碼單元(雖然可能很大),並且不依賴於外部環境因素,如文件或網絡連接。

由於您依賴於此處的文件,因此您所擁有的是集成測試。 您正在測試您的代碼是否安全地與代碼控制之外的東西集成,在本例中是文件系統。

如果這確實是一個集成測試,那么您應該更改測試,以便測試您實際需要測試的內容。

如果您仍然將此視為單元測試,例如您正在嘗試測試CSV解析,那么我將重構代碼,以便您可以模擬/存根/偽造CSV文件內容的實際讀取。 這樣,您可以更輕松地向CSV解析器提供測試數據,而不依賴於任何外部文件。

例如,您是否考慮過:

  • AntiVirus程序包可能無法立即訪問該文件
  • 典型的程序員工具,如TortoiseSvn,將shell覆蓋集成到資源管理器中,有時會長時間保存文件,並不總是允許文件訪問程序(您刪除了文件,並嘗試用新文件覆蓋它) ?當然,讓我先完成刪除操作,但是有一個程序保留文件所以可能需要一段時間......)
  • 該文件可能實際上並不存在(為什么會這樣?)
  • 您可能沒有該路徑的讀訪問權限
  • 您可能有錯誤的文件內容(從早期的調試會話中剩余?)

一旦你開始涉及外部系統,如文件系統,網絡連接等,有很多事情可能會出錯,你所擁有的基本上是一個脆弱的測試。

我的建議:找出你要測試的內容(文件系統?CSV解析器?),並刪除與該目標沖突的依賴項。

一種簡單的方法是在測試開始時包含if條件,如果可以找到CSV文件,則只執行測試中的任何代碼。

當然,這有一個很大的缺點,即測試是綠色的,盡管它們實際上並沒有運行和斷言。

我同意Grzenio,如果你有嚴重依賴外部條件的單元測試,他們並沒有真正幫助你。 在這種情況下,您永遠不會真正知道單元測試是成功運行還是剛跳過,這與單元測試的實際情況相矛盾。

在我個人看來,我只是編寫測試,以便在文件不存在時它們正確失敗。 如果它們失敗,則表明有問題的文件應該在運行單元測試的機器上可用。 這可能需要一些手動調整(將文件提供給相關的計算機或服務器),但至少你有可靠的單元測試。

Gallio / MbUnit v3.2中,抽象ContentAttribute及其具體派生類型(如[CsvData]有一個新的可選參數,允許在打開或讀取文件數據源時發生錯誤時更改測試的默認結果(參見問題681 )。語法如下:

[Test]
[CsvData(..., OutcomeOnFileError = OutcomeOnFileError.Inconclusive)]
public void MyTestMethod()
{
  // ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM