2016-07-28 80 views
0

那麼,我有一個使用另一種方法的方法。我有次要方法的測試,現在我想爲主要方法編寫單元測試。如何使用包含其他方法的方法編寫單元測試?

我認爲我必須在沒有看到要測試的方法的代碼的情況下編寫測試,我的意思是,我沒有在實現中考慮測試,因此在測試主要方法I必須測試次要方法的功能和主要方法的功能。

例如,我有兩個汽車車庫。在加拉加有一輛汽車和我擁有的汽車數量。所以我想能夠添加一輛新車到加拉加,取下汽車並將車從車庫轉移到另一輛車。所以我有這種方法:

  • 一種方法將車添加到車庫,必須與汽車相關的加拉加和udpdate汽車的數量。這是我有一輛新車的時候。
  • 一種從車庫中取出汽車的方法,與車庫無關並更新汽車數量。這是當我沒有車了,例如,因爲我賣了它。
  • 關於轉移車輛的方法,即將車輛從第一個車庫中取出並將車輛添加到新車庫。所以這個方法調用add方法和remove方法。

的傳輸方法的代碼是類似的東西:

public void transferCar(garage1, garage2, car) 
{ 
    removeCar(garage1, car); 
    addCar(garage2, car); 
} 

如果我測試removeCar和addCar,我相信他們的工作預期,測試轉移,我一定要考所有addCar的情況以及removeCar的所有情況?因爲如果我不知道transferCar的實現,我不知道此方法是否使用removeCar和addCar,因此我不知道該方法是否按預期工作。

換句話說,當我測試transferCar時,測試必須覆蓋removeCar的代碼的100%,addCar的代碼的100%和transferCar方法的代碼的100%,或者確保我調用該方法removeCar一次和addCar在transferCar和它的預期是否足夠,雖然removecar和addCar不被覆蓋100%?

因爲如果我必須測試removeCar和addCar的所有情況,我會做兩次相同的測試。所以我重構了代碼,因爲removeCar和addCar我在很多地方使用它,但在我的測試代碼中,我多次使用相同的測試。

這是一個非常單一的例子,但是如果我有一個方法使用很少的方法,而這個其他方法使用antohers,並且主方法應該覆蓋所有方法的所有代碼,那將是一個非常長的測試,和很多工作。

總的來說,當我測試一個方法時,我已經覆蓋了此方法的代碼的100%以及此方法使用的方法的代碼的100%,或者只是爲了確保main方法的工作原理爲預計和每次輔助方法調用一次?

謝謝。

回答

1

TDD並不意味着您需要對實現細節沒有零知識,而是測試第一個編程概念。單元測試是白盒測試,因此這個人應該確切知道類實現是什麼。黑盒測試可能不需要實現細節的知識。

嚴格地說單元測試應該只測試一個類的公共接口,看看我們給出了100%的覆蓋率類(包括其所有專用和受保護的代碼)。

覆蓋要功能是瞭解有多少的用於該特定功能碼線的測試,以及如何許多分支(如果 - 否則,開關......)進行驗證。

對於你的情況,我會寫一個簡單的測試案例轉讓汽車,如果汽車從garage1轉移到garage2斷言檢查。這將100%覆蓋transferCar()。然後,您可以編寫大量的多個測試用例來實現addCar()和removeCar()的良好覆蓋率,我希望它們是公共方法。如果他們是私人的然後檢查here

如果你想跳過調用真正的實現,然後嘲笑是要走的路,但這取決於你如何實現你的代碼..如果一個功能在測試(主要功能如此說)調用自己的實例方法,然後嘲笑被調用的函數是棘手的。

+0

但是,如果有可能,誰實現了單元測試應該是不同的誰執行測試,becuse以這種方式很容易發現錯誤的方法的人。因此,實施測試的人可能不知道實施的任何內容。 –

+0

所以,你的意思是雙方都知道類的結構,公共方法,接口,存根/僞造什麼,模擬和其他細節,除了每個函數是如何單獨實現的?不知道這是否是一個正確的做法,但我想接下來我們要接受太多的冗餘代碼和額外的努力, –

+0

因爲這個問題是在TDD標籤提交下看,「不同的人應該寫測試」在我看來是一些非常奇特諮詢。然而,這是一個非常好的主意,讓測試的重點是行爲(即不按樣的規則,「每個方法1個單元測試」,只是測試被測系統的所有可能的用途,如果像這樣的測試練習3個不同的那個對象的方法,就這樣吧)。 – prgmtc

相關問題