在实际工程开发中,单元测试是比较重要的,这里我们主要聊聊go测试相关的内容,包括单测规范,测试mock,以及基准测试。测试关系着系统的质量,质量则决定线上系统的稳定性,一但出现bug漏洞,就会造成事故。
测试一般分为回归测试、集成测试、单元测试。回归测试一般是手动通过OA系统终端回归一些固定的主流程场景,集成测试是对系统功能维度做测试验证,而单元测试测试开发阶段,开发者对单独的函数、模块做功能验证。从回归测试到集成测试再到单元测试,测试成本逐渐减低,而测试覆盖率逐步上升,所以单元测试的覆盖率一定程度上决定这代码的质量。
1.单元测试
单元测试主要包括,输入,测试单元,输出,以及校对,单元的概念比较广,包括接口,函数,模块等;用最后的校对来保证代码的功能与我们的预期相符;单则一方面可以保证质量,在整体覆盖率足够的情况下,一定程度上既保证了新功能本身的正确性,又未破坏原有代码的正确性。另一方面可以提升效率,在代码有bug的情况下,通过编写单测,可以在一个较短周期内定位和修复问题。下面是测试的一些规范:所有测试文件都以_test.go结尾,函数名以func TestXxx(*testing.T),初始化逻辑放到TestMain中。
func HelloTom() string {
return "Jerry"
}
func TestHelloTom(t,*testing.T){
output:=HelloTom()
expectOutput:="Tom"
if output ≠ expectOutput {
t.Errorf( format: "Expected %s do not match actual %s", expectOutput, output)
}
}
测试结果
2.单元测试-覆盖率
如何衡量代码是否经过了足够的测试?如何评价项目的测试水准?如何评估项目是否达到了高水准测试等级?那就要通过代码的覆盖率。
这是有一个判断是否及格的函数,超过60分,返回true,否则返回false,右边是对输入为70 的单元观试,我们执行右边的单侧,通过指定coverage参数,我们看输出了覆盖率是66.7%。
func JudgePassLine(score int16) bool {
if score > 60 {
return true
}
return false
}
func TestJudgePassLineTrue(t *testing.T) {
isPass := JudgePassLine(70)
assert.Equal(t,true,isPass)
}
3.总结
在实际的项目中,单元测试的一般覆盖率: 50%~60%,较高覆盖率80%+;测试分支相互独立、全面覆盖;测试单元粒度足够小,函数单一职责。