IT 邦鐵人賽 Day6 - 規格與第一個紅燈

在前天講了TDD的概念與流程,昨天也安裝好Ruby語言跟RSpec測試框架,接下來要開始慢慢帶入測試的模樣,讓我們來看看測試流程到底長什麼樣子,測試到底是在測什麼,要寫什麼code。先別急,我們今天先講個測試之前需要的「規格」。


什麼是規格?

其實規格就是規範,範本的概念,用來描述標的物的形式,像是產品規格,設計規格。舉個例子,假如今天公司要你研發一台冷氣機,那是不是要先把藍圖畫出來,它的外型長什麼樣子,壓縮機要用哪種?往復式、渦卷式、螺旋式、迴轉式及離心式?有了這些構思藍圖,再開始一步步的把東西做出來,總不可能要你研發,你都不用想冷氣的外型,構造,內部元件等結構,然後就可以直接憑空做出一台冷氣機吧!

那測試的規格就是以測試內容為標的物所製作出來的文字描述。這是為了方便我們清楚知道,我們到底要做什麼。

在我們開始寫測試之前,我們要先了解目標專案的需求,然後思考這些需求如何達成,需要的介面是什麼,然後把想到的可能,寫在規格上。

範例說明

今天客戶想要一個行動支付的軟體,我們就要思考,行動支付會有什麼功能,這些功能會如何運作。行動支付不外乎主要有扣款跟轉帳功能。

其中的扣款功能,規格可以這樣寫:
軟體錢包原本有50元,扣款10元後,錢包顯示40元。
軟體錢包原本有50元,扣款100元後失敗,錢包仍顯示50元。

如果客戶還想要有將錢存至錢包的存錢功能,規格可以這樣寫:
軟體錢包原本有28元,按下存入,輸入12元後,錢包顯示40元。

像這樣就是規格的呈現,把情境與需求一一列出來,便可清楚知道,要測什麼,情境有哪些。如上可知,現在總共要做兩個不同的功能,那我們可以再整理得更清楚些:

扣款功能:
軟體錢包原本有50元,扣款10元後,錢包顯示40元。
軟體錢包原本有50元,扣款100元後失敗,錢包仍顯示50元。

存錢功能:
軟體錢包原本有28元,按下存入,輸入12元後,錢包顯示40元。

試著把它寫進 RSpec:
我們先找一個喜歡的目錄,在終端機輸入 rspec –init,系統會自動建立 RSpec 的資料夾,並在 spec 裡建立檔案 mobile_wallet_spec.rb。

這個檔名主要是專案名稱再加上 _spec 或 _test ,代表這個檔案是用來進行某某專案的測試檔,而後面的 .rb 就是程式語言 Ruby。

(檔名可以隨便取叫123abc,但你應該會比較希望看到檔名就知道它是什麼吧?所以取名要取得有意義。)

接著在測試檔案撰寫:

https://ithelp.ithome.com.tw/upload/images/20220906/20149089G7Wxo03HX1.jpg

如此一來,是不是就能很清楚的知道這個測試需要做什麼,這就是規格。所以有句話是這麼說的:「寫測試就是在寫規格」。

有了規格後,便能開始撰寫測試需要的 code。

不過先別急著寫,我們來看看,這時候 run 測試會發生什麼事情,在終端機上輸入指令 rspec ./mobile_wallet_spec.rb:

https://ithelp.ithome.com.tw/upload/images/20220906/20149089oraCq0JhlH.jpg

這時候會出現異常訊息是正常的,因為我們才剛做完測試的規格,並還沒有把實際的內容填上,所以執行測試一定是失敗(紅燈)的。

NameError: uninitialized constant MobileWallet
意思就是我們還沒有 MobileWallet 的常數類別,這是理所當然的,畢竟我們根本還沒開始寫實作的 code。

關於紅燈

千萬不要覺得紅燈是壞事,如果今天在做測試,從頭到尾都綠燈,那不是很可怕嗎?天底下真的有這麼順利的事情?

所以通常都會先讓測試跑出紅燈,或是在測試綠燈之後,故意把驗證寫錯,看看會不會如預期亮紅燈,以此確認測試是正常的。

小結

那今天就介紹規格,明天再來講解,寫完規格後要幹嘛?我們下回見~