回归测试:测试人员手动模拟终端访问app
集成测试
单元测试
从上到下,覆盖率逐渐变大,成本逐层降低
单元测试
规则
所有测试文件以_test.go几位
测试方法的命名规范为
func TestXxx(*testing.T)
初始化逻辑放在TestMain中
func TestMain(m *testing.M){
//测试前:数据装载、配置初始化等前置工作
code := m.Run)()
//测试后:释放资源等收尾工作
os.Exit(code)
}
案例
创建HelloTom_test.go文件
package main
import "testing"
//业务代码
func HelloTom() string {
return "Tom"
}
//测试代码
func TestHelloTom(t *testing.T) {
output := HelloTom()
expectOutput := "Tom"
if output != expectOutput {
t.Errorf("Expected %s do not match actual %s", expectOutput, output)
}
}
在命令行中使用go test HelloTom_test.go命令即可进行测试
如果业务代码和测试代码不在同一个文件中则需要使用go test .\HelloTom_test.go .\HelloTom.go命令进行测试
覆盖率
- 衡量代码是否经过了足够的测试
- 评价项目的测试水准
- 评估项目是否达到了高水准测试等级
案例:
注意:测试代码和业务代码必须在不同文件中才能显示覆盖率
业务代码judgement.go
package main
func JudgePassLine(score int16) bool {
if score >= 60 {
return true
}
return false
}
测试代码judgement_test.go
package main
import "testing"
func TestJudgePassLineTrue(t *testing.T) {
isPass := JudgePassLine(70)
if isPass {
println("通过了")
} else {
println("未通过")
}
}
使用go test .\judgement_test.go .\judgement.go --cover可以显示覆盖率
提高覆盖率
由于上面这个案例只测试了60分以上的分数,相等于业务中只跑了2行的代码(大括号的一行不算),所以覆盖率是2/3
为了提高覆盖率,需要增加测试方法
func TestJudgePassLineFail(t *testing.T) {
isPass := JudgePassLine(50)
if isPass {
println("通过了")
} else {
println("未通过")
}
}
此时的通过率为100
ok command-line-arguments 2.761s coverage: 100.0% of statements
Tips
- 一般覆盖率:50%~60%,较高覆盖率是80%+
- 测试分支相互独立、全面覆盖
- 测试单元粒度足够小,函数单一职责