2014-12-29 104 views
6

請注意:我不是在徵求您的意見。我在詢問約定。我應該有失敗的測試?

我只是想知道我是否應該通過合適的方法名稱,如Should_Fail_When_UsageQuantityIsNegative(),Should_Fail_When_UsageQuantityMoreThan50(),Should_Pass_When_UsageQuantityIs50()這兩個合格的測試。

或者相反,我應該編碼他們通過並保持所有的測試通過條件?

謝謝! 乾杯!

+6

所有測試都應通過。如果某件事情應該失敗,你的測試應該測試失敗(因此,通過)。 – Donovan

+0

「失敗」是什麼意思? – Raedwald

+0

可能的重複http://stackoverflow.com/questions/7338334/should-i-unit-test-with-data-that-should-not-be-passed-in-a-function-invalid-in – Raedwald

回答

12

當你創建單元測試時,他們都應該通過。這並不意味着你不應該測試「失敗」的情況。這意味着測試應該在「失敗」時通過。

這樣,您不必經過(最好)大量的測試,並手動檢查是否通過了正確的測試。這幾乎違背了自動化的目的。

正如Mark Rotteveel在評論中指出的那樣,只是測試失敗的東西並不總是足夠的。確保失敗是正確的失敗。例如,如果您使用的是錯誤代碼,並且error_code等於0表示成功,並且您想確保發生故障,請不要測試error_code != 0;相反,測試例如error_code == 19或任何正確失敗的錯誤代碼是。

編輯

還有一個額外的問題,我想補充。雖然您部署的代碼的最終版本不應該有失敗的測試,但確保您正在編寫正確代碼的最佳方法是在之前編寫代碼,然後編寫其餘代碼。在對源代碼進行任何更改之前,編寫一個單元測試(或理想情況下,幾個單元測試),現在應該失敗(或無法編譯),但在更改完成後通過。這是確保您編寫的測試正在測試正確的事情的好方法。所以,總結一下,你的最終產品不應該有失敗的單元測試;但是,軟件開發流程包括您已編寫尚未通過的單元測試的時期。

+1

謝謝堆!這解釋得很好。 –

+2

還要確保以正確的方式測試它失敗。 –

+0

@MarkRotteveel偉大的一點! – Daniel

5

除非您的程序採取的行動方式不符合您的要求,否則您不應該有失敗的測試。

如果您的程序的目標行爲是失敗,並且失敗,那麼應該觸發測試通過。

如果程序在應該失敗的地方通過,那麼該部分代碼的測試應該失敗。

總之,除非所有測試都通過,否則程序無法正常工作。

+1

感謝堆!抱歉,我只能標記一個答案爲正確的答案,因此投了你的答案。 –

2

正如其他人所指出的,你永遠不應該有失敗的測試,這就違背了自動化的目的。您可能需要的是在輸入不正確時驗證代碼正常工作的測試。看你的例子Should_Fail_When_UsageQuantityIsNegative()是一個測試,應該通過,但你所做的斷言取決於什麼失敗手段。

@Test(expected = IllegalArgumentException.class) 
public void Should_Fail_When_UsageQuantityIsNegative() { 
    // code to set usage quantity to a negative value 
} 
+1

感謝堆!抱歉,我只能標記一個答案爲正確的答案,因此投了你的答案。 –

1

有幾種不同的方式來解釋問題,如果測試失敗了:例如,如果你的代碼時,應該使用量是負的,那麼你可能有這樣的測試拋出IllegalArgumentException

Should_Fail_When_UsageQuantityMoreThan50()這樣的測試應該是一個通過測試,它會檢查相應的錯誤是否被拋出。 Throws_Exception_When_UsageQuantityMoreThan50()等。許多測試套件都有特殊的測試異常工具:JUnit's expected parameter和Perl模塊,例如Test::Exception,甚至可以是test for warnings

在開發過程中測試失敗,這意味着他們正在做他們的工作。您應該懷疑從未失敗的測試套件,它可能覆蓋範圍很差。失敗的測試將捕獲開發人員或測試或代碼對公共行爲,錯誤和其他錯誤的更改。但是當承諾和推動時,測試應該回到傳球。

最後,有合法的情況下,您有一個已知的錯誤或缺少功能,目前無法修復或實施。有時候錯誤會偶然修正,所以最好爲它編寫一個測試。當它通過時,你知道bug已經修復,並且當它開始傳遞時你想要一個通知。不同的測試系統允許您編寫預計會失敗的測試,並且只有在它們通過時纔可見。在Perl中,這是TODO or expected failure。 POSIX有很多結果,例如UNRESOLVED, UNSUPPORTED and UNTESTED來涵蓋這種情況。

+1

哇!這樣的信息答案。感謝堆!我很感激並學到了很多東西。我已經標記了第一個回答爲正確答案的人,因此將投票給您的答案。 –