Go 语言工程实践之测试| 青训营笔记

37 阅读2分钟

单元测试

规则

  • 所有测试文件以-test.go结尾
  • func TestXxx(t *testing.T)
  • 初始化逻辑放到TestMain中
    func TestMain(m *testing.M){
    // 测试前:数据装载、配置初始化等前置工作
        code := m.Run()
    // 测试后:释放资源等收尾工作
        os.Exit(code)
    }

assert包

获取assert包
`go get github.com/stretchr/testify/assert`
import (
  "testing"
  "github.com/stretchr/testify/assert"
)
func TestSomething(t *testing.T) {
  var a string = "Hello"
  var b string = "Hello"
  
  assert.Equal(t, a, b, "The two words should be the same.")
}

断言允是“assert”包中的全局函数。所有断言函数都将测试框架提供的*testing.T对象作为第一个参数。这允许断言函数将失败和其他详细信息写入正确的位置。每个断言函数还将可选的字符串消息作为最终参数,允许将自定义错误消息附加到断言方法输出的消息中。

代码覆盖率

go test -v -coverprofile=cover.out
  • 一般覆盖率: 50%~60%, 较高覆盖率80%+
  • 测试分支相互独立、全面覆盖
  • 测试单元粒度足够小,函数单一职责

Mock测试

  • 为一个函数打桩
  • 为一个方法打桩 Mock既能出现在单元测试中,也会出现在集成测试、系统测试过程中。其最大的功能是帮助我们把单元测试的耦合分解开,代码对另一个类或者接口有依赖,它能够帮我们模拟这些依赖,并帮我们验证所调用的依赖的行为 通过Mock对函数和方法进行打桩测试,不再依赖本地文件。

基准测试

  • 指定一个时间(默认是1秒),看测试对象在达到时间上限时,最多能被执行多少次和在此期间测试对象内存分配情况。
  • 基准测试的代码文件必须以_test.go结尾
  • 基准测试的函数必须以Benchmark开头
  • 基准测试函数必须接受一个指向Benchmark类型的指针作为唯一参数
  • 基准测试函数不能有返回值
  • b.ResetTimer是重置计时器,这样可以避免for循环之前的初始化代码的干扰
  • 最后的for循环很重要,被测试的代码要放到循环里
  • b.N是基准测试框架提供的,表示循环的次数