2014-03-14 30 views
3

假設我有一個用戶類有一個方法is_old_enough?TDD是否意味着我必須爲每種方法編寫一個測試,不管它有多複雜?

該方法只是檢查年齡超過18歲。看起來很簡單。

TDD是否意味着我必須爲此寫一個測試,即使它很微不足道?

class User 
    def is_old_enough? 
    self.age >= 18 
    end 
end 

如果是這樣,爲什麼?爲此編寫測試有什麼好處?你只需要測試x> = y是否符合你期望> =操作符的工作方式。

因爲我看到的情況是最有可能的情況是:

原來的年齡實際上應該是21.這是該測試沒有趕上一個錯誤,因爲他們有錯誤的假設,當我們寫代碼。然後他們進入並將方法更改爲> = 21。但是現在測試失敗!所以他們必須去改變測試。所以測試沒有幫助,並且在重構時實際上給出了誤報。

看起來像這樣簡單的方法測試實際上沒有測試任何有用的東西,實際上是傷害你。

+0

我認爲「測試驅動」是指你測試你的代碼。這並不意味着你必須變得愚蠢。另一方面,有時候相對簡單的代碼可能會有錯誤。如果有人在一個地方改變了定義,測試可能會失敗。您必須同時進行積極和消極的測試(例如「過關18分,失敗17分」)。如果限制更改爲16,則您的第二個測試現在將失敗。我總是告訴人們:「當你學習新的東西時,不要拔掉常識模塊爲新信息留出空間」。 – Floris

+0

使用TDD,您不需要爲方法編寫測試,而是爲測試編寫一個或多個方法。你首先寫一個描述一些理想但尚未實現的行爲的測試。然後你寫出必要的代碼來通過測試。 –

回答

4

我覺得你很困惑測試覆蓋和測試驅動開發。 TDD只是開發自動化測試的一種做法,它將驗證某些新功能的使用情況。通常它開始失敗,因爲你已經將功能樁出來或者根本沒有實現它。接下來,您開發該功能,直到測試通過。

這個想法是,您正在開發驗證您的重要用例/功能的測試的心態。這並不一定意味着如果您認爲自己被常規功能測試覆蓋,則需要測試簡單功能。

就覆蓋率而言,開發者(或團隊)決定是否真的取決於您。很顯然,對API進行1對1的測試覆蓋率是需要的,但是您可以選擇是否認爲總是易於實施is_old_enough?。它現在看起來像是一個簡單的實施,但也許這將在未來發生變化。當您選擇是否編寫測試時,您只需要注意這些決定。儘管如此,您的用例不會改變,測試也很容易編寫。在代碼的所有領域感到自信並沒有什麼壞處。

0

我認爲這個問題更多的是與單元測試有關,尤其是TDD。

簡短的回答:注重行爲

龍答:嗯,有一個很好的短語在那裏:BDD是TDD做對,我完全同意。儘管BDD和TDD在很大程度上是「相同」的東西(不等於,請注意!),BDD爲我提供了TDD的背景。你可以解決這個在網上看了很多,所以我不會在這裏寫文章,但讓我這樣說:

  • 在你的榜樣,是的,測試是必要的,因爲規則 用戶夠大是用戶實體的行爲。測試作爲一個 安全網還有很多其他的東西依賴於這個信息片段,測試我會很好地記錄這個行爲 (我實際上傾向於閱讀測試以找出開發者在當你寫一門課 - 你會學到期望什麼,課堂表現如何,邊緣情況如何等等)
  • 我真的不知道測試如何不能重構重構,因爲我會寫測試數字18,19,25和55(只是一堆斷言非常容易打字非常快)

難題的一個非常重要的部分是單元測試只是您需要的一種技術。如果你的設計缺乏,你會發現你自己寫了太多沒有意義的測試,或者你會讓地獄測試類做很多事情等。你需要有非常好的SOLID技能,以便能夠以僅測試他們的方式公共接口(這也包括受保護的方法)實際上測試整個類。如前所述,關注行爲是關鍵。

相關問題