iT邦幫忙

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

再戰軟體工程系列 第 4

『等價類劃分法』 -- 談測試的基本:快速建立所有可能案例

撰寫本篇文章是因為在一個讀書會當中,聽到了成員分享邰曉梅老師在著作中提到的觀念,雖然他不是該章節的重點,但是可以快速幫你已安全的方法,列出所有可能的測試案例。這個測試案例,可以不只手動測試適合使用,想要做出高覆蓋率、高品質的單元測試或整合測試,等價類劃分法也可以幫上大忙。

簡單來說,等價類就是找出可以影響測試目標(可能是單一函式,一個模組,或是系統的一個完整功能)的所有變數,同時把程式的邏輯抽出來,最後將這些邏輯一個一個拿出來檢視,看所有變數的值各自落在哪裡時,這個功能會吐出什麼結果。

很難懂嗎?代表你很正常。我們接著往下看:

邏輯抽象化

我們在一次把前文中我的妹妹找對象的例子拿出來,還記得他列出的十個條件嗎?天啊!要為這個程式建立測試真的太可怕了。不過沒關係,我們一項一項看。在這之前,我們來介紹除邏輯以外,等價劃分法另一個觀念:變數。

變數的值

當我們檢視每一個單一變數時,它都可以最粗略地分類成為兩類:

  1. 有效等價類:使邏輯通過檢查的值的集合
  2. 無效等價類:使邏輯不通過檢查的值的集合
    依情況不同,這兩個類還可以再細分為若干子類,但最基本的狀態下,分兩類就夠了。

舉個例子吧!
第一個變數是"有錢",所以isRich的有效等價類就是true,無效等價類就是false。對了!聰明如你,一定就可以應變,舉一反三地知道第二個變數"帥"的有效等價類就是顏值(facePoint)大於90,無效等價類就是90分及以下。

好了,以此類推,你應該就可以接著走下去了。等你把10個條件都列完以後,你應該會得到一個[二元樹]http://btechsmartclass.com/DS/U3_T3.html),就像下圖所示:
https://ithelp.ithome.com.tw/upload/images/20171219/20107429Aqe3c4Zia8.png

**太好了!代表你的資料結構老師沒白教!**如上圖,從I~P都是我們把所有條件都衡量後,所有可能的結果。同時,聰明如你,一定也發現了,就我們這個測試目標的邏輯來說,只要第一個條件無效,後面都不用再看了,也就代表從第二個變數開始所有值都是無效值。如此一來,這棵二元樹就會變成一個非常"偏斜"的樹。如此一來,需要驗測的情況又更少了。太好了!這又代表你的演算法老師沒白教!

好處

  1. 安全:你可以確保所有可能的情況都被考慮到
  2. 精簡:在確保安全的情況下,設計最少數量的測試案例
  3. 覆蓋率:有時候一個等價類可以包含多種可能值,譬如剛剛的顏值 > 90,就有91~100等十種可能值。你大可以每次測試時從這十個值中隨機選一個來執行,以兼顧涵蓋率。

到此打住,我想最粗淺最粗淺的等價類劃分法你已經有了基本概念。上網google有很多資深老司機會教你怎麼應用,這不用我這個半路出家的工程師在這邊班門弄斧。但是!你發現了嗎...

解耦合的價值來了

還記得我們解完波動拳後,又用一篇文章介紹怎麼消除DataClump嗎?忘記沒關係,按我簡單複習一下先。這時,解耦合的價值來了。因為我們用建立Man這個獨立物件的方式來改寫了這段邏輯,除了可讀性增加以外,同時等價類的數量也是一口氣下降到只剩4種喔!怎麼辦到的?很簡單,因為我們已經把所有變數對邏輯的影響藏到同一類別的4個method裡面了,於是你只要討論這四個條件的有效與無效值就可以了。當然,你也可以依樣畫葫地每次都從同一個等價類的可能變數值中random出一組來進行測試,以增加信心。

瞧!解耦合是不是一舉多得!


上一篇
『波動拳消除了,然後呢?』 -- 談Code Smell 辨識與消除
下一篇
『為了做事而做事』 -- 談價值的重要性
系列文
再戰軟體工程30

1 則留言

0
cyrc
iT邦新手 5 級 ‧ 2018-01-29 13:04:57

文內前文的連結(https://ithelp.ithome.com.tw/articles/10191942)點下去是已刪除的QQ
前一篇「『波動拳消除了,然後呢?』 -- 談Code Smell 辨識與消除」也有對不上的情形...

我要留言

立即登入留言