惟有牺牲多壮志,敢叫日月换新天
昨天的天气可以说是变幻无常,上午的时候还尚属晴空,下午的时候却阴雨连绵,似乎不像是之前已经熟悉的一年下雨的天数屈指可数的城市。但是无论是多恶劣的天气,似乎也浇不灭广场上的参与者的热情,百年盛典,余有荣焉。
单元测试的格式
假如处于各种各样的原因,我们需要针对我们代码中的一部分展开单元测试,比如待测试的代码写在xxx.go里面,那么我们的测试文件需要命名为xxx_test.go,测试的方法需要以TestXxx开头,且输入的参数类型有且只有一个,*testing.T,基准测试的参数类型有且只有一个,参数的类型为 *testing.B,还有一种作用类似与钩子函数的TestMain测试,参数的类型为 *testing.M,
1、基本测试
基本测试的案例就是通用化的测试案例,下面就是一个使用通用基本测试的案例。
//demo.go
package main
func Add(a int, b int) int {
return a + b
}
//demo_test.go
package main
import "testing"
func TestAdd(t *testing.T) {
if res := Add(1, 2); res != 3 {
t.Errorf("1 + 2 should be 3, but got %d", res)
}
}
复制代码
2、子测试
所谓子测试,就是在一个基本的测试案例里面能够共用这个函数的相关条件,针对各种可能出现的情况,分别写一个测试的案例,不需要重新写一个新的函数进行测试。
func TestAdd(t *testing.T) {
if res := Add(1, 2); res != 3 {
t.Errorf("1+2 should be 3 but got %d", res)
}
//展示子测试
t.Run("test1", func(t *testing.T) {
if Add(1, 2) != 3 {
t.Fatal("fail")
}
})
t.Run("test2", func(t *testing.T) {
if Add(1, 2) != 4 {
t.Fatal("fail")
}
})
}
复制代码
3、基准测试
有的时候针对部分代码的执行的效率有一定的要求,我们可能会用到基准测试这个单元测试的方式,与普通的测试方法不同的是,函数名称格式为BenchmarkXxx,参数类型为*testing.B。
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
fmt.Sprintf("hello")
}
}
//执行的结果
goos: linux
goarch: amd64
pkg: code/test
cpu: Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz
BenchmarkAdd
BenchmarkAdd-12 26346091 46.98 ns/op
PASS
复制代码
4、钩子函数测试
有的时候我们执行在执行相关的单元测试之前需要初始化一些相关的资源,后者是在执行完毕之后还需要在执行一些程序,起到类似钩子函数的作用,在这样的情形下,就需要用到*testing.M参数类型的单元测试。
func setup() {
fmt.Println("开始测试......")
}
func teardown() {
fmt.Println("结束测试......")
}
func TestAdd(t *testing.T) {
if res := Add(1, 2); res != 3 {
t.Errorf("1+2 should be 3 but got %d", res)
}
}
func TestMain(m *testing.M) {
setup()
code := m.Run()
teardown()
os.Exit(code)
}
//执行的结果是
开始测试......
=== RUN TestAdd
--- PASS: TestAdd (0.00s)
PASS
结束测试......
复制代码
单元测试命令
go是一门系统性的语言,能被称之为系统性的语言,那对命令行的支持肯定少不了,因此单元测试的命令也有一些需要掌握。
//执行当前包下所有的单元测试
go test
//执行所有单元测试的结果
go test -v
//查看单元测试的用例覆盖率
go test -cover
//执行指定的单元测试案例
go test -run TestXxx -v
复制代码
小结
go单元测试的内容总结的大概就是这些,可能有没有设计到的,后续视情况进行补充,希望单元测试的知识点能帮助到有需要的人。
有疑问加站长微信联系(非本文作者)