go语言单元测试 | 青训营笔记

44 阅读2分钟

回归测试:测试人员手动模拟终端访问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%+
  • 测试分支相互独立、全面覆盖
  • 测试单元粒度足够小,函数单一职责