这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

测试

保证系统的稳定性,找出bug并减少bug,防止出现重大安全事故。

单元测试

image-20230116205706844

单元测试规则

  • 所有测试文件以_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()
        }
    })
}

总结

以后听课还是要跟着老师写代码,不然很容易犯困而且也理解不了,记笔记真的是一个帮助我理解知识的一个很好的手段,明天开始,所有内容都要记录!

最后修改:2023 年 06 月 07 日
如果觉得我的文章对你有用,请随意赞赏