作者:徐銘鴻/有勁生物科技

 

  對於寫程式的人來說,error和各種bug的出現應該司空見慣。如果是行數較少的小程式,要找出錯誤進行修正倒也還算簡單,但是碰到的程式如果有上千行的話,怎麼辦呢?光是找出錯誤可能就得費上半天光景。從另一方面來看,當程式的規模變大時,受到個人寫程式的習慣與熟練度影響,一些自己不易察覺出的錯誤很容易就會出現。為了預防發生這種情況,單元測試 (Unit test)1 可說是程式開發流程中不可或缺的步驟。

 

 

圖一、單元測試的目的

180613_1.png

單元測試就像工廠的產品測試,產品要確認合格之後,才能安心賣出 (圖片來源:Sergey Kolodiy. Toptal Press Center. (2015) Retrieved from https://www.toptal.com/qa/how-to-write-testable-code-and-why-it-matters)

 

 

【單元測試到底是什麼?】

  單元測試本身也是一個程式,它的功能就是用來測試確定其它程式能不能正常運作。單元測試會將參數傳入想要測試的程式中,然後檢查程式執行產出的結果是否符合預期。如果能夠得到和預期相同的結果,就表示這個程式通過測試,可以正確執行。一般來說,最簡單理想的開發流程應該如下圖二2所示:

 

 

圖二、理想的單元測試開發循環

180613_2.png

單元測試的開發循環流程由左上角開始,依序為決定需求à開發單元測試à開發程式並測試à發布。(圖片來源:Grant McLean. (2008 Sep) An Introduction to Test Driven Development Using Perl. Retrieved from https://www.mclean.net.nz/osdc-tdd-full.pdf)

 

 

在這裡,筆者用簡單的例子來做說明。假設我們需要寫一個程式A來計算某數字的三次方,步驟可以分為以下幾個:

 

1、確立需求:撰寫一個程式A,功能為讀取一個數字,並且回傳該數字的三次方。

2、撰寫單元測試:在開始撰寫程式A之前,我們就要先寫好單元測試,然後利用其去執行程式A。在此階段由於程式A尚未完成,所以無法通過單元測試,因此我們應該要得到錯誤訊息的回傳。這麽做的用意是要確認單元測試是否真的可以分辨程式A的正確執行。

3、編寫程式A並執行單元測試:單元測試撰寫完畢,接著再進行程式A的編寫。完成程式A後,便拿單元測試來正式執行程式A。首先,將我們設定好的數字(例如:數字3)傳入程式A,測試在數字傳入之後,程式A是否會進行計算並回傳三次方結果(也就是3的三次方)。如果回傳數值是27,則表示程式A有正確執行。如果不是,就再回過頭修改程式A,並繼續測試直到輸出正確的結果。

4、發布程式A

 

  以上範例是最基本的單元測試方法。當然一般來說,在進行單元測試時也會測試包括「錯誤輸入格式」等其他測試項目。例如:當上述程式A所接收到的輸入值是「文字」時,是會回傳錯誤訊息還是其他數字?這些也都是測試內容的一部分。

 

【單元測試的撰寫】

  一個單元測試只能針對一個函式(function)、一個方法(methods)或一個模組(module)」進行測試,這一點很重要,在撰寫單元測試之初就必須清楚瞭解。也就是說,如果待測程式裡面使用了多個方法時,就需要分別針對每一個方法撰寫各自的單元測試,這樣才能夠保證整個程式裡的每個單元方法都能夠正常運作。3

 

  此外,單元測試的撰寫方法,也會因程式語言的不同而有所出入。以perl為例子,較常使用到的單元測試套件為Test::Simple以及Test::More。4 當然,現在網路上也能找到多種不同套件的用法,可依個人的喜好去選用,筆者就不再贅述。

 

  雖然為了每個單元測試都必須多寫一個程式,實作起來看似比較麻煩些;但其實單元測試的存在,也有助在程式編寫的同時確立目標。尤其在撰寫長篇的程式時,能減少不必要的程式,以最直接的方式完成必要的功能,也能避免之後修改程式的時候產生難以察覺的錯誤,提升程式的整體品質。因此對程式設計者來說,培養撰寫單元測試的好習慣,對程式的開發與維護絕對有很大的幫助。

 

 

 

參考文獻

1.Sergey Kolodiy. Toptal Press Center. (2015) Unit Tests, How to Write Testable Code and Why it Matters. Retrieved from https://www.toptal.com/qa/how-to-write-testable-code-and-why-it-matters

2.Grant McLean. (2008 Sep) An Introduction to Test Driven Development Using Perl. [Web log post]. Retrieved from https://www.mclean.net.nz/osdc-tdd-full.pdf

3.iT邦幫忙。30天快速上手TDD系列第2篇《Unit Testing 簡介》。[Web log post]。檢自:https://ithelp.ithome.com.tw/articles/10102264

4.Jon-Michael Deldin Bioinformatics Lab. (201 Nov 13). Unit Testing in Perl. [Web log post]. Retrieved from http://www.jmdeldin.com/bioinf/testing/index.html

 

 

官網用CC創用_SA.png

arrow
arrow

    Yourgene Health 發表在 痞客邦 留言(0) 人氣()