2009-01-15 75 views
5

當你想出一個關於系統的一部分應該如何工作的總體設計/想法時,你如何決定從何時開始進行TDD,或者說,你如何決定從第一次測試開始?你會從哪開始?

回答

7

讓我們假設我正在編寫一個名爲Oven的類來烘焙我的美味Pie對象。這是我如何通過單元測試順序:

  1. 我需要做什麼來實例化對象?在這種情況下,它很可能是Oven oven = new Oven();沒有這個測試,我想。
  2. 如何準備對象以供使用? oven.turnOn(int degrees)聽起來不錯,我會那樣做。我如何檢查它?最好使oven.getTemperature()。有一個明顯的考驗。
  3. 好吧,烤箱現在已經夠熱,我想烤我的Pie。爲此,我需要oven.bake(Pie p),所以我會做到這一點。但現在呢?我想檢查餡餅是否準備好了,而不是讓oven.isPieReady()我認爲oven.pastryStatus()返回的東西如「烤箱裏沒有東西」,「原料」,「幾乎完成」,「煮熟」和「燒焦」聽起來不錯,一般應該比oven.isPieReady()更可擴展,所以我會這樣做。

等等等等。所以,我會做我的測試,以便我期望使用這個對象來完善規範。最後,我通常會用相當簡單但功能強大的API來完成我想要的功能。在我單元測試了我的API之後,我運行了我的代碼的覆蓋範圍,以查看我錯過了什麼,然後爲這些添加了額外的測試。

+0

+1做得很好,先生 – annakata 2009-01-15 14:04:54

+0

如果你把貓C放在烤箱裏會發生什麼?怎麼樣放入一個「燒焦」的派,或者一個沒有準備好烤箱的派?限制和無效輸入測試很重要。 – Tester101 2009-01-15 14:16:12

0

我會爲最獨立/最低級別的功能構建一組單元。一旦你有這些類通過每一個測試,你可以繼續前進,假設它們在被更多依賴的功能調用時會工作。

0

這些是一般準則我發現用於優先化單元測試有用:

1)確定邊界的對象(贏/ WebForms的,CustomControls等)。

2)確定控制對象(業務層對象)

3)寫單元測試只對控制對象由邊界的對象調用的公共方法。這樣你就可以確定你覆蓋了你應用的主要功能。

你可以使用這些規則來優先考慮你的單元測試 - 然後如果你需要微測其他東西,你也可以根據你的需要來做。

1

當面對的測試列表來實現,你必須類別

  1. 微不足道的測試,但你確定你 可以完成這件事。
  2. 非平凡但 你有理由相信 完成它。
  3. 不平凡但 很難 - 絕對沒有線索 完成它。

在這種情況下,從Category2存儲桶中選擇一個存儲器,因爲它將提供每單位投入時間的最大知識/學習。此外,它會讓你滾動,並提高信心,以加速到更困難的Category3測試。

我想我是從TDD By Example得到這個 - Kent Beck。看看你是否有時間。推薦。

1

我一直在TDD上教授一堂課,現在有很多參與者開始測試所有的錯誤案例。儘管他們可能是相關的,但這不是啓動imo的最佳方式。

從設置測試開始,這些測試很容易實現,並且仍然告訴您是否正在朝着正在嘗試實現的功能的正確方向前進。因此,如果您正在構建堆棧,請確保在測試錯誤案例之前驗證推送和彈出窗口。

請記住,測試的目標不僅是驗證行爲,還讓您使用被測型的接口。如果編寫測試感覺不對,您可能需要更改界面。

一個好主意是向後做每個測試用例。因此,從編寫Assert語句開始。這是此測試驗證的目標。然後添加必要的步驟以達到您可以執行Assert所做的操作。