iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 2
0
自我挑戰組

TDD - 紅燈,綠燈,重構,30天 TDD之路有你有我系列 第 2

Day2. 什麼叫單元測試? 再給我說一次,什麼叫他__的單元測試?

  • 分享至 

  • xImage
  •  

前言

這一篇,就先來簡單的談談什麼叫做「單元測試」你再給我翻譯一下 什麼他___的叫單元測試

這一篇將會談談單元測試原則、FIRST和3A原則,這篇應該會很有趣XD

https://ithelp.ithome.com.tw/upload/images/20171219/20107209929tl8Mmki.png

什麼叫單元測試?

單元測試,英文又稱為Unit Test,就是針對程式最小單元,進行的測試,稱之為單元測試。

單元測試的準則

現在我們終於知道了單元測試以及最小單元的定義,做單元測試之前,我們要知道要保持什麼樣的原則及特性才能成功的做出「好的」單元測試。
下圖參考91大大的部落格的圖翻做出來的Unit Test的定義及基本準則圖

https://ithelp.ithome.com.tw/upload/images/20171219/20107209TCtY1OhGTn.png

  1. 一個測試案例只測一種方法
    若一個測試案例測了多種方法,那你這個測試案例就會很複雜,假設今天這個測試案例中有很多種方法,如果這個測試案例錯了,你會不知道錯在哪一個方法之中
  2. 最小的測試單位
  3. 不與外部(包括檔案、資料庫、網路、服務、物件、類別)直接相依
    不與外部相依的原因是需要排除「不是在我們的方法上出錯」的可能性,假設相依在線上的資料庫上,很有可能會因為網路、資料庫被異動而導致測試案例失敗的可能,所以不與外部直接相依,而是以stubs、mock的方式來進行單元測試。
  4. 不具備邏輯
    單元測是本身不可以具備邏輯,如果單元測試具備了邏輯那就需要在寫一個測試來測試這個測試案例是不是正確的,這樣一看就知道是一個不符合邏輯以及奇怪的事情。
  5. 測試案例之間相依性為零
    測試案例之間如果有相依性,那就很有可能會造成測試案例之間的「干擾」,假設某一個B測試案例需要A測試案例先啟動才會通過,如果A測試案例不過,B測試案例就不會過,這樣就會干擾我們去判斷今天是因為錯了A才錯B還是B本身就是錯的。

什麼叫做最小單元?

我就想先讓你翻譯翻譯,什麼叫最小單元?

https://ithelp.ithome.com.tw/upload/images/20171219/20107209Cq1rDYRsO0.png

最小就是單個程式、函式、過程等,在物件導向中的解釋,就是在基礎類別、抽象類別或者子類別中的「方法」,就是最小單元。

好的單元測試-FIRST特性

大哥這個是FIRST原則啊

https://ithelp.ithome.com.tw/upload/images/20171219/20107209YZz9s1SCuT.png

如何定義這個單元測試是不是好的單元測試?,一個字FIRST(參考於無暇程式碼)

https://ithelp.ithome.com.tw/upload/images/20171219/20107209kjhQ8B73HD.png

  1. Fast:快速。
    好的單元測試要可以快速的執行完成。
  2. Independent:獨立。
    好的單元測試要是獨立性的,也就是無相依的。
  3. Repeatable:可重複。
    好的單元測試要是可以重複執行的。
  4. Self-Validating:可反應驗證結果。
    好的單元測試是要可以真的驗證一件事情的結果的,不需要透過人為的操作來進行驗證。
  5. Timely:及時。
    單元測試的程式碼與產品程式碼是兩個一起完成的。

談了這麼多的準則、原則,這些雖然看起來很明瞭,但卻又很模糊,那我們在實作上到底要如何開始呢?

單元測試就是要3A原則
呼呼,終於說到了最後一個原則啦!!!

https://ithelp.ithome.com.tw/upload/images/20171219/20107209ZI22QVTx6r.png

3A原則是單元測試的開始,常常在寫測試的時候不知道該如何開始就可以直接在程式碼寫下這三行再開始

https://ithelp.ithome.com.tw/upload/images/20171219/20107209c4eyIcCro2.png

不過這3A到底是甚麼意思呢?

  1. Arrange
    初始化物件、相依物件、方法參數、預期結果或是預期的互動方式
  2. Act
    呼叫被測試的目標物件方法
  3. Assert
    驗證是否符合預期

Note:這一個3A原則最主要是用來輔助撰寫的測試程式碼,讓我們的測試程式碼更好理解。

https://ithelp.ithome.com.tw/upload/images/20171219/20107209O4qPytjiIa.png

談點常常看到的情形

當然,在這一個巨大的開發世界中,我們常常會遇到某些單元會覺得也太大一個了吧!!(跟我現在的肚子一樣)

這些一開始嬌小可愛的「單元」就跟剛開始交往的女/男朋友一樣,好看,好維護,好測試。
只要一不注意,這些嬌小可愛的「單元」就會像交往多年的女/男朋友一樣,經過每一次的需求或版本的更新 (吃飯、出遊),不知不覺就變大、變肥、變得不好維護和測試了,不過只要有愛(錢、薪水)就可以把這個單元(感情?)繼續更新和維護下去。
不是大隻就是不好,而是「不健康」。 (如果你跟成吉思汗館長一樣壯碩大隻那另當別論了),程式碼就跟人一樣,太肥就會讓人覺得「不健康」。

通常看到這一些變肥的單元,我們必須要想辦法把它拆解,重構,讓這些單元「可測試化」,但我們這一次要說的主題是預防寫出難以「可測試」的程式,所以我們需要TDD來幫助我們寫出「可測試」的程式。
(廢話 不能測試的話 就沒辦法開發了啊XDDDD

我們,下一篇見!


上一篇
Day 1. 動機-自我挑戰的開始。
下一篇
Day3. 來談一點點的測試
系列文
TDD - 紅燈,綠燈,重構,30天 TDD之路有你有我30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言