先來講一下是怎麼上課的,一開始到教室,座位就是分組的位子,一組大概五六個人,讓大家可以方便討論。一開始老師就先問大家,在這堂課最想學到的測試議題,我覺得這樣蠻好的,先自己想想想要學到什麼,有什麼目標和期許,或是我是誰、我在哪(誤)。
老師有特別說上課的影片不要外流,影片主要為錄 寫 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
這世界不應該這麼蠢,蠢的是我,我應該要去找比較快的方法。
這句話老師講完令我印象深刻,自己能思考是否有更好的方式,不管是對於測試或是寫程式,埋下了一個要不斷進步的種子,覺得這堂課學到了不只是測試觀念和技能,還有一個積極進步的人生觀!
