2011-07-12 67 views
3

我們在一些財務軟件中使用(可執行)規格和單元測試。規範涵蓋了商業行爲,單元測試涵蓋了代碼。我們也使用其他測試方法,例如自動化集成測試等,但這不是我在這裏問的。是否有意義編寫單元測試以完全覆蓋規範?

有時我會編寫代碼,它的本質是,我知道 - 總是會 - 完全覆蓋規範,因爲它是核心業務功能。一個例子是舍入規則。

在這些時候,我之間想要編寫單元測試之間存在衝突(因爲感覺業務需求可能會發生變化,即使看起來像上例一樣,就像永遠會成爲問題的事情一樣)感覺我正在浪費時間寫下「冗餘」的單元測試。

有沒有人找到這麼好的經驗法則?

回答

2
...速度在這種情況下不是問題。可執行規格和單元測試都很快,實際上可以作爲一個單元運行;規格被包裹在單元測試,讓他們都跑起來...

據我瞭解上述表示,除了可執行規範有單元測試將在發現錯誤更快忍不住了,對嗎?

那麼考慮到,拇指,想到的唯一規則是看它從一些未來的維護者的觀點。你知道,那個不認識你的人,那個不會分享你當前知識的人 - 一個剛剛得到你的代碼處理的人。如何讓這個人的生活更輕鬆?

讓我們來看看...

  • 如果我選擇寫複製單元測試,這可能會混淆我想象未來的維護者。 「爲什麼哦,爲什麼這個白癡寫了重複的測試?他在想什麼?」

  • 如果我決定簡單地跳過單元測試,這也可能會造成混淆。 「哦,這不是單元測試所涵蓋的,爲什麼會這樣?是因爲它已經被一些可執行規範覆蓋了,或者因爲有人忘記了在這裏寫單元測試?」

在這兩種情況下,問題似乎是我沒有透露我的意圖。我沒有表達出我爲什麼要這樣做的原因。解決方案是分別找到一種方式來表達我的意圖。爲此,我會使用註釋或自我解釋代碼,如

assertTrue("missing unit test", BusinessKnowledge.okToRelyOnSpecTests()); 
    // make okToRelyOnSpecTests return false if you find it to be... well, false 

是否使用註釋或代碼可能是個人偏好的問題。或者是團隊習慣/做法的問題。只要保持一致,不要混淆 - 遵循同樣的經驗法則「不要混淆未來的維護者」。

我們不希望這傢伙花費不眠之夜試圖找出隱藏的原因爲什麼有些部分是由註釋覆蓋而其他是由代碼服務我們呢? :)

1

您的規格是否可執行?如果不是,你需要自動化測試(無論我們在談論單元測試還是驗收測試)。

+0

是的,規格是可執行的,我們也有自動化集成測試。 –

0

測試的主要功能之一 - 特別是單元測試,但不是唯一的 - 是確定代碼實際符合規範。如果您不測試,您如何確定生產的系統能夠滿足要求?測試從不浪費,只要它不是已經完成,無效的以前測試的重複。也可以開發目標重點 - 哦,我知道代碼已經/將被測試 - 我不需要打擾。這是古老的,經常是愚蠢的管理說 - 假設你和我的屁股。

編輯 規格包裝在單元測試中的附加信息;你的規格是可執行的;並且你有自動集成測試;確實意味着在某些情況下,編寫額外的單元測試將是多餘的。根據你的例子,如果你的單位沒有編碼舍入規則,但只使用他們在其他地方定義的,那麼我會認爲可以接受省略任何新的單元測試。在你編寫業務規則的情況下,我傾向於引用單元測試來包裝你的單元的適當規範 - 或者作爲「空」測試;或者在單元測試中用作規格單元測試(如果可行的話)的調用更有用。

1

你可以問,而不是:
「是否有意義寫不完全被覆蓋的規範代碼單元測試?」

如果你不知道它應該如何工作,你可以爲它寫測試嗎?

是的,你可能可以,但是實際上你可以通過編寫測試來增加規格。

這不是真正的規格與測試相關的問題,而是測試證實代碼符合規範。

即使規範似乎涵蓋了所有內容,在編寫測試時很可能會發現仍有一些未覆蓋的情況。從這個意義上說,你不僅要測試代碼,還要測試規範。

1

單元測試的主要目標之一是發現問題快速。如果你的集成測試和/或可執行規格需要花費大量時間來運行(大多數時候會這樣做),我猜測你不會像單元測試那樣運行它們。在這種情況下,即使有更多「昂貴」的測試來驗證類似的行爲,創建單元測試也是非常值得的。

+0

速度在這種情況下不是問題。可執行規格和單元測試都很快,實際上可以作爲一個單元運行;規格被包裝在單元測試中,以便它們一起運行。集成測試需要更長時間,但這不是我所問的。 –

相關問題