2014-02-24 44 views
2

我已閱讀,無限無盡,像這樣的東西:單元測試:如何知道沒有單元測試哪個私有函數已經損壞?

你不應該需要暴露私人方法到您的測試。你們班的公共方法有一個規範。你的單元測試應該測試你的類的公共方法是否遵守這個規範。公共方法如何去做是沒有人的事情;只要您繼續遵守公共方法的規範,您就可以隨意更改您的私人實施,只要您喜歡。

所以:

  • 我有一個公共函數,調用各種小型私人功能。
  • 公共職能中斷。
  • 我怎麼知道哪個私人功能壞了?
+0

@SLaks我已經使用了一個調試器 - 但這似乎比簡單的測試慢。我的主要目標是**知道某件事是否有效,如果沒有,它是如何儘快失敗的**。 – mikemaccana

+0

然後讓你的公共方法變得更小更精細。 – SLaks

+0

@slaks公共方法很小。它在最大的非聯網私有方法之上增加了最小的網絡複雜性,這種方法只能從公共方法中調用。 – mikemaccana

回答

1

單元測試不應該告訴你哪個確切的行在你的代碼中有錯誤。單元測試只能驗證你的公開方法是否符合規範。如果某種方法未能通過測試,那麼您會看到規格的哪個部分不被滿足。這取決於你理解爲什麼。如果你有異常,那麼異常消息/堆棧跟蹤可以告訴你問題的根源。您還可以調試單元測試以瞭解哪裏出了問題。

如果你花費了很多時間來找出哪個私有方法有bug,那麼你的班級可能太複雜或者太多了。考慮提取一些功能來分離類併爲其編寫單元測試。

+0

簡單的例子:一個小的私人功能完成一項集成工作(例如,以特定格式構建文件)。一個更大的公開方法將其包含在更復雜的網絡任務中。對私有方法進行單元測試可快速識別構建的文件是否不正確,或者是否存在網絡被破壞的較大問題。 – mikemaccana

+0

這聽起來很像*太多的責任*案例。以特定格式完成網絡任務和構建文件是非常不同的工作。創建文件構建器併爲其編寫測試。然後在你的班級使用文件生成器來完成網絡工作。 –

+0

是的,他們是單獨的工作 - **這就是爲什麼他們是單獨的方法**。然而,一個人只能從另一個人那裏打電話,這就是爲什麼它是私人的。你要求我在這裏做的是不必要地暴露一些東西,然後爲它寫測試。 – mikemaccana

0

如果您使用的是java/junit,那麼stacktrace會顯示所有調用的方法以及它的中斷位置。 我認爲在c#和其他現代語言中存在類似的機制...