本部分内容记录下 golang 中的单元测试的简单用法。
单元测试的重点在于测试代码的逻辑、场景等,以便尽可能地测试全面,保证代码质量。
编写简单的代码说明下单元测试的基本使用方法
编写主程序文件 test/main.go
1
2
3
4
5
6
7
8
9
10
11
12
|
package main
import "fmt"
func main() {
sum := Add(10, 20)
fmt.Println(sum)
}
func Add(x int, y int) int {
return x + y
}
|
编写单元测试文件 test/main_test.go
1
2
3
4
5
6
7
8
9
10
11
12
|
package main
import "testing"
func TestAdd(t *testing.T) {
sum := Add(10, 20)
if sum == 30 {
t.Log("ok")
} else {
t.Error("error")
}
}
|
运行测试命令
1
2
3
4
5
6
7
8
|
wanghuans-MacBook-Pro:test wanghuan$ pwd
/Users/wanghuan/GolandProjects/GoPath/src/github.com/xdhuxc/xgoland/test
wanghuans-MacBook-Pro:test wanghuan$ go test -v
=== RUN TestAdd
--- PASS: TestAdd (0.00s)
main_test.go:8: ok
PASS
ok github.com/xdhuxc/xgoland/test 0.005s
|
1、含有单元测试代码的 go 文件必须以 _test.go
结尾,比如测试 main.go
的单元测试文件命名为 main_test.go
,Go 语言测试工具只认符合该规则的文件。
2、单元测试文件名 _test.go
前面的部分最好是被测试的方法所在 go 文件的文件名,比如 main_test.go
,因为我们要测试的 Add 函数在 main.go
文件里
3、单元测试的函数名必须以 Test
开头,是可导出的公共函数。
4、测试函数的签名必须接收一个指向 testing.T 类型的指针,并且不能返回任何值。
5、函数名建议命名为 Test 加要测试的方法函数名,表示要测试该函数。
表组测试指的是一次测试中很多个输入输出场景的测试,例如
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
func TestAdd(t *testing.T) {
sum := Add(10, 20)
if sum == 30 {
t.Log("ok")
} else {
t.Error("error")
}
sum = Add(1024, 2048)
if sum == 3072 {
t.Log("ok")
} else {
t.Error("error")
}
}
|
我们为待测试函数 Add() 准备了两组测试数据 10、20 和 1024、2048,这样就可以测试多个输入场景下的测试效果了。
将各个测试函数共用的变量定义为全局变量,在 init() 函数中进行初始化,在各个测试函数中进行使用。
编写测试代码如下: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
30
31
32
33
34
35
36
37
38
|
import (
"fmt"
"testing"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql" # 如果没有导入此句,会报错。
"gitlab.xdhuxc.com/golang-user/src/models"
)
var db *gorm.DB
var us *userService
func init() {
uri := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local",
"root",
"abcd@#129",
"127.0.0.9",
"user")
db, _ := gorm.Open("mysql", uri)
db.Debug()
us := newUserService(db)
}
func Test_UserService_List(t *testing.T) {
count, users, err := us.List(models.Page{ # List 为分页方法
Offset: 0,
PageSize: 30,
})
if err != nil {
t.Error(err)
} else {
t.Log(count)
for _, user := range users {
fmt.Println(user.String())
}
}
}
|
跳转至 user_test.go 脚本目录下,执行如下命令:
1
|
go test --run Test_UserService_List
|
https://www.jianshu.com/p/1adc69468b6f
https://www.flysnow.org/2017/05/16/go-in-action-go-unit-test.html