常常看到電視節目中會有許多的社會實驗,通過各種不同的情境測試來測試人的反應如何,從這樣的測試中就可以看出不同人的人品如何,可以通過測試來驗證人品,當然也可以通過測試來驗證軟體品質。
軟體的品質要好,就是要可以通過各式各樣情境的測試,不管是正常的測試或是故意輸入錯誤的參數等等,可以通過驗證的軟體才是好的軟體。
一般我們在開發的時候都會透過 debug
測試功能與參數是否有誤,但是我們可以思考看看,當 A功能 完成開發了,後續在開發 B功能 時,B功能 的程式有可能會影響到 A功能的結果,但這時候我們不可能每次都重新去手動測試以前寫完的程式功能是否有誤,這時候 單元測試
就顯得格外的重要了,今天就讓我們好好來聊聊單元測試吧!
單元測試是從英文的 Unit Test
所翻譯過來的,所謂的 Unit
就是最小的單位,在程式裡面可以當作是 方法
或 類別
,因此單元測試基本上為測試我們在程式裡面撰寫的每個方法及類別邏輯是否正確。
在 Go 中寫單元測試,基本上就是將測試檔案
放在與要被測試的程式檔
相同資料夾底下,單元測試檔案名稱為 測試檔名_test.go
,例如我們有一個檔案名為 cal.go
,那麼對於這個檔案的單元測試檔就為 cal_test.go
。
首先,我們有一個名為 cal
的 package 裡面包含著 Add
方法,並且儲存為 cal.go
:
package cal
func Add(x, y int) int {
return x + y
}
我們要對 Add
這個方法撰寫單元測試,首先我們先編輯 cal_test.go
,定義好 package 名稱與測試方法,由於 Go 原生就有提供測試方法,因此只要將 testing
進行 import 即可。
package cal
import (
"testing"
)
接著我們要撰寫測試案例,通常我會定義好 input
與 output
,就是與先設定好輸入什麼參數會有什麼結果。
var (
input = [][]int{
{1, 2},
{2, 3},
{3, 4},
}
output = []int{3, 5, 7}
)
定義好測試案例後,接著來到今天的主軸,我們對 Add
方法進行單元測試,因此檔名我們命名為 TestAdd
,這邊會有 *testing.T
當作參數,這邊提供了有 Log
方法與 Error
方法。
我們將測試案例用迴圈一個一個測試,測試不過就透過 Error
方法拋出錯誤。
func TestAdd(t *testing.T) {
for i, in := range input {
result := Add(in[0], in[1])
t.Log("in =", in, "output should be", output[i], " actual output equal", result)
if output[i] == result {
t.Log("Pass")
} else {
t.Error("Case", i, "is failed")
}
}
}
以上這樣就完成了一個基本的單元測試拉!
最後我們可以透過 go test -v
的指令做單元測試,測試結果如下
=== RUN TestAdd
TestAdd: cal_test.go:19: in = [1 2] output should be 3 actual output equal 3
TestAdd: cal_test.go:21: Pass
TestAdd: cal_test.go:19: in = [2 3] output should be 5 actual output equal 5
TestAdd: cal_test.go:21: Pass
TestAdd: cal_test.go:19: in = [3 4] output should be 7 actual output equal 7
TestAdd: cal_test.go:21: Pass
--- PASS: TestAdd (0.00s)
PASS
ok anonymous_chat/cal 0.098s
如果想要看到單元測試的 覆蓋率
,可以加入 -cover
參數,結果如下
=== RUN TestAdd
TestAdd: cal_test.go:19: in = [1 2] output should be 3 actual output equal 3
TestAdd: cal_test.go:21: Pass
TestAdd: cal_test.go:19: in = [2 3] output should be 5 actual output equal 5
TestAdd: cal_test.go:21: Pass
TestAdd: cal_test.go:19: in = [3 4] output should be 7 actual output equal 7
TestAdd: cal_test.go:21: Pass
--- PASS: TestAdd (0.00s)
PASS
coverage: 100.0% of statements
ok anonymous_chat/cal 0.171s
這樣就完成了簡單的單元測試拉
單元測試對於軟體品質是不可或缺的一環,基本上在開發的過程中會要求單元是的覆蓋率至少要達到 80%
以上,這樣才能確保程式每次的輸出的結果不會有問題。