0%

Go单元测试

    在Go语言中有一个很有好的东西,就是Go本身自带有一套完整的单元测试和性能测试系统,开发者只是需要添加很少的一个代码就可以完成一个单元的测试。

    我们在对应的单元模块下面执行 go test命令,那么Go本身会自己读取源码目录下面对应的名字为*_test.go的文件,生成并运行对应的测试可用的可执行文件。单元测试我们可以知道单元函数或者模块的一个运行情况,性能测试系统也可以给我们输出我们的代码的一个基本的性能数据,帮助我们分析性能问题。

image-20210313060643759
  • 单元测试源码文件可以由多个测试用例组成,每个测试用例函数名都需要以Test作为前缀,如 func TestXXX(t *testing.T)
  • 测试文件在编译时候不会参与正常的源码编译。
  • 测试用例通过执行go test命令自动执行。
  • 如果想要获取更多的测试信息,可以执行命令go test -v

下面是一份单元测试源文件和对应的单元测试用例代码示例:

user.go文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package model

import (
"fmt"
"goProject/goBooks/utils"
)

// User结构体
type User struct{
ID int
Username string
Password string
Email string
}

// 添加User方法1,带预编译的方法
func (user *User)AddUser() error{

sqlStr := "insert into users(username, password, email) values (?, ?, ?)"
inStmt, err := utils.Db.Prepare(sqlStr)
if err != nil{
fmt.Println("预编译异常:", err)
return err
}
_, err2 := inStmt.Exec("admin", "123456", "lpyuan21@gmail.com")
if err2 != nil{
fmt.Println("执行出现异常: ", err2)
return err
}

return nil
}

// 添加User方法2,不带预编译的方法
func (user *User)AddUser1() error{

sqlStr := "insert into users(username, password, email) values (?, ?, ?)"
_ , err:= utils.Db.Exec(sqlStr, "lpyuan", "123456", "lpyuan21@outlook.com")
if err != nil {
fmt.Println("Exec Error:", err)
}

return nil
}

user_test.go文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package model

import (
"fmt"
"testing"
)

// 可以在测试函数开始执行之前做一些其他的操作
func TestMain(m *testing.M){
fmt.Println("测试开始:")
m.Run()
}

// 测试主方法
func TestUser(t *testing.T){
fmt.Println("测试User")
// 通过调用t.Run可以调用测试用例中不是以Test前缀开头的函数
t.Run("测试添加用户程序:", testAddUser)
}

// 测试子方法,如果函数名字不是以Test开头,那么该函数默认不会执行,
// 我们可以将它设置成为一个子测试函数
func testAddUser(t *testing.T){
fmt.Println("测试添加用户: ")
user := &User{}
// 调用
_ = user.AddUser()
_ = user.AddUser1()
}

Reference

[1] 引用参考~

小主,路过打个赏再走呗~