测试
从上到下,覆盖率逐层变大,成本却逐层降低,这就是测试金字塔的思想。
- 回归测试:回归测试是QA手动通过终端回归一些固定的主流程场景
- 集成测试:集成测试是在CI/CD流程中,对系统功能维度进行测试,保证系统功能的正确性
- 单元测试:单元测试是在开发阶段,对代码逻辑进行测试,保证代码的正确性
1. 单元测试
- 单元测试规则
- 测试用例文件名必须以_test.go结尾
- func TestXxx(*testing.T)
- 初始化逻辑放到TestMain(m *testing.M)中
例如:
- judgment.go
package test
func JudgePassLine(score int16) bool {
if score >= 60 {
return true
}
return false
}
- judgment_test.go
package test
import (
"github.com/stretchr/testify/assert"
"testing"
)
func TestJudgePassLineTrue(t *testing.T) {
isPass := JudgePassLine(70)
//assert是断言,断言isPass的值为true
assert.Equal(t, true, isPass)
}
func TestJudgePassLineFail(t *testing.T) {
isPass := JudgePassLine(50)
assert.Equal(t, false, isPass)
}
1.1 覆盖率
如何衡量代码是否经过了足够的测试? 如何评价项目的测试水平?
go test judgment_test.go judgment.go --cover
输入为70,执行单侧,指定cover参数,覆盖率为66.7%,因为只执行了两行代码
- 一般覆盖率:50%~60%,较高覆盖率:80+%
- 测试分支相互独立,全面覆盖
- 测试单元力度足够小,函数单一职责
1.2 依赖
单元测试需要保证稳定性和幂等性。要实现这一目的,就需要mock机制。
- 稳定:相互隔离,能在任何时间,任何环境,运行测试
- 幂等:多次运行,结果一致
1.3 Mock测试
-
为一个函数打桩,不依赖本地文件
-
mock_test.go
func TestProcessFirstLineWithMock(t *testing.T) {
//为ReadFirstLine()打桩 一直返回line110
monkey.Patch(ReadFirstLine, func() string {
return "line110"
})
defer monkey.Unpatch(ReadFirstLine) //取消打桩
line := ProcessFirstLine()
assert.Equal(t, "line000", line)
}
2.基准测试
- 优化代码,需要对当前代码分析
- 内置的测试框架提供了基准测试的能力