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

68 阅读2分钟

事故

  • 营销配置错误,导致非预期用户享受权益
  • 用户提现,幂等失效,短时间可以多次提现
  • 代码逻辑错误,广告位被占,无法展示广告
  • 代码指针错误,导致APP不可用

测试

  • 回归测试
  • 集成测试
  • 单元测试 从上到下,覆盖率逐渐变大,成本却逐渐降低

单元测试

输入测试单元,将输出与期望校对。能够保证质量,提升效率。

单元测试-规则

  • 所有测试文件以_test.go 结尾
  • func TestXxx(*testing.T)
  • 初始化逻辑放到TestMain中

单元测试-例子

func HelloTom() string {
   return "jerry"
}
func TestHelloTom(t *testing.T) {
   output := HelloTom()
   expect := "tom"
   if output != expect {
      t.Errorf("Expected %s do not match actual %s", expect, output)
   }
}

单元测试-assert

先输入一下代码获取assert包 go get github.com/stretchr/testify/assert

  • main.go
package main

func HelloTom() string {
   return "jerry"
}
  • main_test.go
package main

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

func TestHelloTom(t *testing.T) {
   output := HelloTom()
   expect := "tom"
   assert.Equal(t, expect, output)
}

运行main_test.go

=== RUN   TestHelloTom
    main_test.go:11: 
        	Error Trace:	D:/GoProjects/src/zijietiaodong/main_test.go:11
        	Error:      	Not equal: 
        	            	expected: "tom"
        	            	actual  : "jerry"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -1 +1 @@
        	            	-tom
        	            	+jerry
        	Test:       	TestHelloTom
--- FAIL: TestHelloTom (0.00s)


预期:tom
实际:jerry
<点击以查看差异>


FAIL

单元测试-覆盖率

  • 如何衡量代码是否经过了足够的测试?如何评价项目的测试水准?
  • 如何评估项目是否达到了高水准测试等级?
  • 如何评估项目是否达到了高水准测试等级? 用代码覆盖率评价
  • 代码
  • main.go
package main

func JudgePassLine(score int64) bool {
   if score >= 60 {
      return true
   }
   return false
}
  • main_test.go
package main

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

func TestJudgePassLine(t *testing.T) {
   isPass := JudgePassLine(70)
   assert.Equal(t, true, isPass)
}
  • output
=== RUN   TestJudgePassLine
--- PASS: TestJudgePassLine (0.00s)
PASS

coverage: 66.7% of statements in ./...
  • 覆盖率计算为使用到了代码占所有代码行数的比例

单元测试-Tips

  • 一般覆盖率为 50%~60%,较高80%
  • 测试分支相互独立,全面覆盖
  • 测试单元粒度足够小,函数单一职责

单元测试-依赖

外部依赖 ==》稳定&幂等

  • 幂等:重复运行一个单元,结果是一样
  • 稳定:在任何情况运行都能正常 image.png

单元测试-Mock

  • monkey: github.com/bouk/monkey
  • 可以为一个函数打桩,即使用一个函数替换另一个函数
  • Patch UnPatch

基准测试

  • 优化代码,需要对代码进行分析
  • 内置的测试框架提供了基准测试的能力

基准测试例子

image.png image.png