簡體   English   中英

我應該強制例外來測試它們嗎?

[英]Should I force exceptions to test them?

我在我的數據訪問類中有這個方法,我有一個單元測試,以確保它正常工作,但我的測試不測試異常所以我的問題是我應該創建一個新的測試來強制引發異常或我應該相信catch塊在異常的情況下會正常工作嗎? 值得努力嗎?

這是一個例子:

public void UpdateProject(Project project)
    {
        using (var transaction = _session.BeginTransaction())
        {
            try
            {
                _session.Update(project);
                _session.Flush();
                transaction.Commit();
            }
            catch (HibernateException)
            {
                transaction.Rollback();
                throw;
            }
        }
    }

理想情況下,您應該嘗試測試您可以使用的每一行代碼......這將意味着強制發生異常以測試異常處理程序,並確保其正常工作。

在實踐中,總會有一些代碼行未被覆蓋 - 但是,我會通過模擬強制執行異常,以便測試任何您認為至關重要的異常處理程序,尤其是在生產中可能發生的異常處理程序。

在Linux內核中,驅動程序中80%的錯誤都在錯誤處理代碼中。

異常處理是許多錯誤的根源,您肯定應該測試所有異常路徑。

當然你無法測試每一行代碼。 但統計數據顯示程序員對異常處理的關注較少,因此您必須徹底測試它們。

以下是我對失敗行為進行理想測試的規則:

  • 如果您正在使用可能會拋出異常的依賴項 ,那么您應該包含單元測試,這些單元測試會使您的模擬程序拋出異常。
  • 如果在某些條件下你的代碼應該拋出異常,那么你應該包括設置這些條件的單元測試。

第一個讓你知道你的代碼在外部失敗時的行為,並經常導致重新考慮做什么。 在所有情況下,很高興看到實際發生的事情。 第二個只是確保你保留你所承諾的內容,只要你的代碼應該檢測到的錯誤並考慮異常。 它與測試代碼中的其他功能沒什么不同。

在考慮完成單元測試套件之前,應該先看看被測代碼的代碼覆蓋率 對於非平凡的代碼,我的代碼分支幾乎總是有一種方法,我的單元測試沒有覆蓋,或者更糟糕的是,我有不想要的行為。 令人驚訝的是,解決方案是刪除該代碼而不是添加更多測試。 只是在早些時候甩開它時留下了殘余物。

我不一定說應該達到100%的覆蓋率,但是應該進行代碼覆蓋驅動的單元測試,因為它是一種更直觀的方式來理解和暴露存在的代碼行為。 只需查看它就可以為您提供有關如何重構代碼以實現單一責任原則關注點分離的新想法。

你可以讓你的會話模擬拋出異常,但幾乎沒有必要測試一個catch是否有效。

如果更新引發異常但是在直覺級別上,我認為這樣做太過分了,那么編寫測試以檢查事務是否已回滾並沒有錯。

也許更精心的案例是值得的。

另外請注意,您是否不會回滾任何類型的異常?

如果在Commit()之前調用Displose(),我希望事務將是Rollback,因此你是否需要catch?

至於其他情況,如果你的捕獲更多,那么只記錄問題,我認為它應該是單元測試。 但是,不要讓事實上你不能做利潤單元測試阻止你做一些單元測試。

從異常名稱(HibernateException)我會認為這不是一個例外情況。 所以它可能在正常操作期間發生。 如果是這種情況,我會做一個導致異常的測試,以確保它得到妥善處理。

我當然會測試捕獲和處理的每個特定異常。 至少你有一些通過你的處理代碼的執行路徑,這應該給你一些安慰,當你在運行時遇到這樣的異常時,沒有別的奇怪的事情會發生。

請記住,您只需要測試您想要使用的代碼。

我當然希望你能單獨測試transaction.Rollback() ,測試會耗盡你能想到的所有可能情況。 但是,如果測試是詳盡無遺的,我可能不會費心提出異常,因為處理程序中沒有其他內容。

暫無
暫無

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

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