事故
- 营销配置错误,导致非预期用户享受权益
- 用户提现,幂等失效,短时间可以多次提现
- 代码逻辑错误,广告位被占,无法展示广告
- 代码指针错误,导致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%
- 测试分支相互独立,全面覆盖
- 测试单元粒度足够小,函数单一职责
单元测试-依赖
外部依赖 ==》稳定&幂等
- 幂等:重复运行一个单元,结果是一样
- 稳定:在任何情况运行都能正常
单元测试-Mock
- monkey: github.com/bouk/monkey
- 可以为一个函数打桩,即使用一个函数替换另一个函数
- Patch UnPatch
基准测试
- 优化代码,需要对代码进行分析
- 内置的测试框架提供了基准测试的能力
基准测试例子