当前位置: 首页 > 科技观察

如何用Golang语言编写测试代码?

时间:2023-03-15 20:38:11 科技观察

01介绍一下我们用Golang语言开发的项目。如何保证正确的逻辑和性能要求?换句话说,我们如何测试我们的Golang代码?在Golang语言中,可以使用标准库测试包编写单元测试和基准测试,使用gotest命令执行单元测试和基准测试代码。在本文中,我们将介绍如何使用Golang语言编写测试代码。02命名规范用Golang语言编写测试代码,需要遵循一些命名规范,包括文件名、包名、函数(方法)名、变量名。文件名和包名测试文件名以_test.go结尾,go测试工具可以遍历以_test.go结尾的文件执行测试功能。但是gobuild和gorun会忽略以_test.go结尾的文件,文件名开头一般是被测函数的文件名。包名一般与被测文件的包名相同,这样可以测试被测文件的可导出和不可导出功能。函数和方法名称测试函数(方法)名称必须以Test、Benchmark和Example开头,并且必须是可导出的函数。函数名一般为被测函数名,首字母大写。如果我们需要为同一个函数编写多个测试函数,可以在函数名后面加上测试函数的场景,例如:TestXxxxXxxx。变量名测试函数(方法)的变量名,Golang语言和gotest工具没有明确的约束,但是社区对输出结果有一些规范,供大家参考。在编写单元测试代码时,我们通常会得到一个实际输出并将其与我们预期的输出进行比较。对于这两个变量,社区的变量名称约定是got/want或expected/actual。03编写测试代码单元测试所谓单元测试,顾名思义就是对单元进行测试。通常,测试的单位是最小的单位。在Golang语言中,最小单元指的是函数或方法。单元测试函数,函数名以Test开头,例如:TestXxx。参数必须是*testing.T类型,该类型的方法可以用来记录测试信息和测试状态。例如Log、Logf一般用于记录测试信息,Error、Errorf、Fatal、Fatalf方法用于记录测试状态。更多此类方法,可以阅读官方文档。测试函数:funcSum(a,bint)int{returna+b}测试函数:funcTestSum(t*testing.T){a,b:=1,2rst:=Sum(a,b)ifrst==3{t.Logf("expected=%d,actual=%d",3,rst)}else{//t.Errorf("expected=%d,actual=%d",3,rst)t.Fatalf("expected=%d,actual=%d",3,rst)}t.Log("done")}看了上面的代码,是对我们写的Sum函数的单元测试,给定两个变量a和b作为Sum的输入函数的参数。此外,我们还可以使用表单测试发送一组待测函数的输入参数。限于篇幅,本文不打算花篇幅介绍。使用gotest命令执行上述单元测试的代码:gotestPASSoklearn_go/lesson270.555sgotest命令遍历所有以_test.go结尾的文件,并执行文件中的所有测试函数。另外gotest支持一些参数,比如-v输出测试函数的运行详情;-run指定要执行的测试函数;-count指定执行次数。另外,使用参数--coverprofile来统计单元测试的覆盖率。gotest--coverprofile=func.coverPASScoverage:100.0%ofstatementsoklearn_go/lesson270.499s阅读上面的执行结果可以发现我们写的单元测试覆盖率为100%。如果我们想查看详细的覆盖率统计结果,可以执行如下命令生成html文件,用浏览器打开生成的html文件,可以查看详细的单元测试覆盖率统计结果。gotoolcover-html=func.cover-ofunc_cover.html运行上面的命令,会生成一个名为func_cover.html的文件,我们可以用浏览器打开查看详细的单元测试覆盖率统计。基准测试在Golang中,您可以使用基准测试来查看代码的性能。基准函数名称以Benchmark开头,例如:BenchmarkXxx。参数必须是*testing.B类型,函数体中for循环的条件,b.N为循环次数,由benchmark测试框架提供,golang运行时动态调整,性能评估结果是通过多次测试得出的。示例代码:funcBenchmarkSum(b*testing.B){fori:=0;i