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 的格式进行测试。