GO第二站 | 青训营

36 阅读1分钟

Go语言工程实践之测试

回归测试 | 集成测试 | 单元测试

单元测试

1.组成:

保证质量:输入——>测试单元(函数, 模块......)——>输出——>校

提升效率:——————————期 望———————————>对

保证质量:整体测试跑通,新代码并不破坏原有代码 提升效率:定义问题更容易

2.所有测试文件以_test.go结尾

3.func TestXxx(t *testing.T)

4.初始化逻辑放到TestMain(m *testing.M)

举例: HelloTom.go

package main

func HelloTom() string{
   return "Jerry"
}
func mork_hello() string{
   //读取本地文件
   return "有依赖"
}
func process_mork() string{
   line :=mork_hello()
   return line+"new"
}

5.覆盖率: go test HelloTom.go HelloTom_test.go --cover

计算覆盖率coverage:代码行验证率,所以要提升代码完备性

一般覆盖率:50%~60%,较高80%

6.测试分支相互独立,全面覆盖

7.测试单元粒度足够小,函数单一职责

8.依赖

image.png 外部依赖——>稳定&幂等

9.Mock:打桩:用函数a替换函数b,a被称为打桩函数,b被称为原函数,实现脱离强依赖。

package main

import (
   "bou.ke/monkey"
   "github.com/stretchr/testify/assert"
   "testing"
)


func TestHelloTom1(t *testing.T) {
   tests := []struct {
      name string
      want string
   }{
      // TODO: Add test cases.
      {"the first test",
      "Jerry"},
   }
   for _, tt := range tests {
      t.Run(tt.name, func(t *testing.T) {
         if got := HelloTom(); got == tt.want {//对HelloTom有本地依赖
            t.Errorf("HelloTom() = %v, want %v", got, tt.want)
         }
      })
   }
}

func Test_process_mork(t *testing.T) {
   monkey.Patch(mork_hello,func() string{
      return "无需依赖本地文件"
   })

   line:=process_mork()
   assert.Equal(t,"无需依赖本地文件new",line)
   defer monkey.Unpatch(mork_hello)
}

10.基准测试 通过设计合理的测试方法,选用合适的测试工具和被测系统,实现对某个特定目标场景的某项性能指标进行定量的和可对比的测试。

11.项目实战

image.png

(1)E-R图

image.png