这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
测试
保证系统的稳定性,找出bug并减少bug,防止出现重大安全事故。
单元测试
单元测试规则
- 所有测试文件以_test.go结尾
- 函数形式为func TestXxx(t *testing.T)
- 初始化逻辑放到TestMain中
一个十分简单举例
hello.go
注意函数必须要大写,否则无法测试(刚刚忘记大写,一直不知道怎么回事-_-)
package main
import "fmt"
func Hello() {
fmt.Println("hello")
}
hello_test.go
package main
import "testing"
func TestHello(t *testing.T) {
Hello()
}
除此之外还有一个func TestMain(m *testing.M)
函数,其可以帮我们先进行测试之前的一些前置工作,然后执行m.Run()
,就会执行其余的测试单例。
代码覆盖率
简单点来说就是测试运行的行数占总代码的比例。
使用方法:
go test .\pass_test.go .\pass.go --cover
要求:一般50%~60%,较高覆盖率80%+。
单元测试的目标
- 幂等:重复测试一个case,结果不变。
- 稳定:单元测试相互隔离,能够在任何时间、任何函数运行。
Mock测试
Mock机制:实现单元测试目标
使用mokey包:https://github.com/bouk/monkey
Mock函数:为一个函数或方法打桩。
什么是打桩呢?听起来很迷,其实很简单~
打桩:用我们的一个打桩函数a去替换原来的函数b,目的是去掉一些不影响的测试的变量。
安桩: Patch(target,replacement)
卸桩:Unpatch(target)
基准测试
测试一段程序运行的性能和cpu的损耗。
举个例子
select.go
package main
import "github.com/valyala/fastrand"
var ServerIndex [10]int
func InitServer() {
for i := 0; i < 10; i++ {
ServerIndex[i] = i + 100
}
}
func Select() int {
//在高并发的情况下推荐使用fastrand速度更快
// go get github.com/detailyang/fastrand-go
return ServerIndex[fastrand.Uint32n(10)]
}
select_test.go
package main
import "testing"
//基准测试函数书写规则
func BenchmarkSelect(b *testing.B) {
InitServer()
//初始化时间不算在性能之类
b.ResetTimer()
for i := 0; i < b.N; i++ {
Select()
}
}
//并发测试
func BenchmarkSelectParallel(b *testing.B) {
InitServer()
b.ResetTimer()
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
Select()
}
})
}
总结
以后听课还是要跟着老师写代码,不然很容易犯困而且也理解不了,记笔记真的是一个帮助我理解知识的一个很好的手段,明天开始,所有内容都要记录!