先看乙個需求
在我們工作中,我們會遇到這樣的情況,就是去確認乙個函式,或者乙個模組的結果是否正確.
傳統的方法
15.2.1 傳統的方式來進行測試
在 main 函式中,呼叫 addupper 函式,看看實際輸出的結果是否和預期的結果一致,如果一致,
則說明函式正確,否則函式有錯誤,然後修改錯誤
不方便, 我們需要在 main 函式中去呼叫,這樣就需要去修改 main 函式,如果現在專案正在運
行,就可能去停止專案。
不利於管理,因為當我們測試多個函式或者多個模組時,都需要寫在 main 函式,不利於我們管
理和清晰我們思路
引出單元測試。-> testing 測試框架 可以很好解決問題。
go 語言中自帶有乙個輕量級的測試框架 testing 和自帶的 go test 命令來實現單元測試和效能測試,
testing 框架和其他語言中的測試框架類似,可以基於這個框架寫針對相應函式的測試用例,也可以基
於該框架寫相應的壓力測試用例。通過單元測試,可以解決如下問題
確保 每個函式是可執行,並且執行結果是正確的
確保寫出來的** 效能是好的,
單元測試能及時的發現程式設計或實現的 邏輯錯誤,使問題及早暴露,便於問題的定位解決,
而 效能測試的重點在於發現程式設計上的一些問題,讓程式能夠在高併發的情況下還能保持穩定
使用 go 的單元測試,對 addupper 和 sub 函式進行測試。
特別說明: 測試時,可能需要暫時退出 360。(因為 360 可能會認為生成的測試用例程式是木馬)
單元測試快速入門總結
測試用例檔名必須以 _test.go 結尾。 比如 cal_test.go , cal 不是固定的。
測試用例函式必須以 test 開頭,一般來說就是 test+被測試的函式名,比如 testaddupper
testaddupper(t *tesing.t) 的形參型別必須是 *testing.t 【看一下手冊】
乙個測試用例檔案中,可以有多個測試用例函式,比如 testaddupper、testsub
執行測試用例指令
(1) cmd>go test [如果執行正確,無日誌,錯誤時,會輸出日誌]
(2) cmd>go test -v [執行正確或是錯誤,都輸出日誌]
當出現錯誤時,可以使用 t.fatalf 來格式化輸出錯誤資訊,並退出程式
t.logf 方法可以輸出相應的日誌
測試用例函式,並沒有放在 main 函式中,也執行了,這就是測試用例的方便之處.
pass 表示測試用例執行成功,fail 表示測試用例執行失敗
測試單個檔案,一定要帶上被測試的原檔案
go test -v cal_test.go cal.go
測試單個方法
go test -v -test.run testaddupper
main包中:main.go
package main
import (
_ "fmt"
)//乙個被測試函式
func addupper(n int) int
return res
}func addupper2(n int) int
return res
}func main() else
}
text包中:cal_test.go
package cal
import (
"fmt"
"testing" //引入go 的testing框架包
)//編寫要給測試用例,去測試addupper是否正確
func testaddupper(t *testing.t)
//如果正確,輸出日誌
t.logf("addupper(10) 執行正確...")
}func testhello(t *testing.t)
text包中:sub_test.go
package cal
import (
_ "fmt"
"testing" //引入go 的testing框架包
)//編寫要給測試用例,去測試addupper是否正確
func testgetsub(t *testing.t)
//如果正確,輸出日誌
t.logf("getsub(10, 3) 執行正確!!!!...")
}
text包中:cal.go
package cal
//乙個被測試函式
func addupper(n int) int
return res
}//求兩個數的查
func getsub(n1 int, n2 int) int
以下兩個檔案處在乙個包中:
monster.go:
package monster
import (
"encoding/json"
"io/ioutil"
"fmt"
)type monster struct
//給monster繫結方法store, 可以將乙個monster變數(物件),序列化後儲存到檔案中
func (this *monster) store() bool
//儲存到檔案
filepath := "d:/monster.ser"
err = ioutil.writefile(filepath, data, 0666)
if err != nil
return true
}//給monster繫結方法restore, 可以將乙個序列化的monster,從檔案中讀取,
//並反序列化為monster物件,檢查反序列化,名字正確
func (this *monster) restore() bool
//2.使用讀取到data byte ,對反序列化
err = json.unmarshal(data, this)
if err != nil
return true
}
monster_test.go:
package monster
import (
"testing"
)//測試用例,測試 store 方法
func teststore(t *testing.t)
res := monster.store()
if !res
t.logf("monster.store() 測試成功!")
}func testrestore(t *testing.t)
res := monster.restore()
if !res
//進一步判斷
if monster.name != "紅孩兒"
t.logf("monster.restore() 測試成功!")
}
go單元測試
go本身提供了一套輕量級的測試框架。mytest工程下有兩個檔案 main.go package main func main func add a,b int intmain test.go package main import testing func testadd1 t testing.t...
Go單元測試
對包含網路請求和響應的函式進行單元測試需要我們模擬客戶端請求和服務端返回。以乙個登入模組為例,main.go檔案如下 其中的重點是利用 http.newrequest構造乙個虛擬的http get請求,再用httptest.newrecorder 建立http.responesewriter,模擬真...
Go單元測試
go單元測試 1.使用testing框架 1.1.go test 如果執行正確,無日誌.錯誤時,會輸出日誌 1.2.go test v 執行正確或錯誤都會輸出日誌 1.3.當出現錯誤時,可以使用t.fatalf 來格式化輸出錯誤資訊,並退出日誌 1.4.t.logf 方法可以輸出相應的日誌 1.5....