使用 TDD 方法與提供的測試套件來解練習題
測試驅動開發(有時又稱測試先行開發,或測試驅動設計)是一種先寫單元測試、之後才寫實作程式碼的做法,而且是在寫下任何一行實作程式碼之前,就先把測試寫好。
你在做的所有練習題(也就是那些不會教你新概念的練習)都會附上一些說明,大致描述你需要完成什麼。 這些說明刻意不涉及特定程式語言的實作細節,因為它們是由 Exercism 上 70 多個語言軌道共用的。 有些語言軌道會為你補充更詳細的說明,但並不是每個軌道都會這麼做。
當你開始做一道練習題時,請仔細讀過這些說明。 它們會讓你大致了解該如何著手實作解答。 但你得讀過測試,才能了解完整且確切的需求:
當所有提供的測試都能執行並通過時,你就解出這道練習了。 換句話說,你的解答不能只是「看起來對了」的說明解讀,你的解答是一個能通過所有指定測試的程式。 測試就代表了這道練習的完整需求。
我們已經幫你寫好了一整套單元測試。 你的目標是寫出一份解答,裡面的程式碼剛好足夠讓這些單元測試全部通過。
請記住:TDD 能幫助你找到解答,但你不必就此停手。 如果你想讓解答超出需求、再多做一些,也歡迎這麼做。 如果你選擇和導師一起合作(我們也鼓勵你在測試通過之後這麼做),他們可以幫你重構並改善最初的實作,甚至提出新的單元測試。
在 Exercism 網站的程式碼編輯器裡工作時,你可以閱讀測試,但無法編輯它們。 每次執行測試時,所有測試都會被執行,不論測試檔裡標註了什麼「略過」機制。
當有多個測試失敗時,網站一開始只會顯示第一個失敗的結果。 你也可以點擊其他失敗項目,把它們展開喔! 有時候第一個結果未必是最有幫助的。
別因為大量測試失敗而灰心。 專注讓它們一個一個通過就好。
許多軌道的測試檔會使用「略過」的測試。 一開始只有第一個測試是「啟用」的,其餘都是停用的(實際做法因軌道而異)。 當你在自己的環境中執行測試時,只有第一個測試會執行。 我們這麼做,是為了鼓勵你遵循這樣的工作流程:
重複這些步驟,直到你取消略過所有測試。 所有測試都通過之後,恭喜你,你解出這道練習了!
測試實際上要怎麼「取消略過」(或啟用),取決於你所用的軌道。 有些軌道是加上註解或移除標註。 有些軌道則是把某個屬性從 true 改成 false。 花點時間讀一下你所屬軌道的文件,裡頭會說明這些細節。
對於不略過測試的軌道,套用這套流程可能就只是把測試全部註解掉,再一個一個取消註解這麼簡單。
雖然這看起來像是「本末倒置」,但先寫單元測試、再寫實作程式碼,其實有幾個很好的理由。
設計。 它會強迫你先思考程式的介面(也就是程式如何把功能開放給外界使用),而不是一頭栽進實作細節。 擁有設計良好(而且好測試!)的介面,往往比實作得有效率更重要。
紀律。 寫測試常被當成苦差事,或事後才想到的事;但先寫測試能確保你最終寫出足夠的單元測試,涵蓋程式大部分、甚至全部的功能,而不是永遠撥不出時間來寫。
更省力。 如果你緊湊地循環進行:寫一個測試、寫能通過這個測試的程式碼、再寫下一個測試,你的程式碼就會自然而然地逐步成長。 這通常(雖然不總是)能減少白費的力氣;你最後會寫出所有需要的程式碼,也不會多寫任何不需要的程式碼。