Go 怎麼寫測試案例
Last updated
package gotest
import (
"testing"
)
func Test_Division_1(t *testing.T) {
if i, e := Division(6, 2); i != 3 || e != nil { //try a unit test on function
t.Error("除法函式測試沒透過") // 如果不是如預期的那麼就報錯
} else {
t.Log("第一個測試通過了") //記錄一些你期望記錄的資訊
}
}
func Test_Division_2(t *testing.T) {
t.Error("就是不透過")
}我們在專案目錄下面執行`go test`,就會顯示如下資訊:
--- FAIL: Test_Division_2 (0.00 seconds)
gotest_test.go:16: 就是不透過
FAIL
exit status 1
FAIL gotest 0.013s
從這個結果顯示測試沒有透過,因為在第二個測試函式中我們寫死了測試不透過的程式碼`t.Error`,那麼我們的第一個函式執行的情況怎麼樣呢?預設情況下執行`go test`是不會顯示測試透過的資訊的,我們需要帶上參數`go test -v`,這樣就會顯示如下資訊:
=== RUN Test_Division_1
--- PASS: Test_Division_1 (0.00 seconds)
gotest_test.go:11: 第一個測試通過了
=== RUN Test_Division_2
--- FAIL: Test_Division_2 (0.00 seconds)
gotest_test.go:16: 就是不透過
FAIL
exit status 1
FAIL gotest 0.012s
上面的輸出詳細的展示了這個測試的過程,我們看到測試函式 1`Test_Division_1` 測試透過,而測試函式 2`Test_Division_2` 測試失敗了,最後得出結論測試不透過。接下來我們把測試函式 2 修改成如下程式碼: func Test_Division_2(t *testing.T) {
if _, e := Division(6, 0); e == nil { //try a unit test on function
t.Error("Division did not work as expected.") // 如果不是如預期的那麼就報錯
} else {
t.Log("one test passed.", e) //記錄一些你期望記錄的資訊
}
}然後我們執行`go test -v`,就顯示如下資訊,測試通過了:
=== RUN Test_Division_1
--- PASS: Test_Division_1 (0.00 seconds)
gotest_test.go:11: 第一個測試通過了
=== RUN Test_Division_2
--- PASS: Test_Division_2 (0.00 seconds)
gotest_test.go:20: one test passed. 除數不能為 0
PASS
ok gotest 0.013s func BenchmarkXXX(b *testing.B) { ... }package gotest
import (
"testing"
)
func Benchmark_Division(b *testing.B) {
for i := 0; i < b.N; i++ { //use b.N for looping
Division(4, 5)
}
}
func Benchmark_TimeConsumingFunction(b *testing.B) {
b.StopTimer() //呼叫該函式停止壓力測試的時間計數
//做一些初始化的工作,例如讀取檔案資料,資料庫連線之類別的,
//這樣這些時間不影響我們測試函式本身的效能
b.StartTimer() //重新開始時間
for i := 0; i < b.N; i++ {
Division(4, 5)
}
}Benchmark_Division-4 500000000 7.76 ns/op 456 B/op 14 allocs/op
Benchmark_TimeConsumingFunction-4 500000000 7.80 ns/op 224 B/op 4 allocs/op
PASS
ok gotest 9.364s