Go提供了一套輕量級的測試框架。
需要進行單元測試的文件命明規則如下:在需要測試的包下面創建以“_test”結尾的go文件。如下圖,在包Simplemath下建立了add.go和stack.go兩個go文件,它們各自的測試文件是add_test.go和stack_test.go。
Go的單元測試函數分爲功能測試函數和性能測試函數。這裏先說功能性測試函數。
測試函數的聲明要以TestXXX的形式開頭,並且形參爲 (t *testing.T)。比如兩個文件和其對應的測試文件。在測試函數中,可以使用t.Errorf打印錯誤信息。
package Simplemath
func Add(a, b int) int {
return a + b
}
package Simplemath
import "testing"
func TestAdd(t *testing.T) {
re:=Add(1,1)
if re!=3{
t.Errorf("Add 方法出錯了!")
}
}
package Simplemath
import "fmt"
type Stack struct {
arr []interface{}
}
func (s *Stack) CreateStack() *Stack {
s.arr = []interface{}{}
return s
}
func (s *Stack) push(a interface{}) {
s.arr = append(s.arr, a)
}
func (s *Stack) pop() (a interface{}, error error) {
if len(s.arr) == 0 {
//fmt.Errorf可以打印錯誤信息
error = fmt.Errorf("棧中沒有元素")
}
a = s.arr[len(s.arr)-1]
s.arr = s.arr[:len(s.arr)-1]
return
//return a,error
}
package Simplemath
import "testing"
//可以對方法分開測試,
//也可以對方法進行整體測試,這個時候需要考慮整體的輸出結果,包括前面的處理,不是隻考慮方法中
var stack Stack
func TestStack_CreateStack(t *testing.T) {
stack.CreateStack()
if stack.arr==nil{
t.Errorf("初始化失敗")
}
}
func TestStack_push(t *testing.T) {
stack.push(1)
stack.push(2)
stack.push(3)
if len(stack.arr)!=3{
t.Errorf("入棧失敗!")
}
}
func TestStack_Pop(t *testing.T) {
stack.push(1)
stack.push(1)
stack.push(1)
stack.pop()
stack.pop()
if len(stack.arr)!=3{
t.Errorf("出棧失敗!")
}
}
在命令行測試的時候,可以在IDE中進行測試,也可以在通過命令行測試,這裏主要講命令行測試。
在測試之前首先要確保將項目根目錄路徑加入了GOPATH,可以使用go env 命令查看是否設置了。比如我的項目名爲FristGo,則GOPATH=C:\Users\27124\IdeaProjects\FristGo。
在單元測試的時候,可以對整個包測試,對某個文件測試,對某個文件的某個方法測試。下面分別講下具體方法。
(1)對包進行測試
之後進入到剛設置的目錄中,在該路徑的任何子路徑下都能對整個包進行測試,比如這裏對Simplmath進行測試。
對整個包中所有測試文件進行測試格式:go test + 包名
(2)對某個文件進行測試
在對文件進行測試的時候,要注意兩點:
- 需要進入具體的包,不然會提示錯誤,如下圖。
- 使用go test -v add_test.go add.go 的格式進行測試。即要加上源文件
- 測試的結果是各個函數連續測試的結果,不是單獨測試的結果,也就是說,上一個方法的處理結果會繼續用到下一個方法
(3)對某個文件的某個函數進行測試
在對某個文件的某個方法進行測試的時候,也許要注意兩點:
- 需要進入具體的包,不然會提示錯誤,如下圖。
- 使用 go test -v -test.run TestRefreshAccessToken 的格式進行測試。