自動測試與 TDD 實務開發 - 上課心得 (上)

測試一直以來是很多開發者心中的痛,當被老闆問到:「你的程式碼是否都測試過了?」你是否能摸著自己的良心,並且拿出證據來說自己真的做過測試讓所有功能都符合需求了?我相信絕大多數的開發者這時一定都是面有難色,因為其實你不但騙了老闆,還騙了你自己。

從我自己開始研究測試後,其實一直覺得自己還是沒有真正把測試當成是開發的一部份,更別說坊間很多程式書籍和教學課程能把這兩者真真實實地融合在一起,傳授給廣大的開發人員。

這次正好有機會去聽 Joey (91 哥) 在 SkillTree 開的 TDD 課程,我心想這實在是太棒了! Joey 是業界在 TDD 領域相當有研究,而且也已經在實務上經過千錘百鍊的高手,如果能親眼見到他是如何把測試融入開發中的話,一定能大大提升自己的經驗值!

不過課程中精采的部份太多了,恕我無法一一介紹;而且我也不覺得我能在這篇心得中,表達出講師在實務面的深厚功力。以下就讓我來為大家介紹這個課程為什麼值得你去聽的心得。

絕對有料的課程內容

我個人很喜歡這個課程一開始就把整個學習地圖展開來,讓學員知道接下來幾週裡會由淺入深地學到哪些技巧,例如本週 (第一週) 是單元測試的基礎。雖然說是基礎,但卻是最關鍵的一環!因為講師會將所有至今你對測試的錯誤認知重新洗掉,注入最正確的觀念!

而接下來講師就舉出了幾個血淋淋的真實案例,告訴你為什麼測試是重要的。測試不是用來應付流程的工具,而是紥紥實實讓你對自己的程式碼能更有信心的魔法。你不見得能在一開始就體會測試的重要性,但你一定會在出大包時懊悔:如果當時有測試就好了 (曾經待過 EC 產業的我感同身受) 。

講師也三不五時會讓學員用回答問題的方式,讓學員重新審視對剛剛所教授的內容是否有真的瞭解,講師也會適時地再補充。講師也會針對同學的發問,來分享自己在實務上遇到的問題。

一定能懂的教學方式

有趣的是,這次課程講師是用 C# 教學,但在 PHP 中打滾的我卻對範例沒有絲毫的疏離感。因為講師舉的例子相當生活化,而且寫出來的程式碼非常平易近人,只要有寫過程式的人一定都能看懂。

課程中包含了讓學員動手的實戰練習,每個範例都是從實務中淬鍊出來的,像是如何測試亂數?如何測試只會在特定日期啟用的功能等等;而且範例經過縝密的安排,能循序漸進地讓學員瞭解如何在測試中套用課程中講授的原則。你會很驚訝原來這些我們以為難測試的問題,其實在測試中解決的方式竟然是這麼簡單。

當然對不會寫 C# 的我來說,原本以為沒辦法用 IDE 實際演練會是件憾事;但這些實例設計之精巧,卻能夠讓我用 PHP 來重新代入;所謂一法通萬法通,測試的觀念本來就不限程式語言,這樣讓人興奮的實戰訓練,會讓人有手停不下來的感覺。

教你怎麼快速建立測試又能寫出好測試

我們都知道開發應該針對需求,然而測試也是。但我們卻容易想得太多,導致我們做了太多無謂的工作。在課程中,講師會告訴你如何讓測試去配合需求,而不是為了測試而測試。搭配測試的原則,我們就不會再認為測試是多出來的工,而應該是開發的一部份。

例如關注點分離、 FIRST 、 3A 這類的測試原則,都是寫測試時所應該遵守的,但很少人知道要怎麼去應用。然而透過這個課程的範例教學,你會發現這麼多名詞和原則,竟能從中得到驗證!因為它們其實都是從實務所演化出來的,只是我們一直以教條式的方法來學習它們;當真正看到這些原則是這麼輕鬆地被講師透過實例展現出來時,那種震憾是文字難以描述的。

當然我們在實際撰寫測試碼時,還是很容易覺得它是件麻煩事,這時候測試工具就非常重要了。一個好的測試框架會影響你撰寫測試的意願,如果這工具沒辦法很容易又很簡潔地寫出符合意圖的測試,那麼也就不能怪其他同事質疑寫測試是不是有幫助了。

而號稱地表最強 IDE 之一的 Visual Studio 在這方面當然不會落於人後,簡單幾個指令和操作,測試骨架就立刻出現。再搭配第三方的測試工具,輕輕鬆鬆地就在這些骨架加血添肉,轉眼間測試就完成了。寫測試這件事從此融入整套開發流程裡,怎麼可能讓人不興奮呢?

實務上面臨的問題

Demo (SkillTree 主辦人) 在課餘時間聊到:「即便寫測試變得容易,而我們也開始把它變成自己的習慣,但你還是一定會碰到同事有這樣的質疑:『這程式碼就是正確的呀!為什麼還需要測試?』」我想一定有想在團隊裡導入測試的朋友常會遇到這種狀況,在這個課程中也可以讓你學到用什麼方法可以處理這樣的質疑。

在導入測試時時,最重要的就是讓同事對測試有信心;當寫測試變得很容易時,你所要做的,就是怎麼讓同事也能體會寫測試能為他帶來什麼效益。這方面講師也會提出他的實務經驗供我們參考,而且不論是技巧上和人性上,都是相當值得參考的建議。

最後還有一個可能會面臨到的,就是測試對程式碼的涵蓋率。講師的回答其實讓我非常驚訝 (容我賣個關子) ,這其實讓我對「測試對團隊的影響力」這件事大大地改觀。雖然我自己也在某個部份應用上了類似的觀念,但我以為這只是影響了我自己,沒想到這確實是一種對人性的實務作法,不禁讓我對它更有信心;我相信透過這些小小的改變,就有機會讓整個團隊變得更有勇氣去面對測試這件事情。

小結

上完第一週的課程,我腦海裡一直迴響著:『你必須對你的測試有信心,測試才能讓你對你的程式有信心。』

測試應該要做什麼?怎麼寫有效的測試?怎麼快速地寫測試?怎麼讓同事一起來寫測試?原本以為自己已經可以回答這些問題,卻在這個課程中讓我的觀念整個大洗牌,也開始讓我心中已經消逝很久的熱血又漸漸沸騰起來。

再次感謝講師 Joey 和 SkillTree 的 Demo 舉辦這麼實用且精采的課程,我越來越期待接下來幾週的內容了。