簡體   English   中英

我應該測試那些方法不會拋出異常嗎?

[英]Should I test that methods don't throw exceptions?

我正在進行單元測試的第一步,並編寫了(以及其他)這兩種方法:

    [TestCase]
    public void InsertionSortedSet_AddValues_NoException()
    {
        var test = new InsertionSortedSet<int>();

        test.Add(5);
        test.Add(2);
        test.Add(7);
        test.Add(4);
        test.Add(9);
    }

    [TestCase]
    public void InsertionSortedSet_AddValues_CorrectCount()
    {
        var test = new InsertionSortedSet<int>();

        test.Add(5);
        test.Add(2);
        test.Add(7);
        test.Add(4);
        test.Add(9);

        Assert.IsTrue(test.Count == 5);
    }

真的需要NoException方法嗎? 如果要拋出異常,它也將被拋出CorrectCount方法。

我傾向於將它保留為2個測試用例(可能將重復的代碼重構為另一種方法)因為測試應該僅測試單個事物,但也許我的解釋是錯誤的。

用最簡單的話來說,IMO測試哪種方法不會做得很滑,因為你可以在想到它時提出越來越多的場景。 反過來說,斷言你的代碼完成你打算做的事情就是單元測試的目的。


有兩個簡單的問題,通常可以幫助我發現可疑的測試並解決測試是否有任何意義:

  • 所需功能的哪一部分是測試鍛煉?
  • 我可以在測試類中進行哪些簡單的更改來打破測試?

請注意,處理那些考慮了第二次測試( _CorrectCount )的問題非常容易 我們還沒有真正看到Add方法代碼,但我們很可能會產生不錯的猜測,可以改變什么來打破這個測試。 經過測試的功能更加明顯。 答案很直觀,看起來很快(這很好!)。

現在讓我們嘗試回答第一個測試的問題( _NoException )。 它立即提出了新的問題( 工作代碼是否是一個實際的功能?是不是很明顯?這不是暗示嗎?這不是我們一直在努力的嗎?為什么最后沒有斷言?我怎么能讓它失敗? ? )。 對於第二個問題,情況更糟 - 打破那個測試可能需要明確地拋出異常......我們都同意這不是要走的路。

結論

很簡單。 第二次測試是精心編寫的單元測試的完美示例。 它很簡單,它測試單一的東西,它可以很容易想出來。 第一次測試不是 即使它只是簡短而且(似乎是)簡單,它引入了新的問題(雖然它確實應該回答已經說明的問題 - Add實際上是否Add ?是的。 ) - 結果帶來了不必要的復雜性。

更有意義的是,制作一個方法來測試被測方法在您期望它時會拋出異常。 您所做的第一個測試沒有斷言第二個測試沒有涵蓋的行為。

我總是測試工作和非工作案例。 這樣,您可以驗證代碼是否有效,返回正確的結果,以及以預期的方式處理錯誤。

Imo,如果你確定在InsertionSortedSet列表工作(我不知道它來自哪里),我會跳過測試InsertionSortedSet_AddValues_NoException ,如果有必要的話。

當然,最好盡可能多地進行測試。

這里沒有100%正確答案。

一方面你是對的,一個測試應該測試一件事。
在其中一個測試將來可能會發生變化的情況下尤其如此,然后您將無法確定是否要檢查其他測試是否通過。

另一方面,您正在創建冗余,因為兩個測試實際上都檢查了相同的事情。
這種冗余只有在您的測試需要花費太多時間才能運行的情況下才會出現問題,但由於(看起來像)您只進行了一些測試,因此這不應該是一個問題。

在第一次測試中沒有斷言或預期的異常,我認為它應該被重構。

IMO,一個測試應該檢查不正確的行為(期望拋出錯誤),另一個測試應該檢查正確的行為(沒有異常,返回好的值)。

暫無
暫無

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

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