針對遺留代碼加入單元測試的藝術-上課心得

fantasy1022
Nov 2 · 6 min read

公司補助來上這門課,上完覺得有種醍醐灌頂茅塞頓開的感覺 XD。老師原來就是單元測試的藝術的中譯者,課程裡面提到不少書裡面的觀念,但也沒有完全相同,我之前看完這本書後,有寫了摘要,這次上課前,再複習了一下,覺得頗有幫助。

找到老師之前寫的 30 天鐵人賽文章,關於測試的觀念,課程結束後,看了一些,覺得這就是課程的講義啊 XDD,並且用口語的方式解釋一般寫測試會遇到的疑問,覺得親切,彌補了書上比較艱澀的內容,推薦閱讀!


先來講一下是怎麼上課的,一開始到教室,座位就是分組的位子,一組大概五六個人,讓大家可以方便討論。一開始老師就先問大家,在這堂課最想學到的測試議題,我覺得這樣蠻好的,先自己想想想要學到什麼,有什麼目標和期許,或是我是誰、我在哪(誤)。

老師有特別說上課的影片不要外流,影片主要為錄 寫 code 和 IDE 的操作,加上老師並沒有投影片,是用手寫的方式,來呈現重點。

下面的影片是官網上的宣傳影片,這個主要是 refactor,然後是使用 IDE 的refactor 功能,可以比較快速還可以避免錯誤,老師一直很強調這個方式。

整堂課從早上九點開始,到接近晚上七點才結束,一開始被網頁上的時間騙了 XD ,以為到五點就結束了。整堂課除了講測試的觀念,還有實作,有三個 Lab,分別有提供 Java, C#, php 三種語言,我平常是寫 Android,因此對 Java 比較熟悉,就使用 Java 的程式碼來練習。

最後三個 lab 講完,並讓大家做完練習後,老師講了一些測試的觀念,和他對測試的心得,有些觀念我在書上有看過,可是當下聽老師再講一次,有更深刻印象和體會。


單元測試裡面是沒有 if else 的,有 if else,就可能會有錯誤,不可能再寫測試程式來測,不能用到 switch,也不會用 for 回圈,也不要用 try catch。聽完這句話,覺得當頭棒喝,因為自己寫的 test ,裡面就有犯了這些錯誤。

思考花時間寫測試,要花在刀口上,目標是提升產品品質,測試是是其中一種方式,測試就像是買保險,測試是需要成本的,測試要寫在哪個地方(投資報酬率),會 CP 值比較高:

  • 和錢相關的
  • 很常壞掉的東西,常改
  • 常用、常跑
  • Bug (讓重複的 bug 不要重複發生)

相對趨勢比絕對數字重要,從現在開始,有改動的 production code 再寫測試,不用特別去寫,為你自己新寫 code 負責,從今天開始。

對情境去寫測試,可以看到最後的測試程式碼(上面的 youtube 連結),可讀性都很高,將行為封裝,之後要增加測項也會變容易。

在看 Lab 的時候,一般要比對值有沒有一樣時,在 Java 上會使用 junit 的 assert,看到了一個之前沒看過的 Assert 套件,叫做 assertj,就特別詢問老師,這個套件功能強大,提供更複雜的比對方法,並可以用 chain 的方式來撰寫。舉例來說原本有個 list 要檢查,用 junit assert 加上 for 迴圈來檢查裡面的物件是不是 null,假設有五筆,跑到第二筆就壞了,只會知道第二筆就壞了,不知道第三、四、五 的值。assertj 有提供遞迴比較,就不用再寫 for 迴圈了。之後實際體驗後,會再寫一篇使用 assertj 的使用心得。


上完課,不代表你就會寫測試了,以後寫 code 就沒有 bug 了 XD,老師在課堂上講了很多的觀念,可以想像成釣竿,然後也講了心法,要怎麼使用釣竿,有時候其實是要用魚網 XD,更能理解到單元測試可以做到的事項和不能做到的事,不會對單元測試有一些不切實際的幻想,把希望都寄託在單元測試了 XD

一般看到範例程式碼,並不會特別想是怎麼產生的(手打的或是用 IDE 輔助產生),看老師在 demo 時,覺得一個神速啊,不是複製貼上那種的神速 XD,而是使用 IDE 的 refactor 功能和熱鍵來輔助,透過 IDE 來修改這樣基本上不會有錯誤,而且可以避免 context switch。還有一門課是專門講這個,老師在上課途中還會工商一下 XD,這個操作方法,在明天的課會講。做事的時候通常會想要做的又快又好,這就是快的部分,雖然最後寫出來的程式碼可能長得差不多,但用的時間是比較少,寫起來也比較帥氣 XD 。對我來說提供了另一個進步的面向,原來一些熱鍵和好的開發習慣是這麼有幫助的。

程式碼是照你寫的跑,而不是你想的跑。

這句話我忘了一開始在哪邊聽到的,不過一直存在我的腦還中,寫程式就像是一個人體 compiler,把想法(工作上可能是商業需求或是老闆的想法)轉換成程式碼,讓電腦能讀懂並執行,而測試可以逼著程式碼寫得和想得一樣,讓程式碼和你想的達成同步,像是驗算的概念,但是如果一開始就想錯了,那就沒辦法了,最後測完還是錯的 XDD

這世界不應該這麼蠢,蠢的是我,我應該要去找比較快的方法。

這句話老師講完令我印象深刻,自己能思考是否有更好的方式,不管是對於測試或是寫程式,埋下了一個要不斷進步的種子,覺得這堂課學到了不只是測試觀念和技能,還有一個積極進步的人生觀!

fantasy1022

Written by

UtaPass Android Developer in KKStream. Write and think the code to reflect my life.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade