文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Golang 语言怎么编写测试代码?

2024-12-02 20:30

关注

02命名规范

在 Golang 语言中编写测试代码,需要遵循一些命名规范,包含文件名、包名、函数(方法)名和变量名。

文件名和包名

测试文件名以 _test.go 结尾,go test 工具可以遍历以 _test.go 结尾的文件,执行测试函数。而 go build 和 go run 会忽略以 _test.go 结尾的文件,文件名开头一般是被测试函数所在的文件名。

包名一般和被测试文件的包名相同,这样即可以测试被测试文件的可导出函数和不可导出函数。

函数名和方法名

测试函数(方法)名必须以 Test、Benchmark 和 Example 开头,并且必须是可导出函数。函数名一般是被测试函数名,首字母大写。如果我们需要给同一个函数编写多个测试函数,可以在函数名后接上测试函数的场景,例如:TestXxxxXxxx。

变量名

测试函数(方法)的变量名,Golang 语言和 go test 工具没有明确的约束,但是,社区针对输出结果有一些规范供大家参考。在编写单元测试代码时,一般会得到一个实际输出结果,和一个我们预期的输出结果做对比。针对这两个变量,社区的变量名规范是 got/want 或 expected/actual。

03编写测试代码

单元测试

所谓单元测试,顾名思义就是对单元进行测试,一般进行测试的单元是一个最小的单元,在 Golang 语言中,最小的单元就是指一个函数或方法。

单元测试的函数,函数名以 Test 开头,例如:TestXxx。参数必须是 *testing.T 类型,可以使用该类型的方法记录测试信息和测试状态。例如,一般使用 Log 和 Logf 记录测试信息,使用 Error、Errorf、Fatal 和 Fatalf 方法记录测试状态,该类型的更多方法可以阅读官方文档。

被测试函数:

  1. func Sum(a, b intint { 
  2.  return a+b 

测试函数:

  1. func TestSum(t *testing.T) { 
  2.  a, b := 1,2 
  3.  rst := Sum(a, b) 
  4.  if rst == 3 { 
  5.   t.Logf("expected=%d, actual=%d", 3, rst) 
  6.  } else { 
  7.   // t.Errorf("expected=%d, actual=%d", 3, rst) 
  8.   t.Fatalf("expected=%d, actual=%d", 3, rst) 
  9.  } 
  10.  t.Log("done"

阅读上面这段代码,是我们编写的 Sum 函数的单元测试,给定 a, b 两个变量作为 Sum 函数的输入参数,此外,我们还可以使用表格测试发,给定一组被测试函数的输入参数,限于篇幅,本文不准备花费篇幅介绍。

使用 go test 命令执行以上单元测试的代码:

  1. go test 
  2. PASS 
  3. ok      learn_go/lesson27       0.555s 

go test 命令遍历所有 _test.go 结尾的文件,执行文件中所有的测试函数。此外,go test 支持一些参数,例如,-v 输出测试函数的运行详情;-run 指定执行的测试函数;-count 指定执行次数。

此外,使用参数 --coverprofile 统计单元测试的覆盖率。

  1. go test --coverprofile=func.cover 
  2. PASS 
  3. coverage: 100.0% of statements 
  4. ok      learn_go/lesson27       0.499s 

阅读上面的执行结果,可以发现我们编写的单元测试覆盖率为 100%。

如果我们想要查看详细的覆盖率统计结果,我们可以执行以下命令生成 html 文件,使用浏览器打开生成的 html 文件,可以查看详细的单元测试覆盖率统计结果。

  1. go tool cover -html=func.cover -o func_cover.html 

运行以上命令,会生成一个名为 func_cover.html 的文件,我们可以使用浏览器打开它,查看详细的单元测试覆盖率统计结果。

基准测试

在 Golang 语言中,可以使用基准测试查看代码的性能。基准测试的函数名以 Benchmark 开头,例如:BenchmarkXxx。参数必须是 *testing.B 类型,函数体中 for 循环的条件,以 b.N 作为循环次数,它是基准测试框架提供的,它在 Golang 运行时动态调整,通过多次测试,得到性能评估结果。

示例代码:

  1. func BenchmarkSum(b *testing.B) { 
  2.  for i := 0; i < b.N; i++ { 
  3.   Sum(1, 2) 
  4.  } 

我们可以使用 go test 工具执行以上基准测试的代码,基准测试函数不会自动执行,必须使用参数 -bench。

  1. go test -bench=".*" 
  2. goos: darwin 
  3. goarch: amd64 
  4. pkg: learn_go/lesson27 
  5. cpu: Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz 
  6. BenchmarkSum-16         1000000000               0.2325 ns/op 
  7. PASS 
  8. ok      learn_go/lesson27       0.748s 

阅读上面的执行结果,我们主要介绍一下 BenchmarkXxx-n 这一行的意思。这一行共有三列,第一列 BenchmarkSum-16 分别代表基准测试的函数名和参与基准测试的 CPU 线程数,默认是 GOMAXPROCS 的值。第二列 1000000000 表示基准测试循环执行的次数。第三列 0.2325 ns/op 表示每次循环的平均执行耗时是 0.2325 纳秒,该值越小,说明代码性能越高。

除了 b.N 之外,还有几个关于性能测试时间计数的方法,例如:b.ResetTimer()、b.StopTimer() 和 b.StartTimer(),我们可以根据我们的测试场景,灵活使用。

此外,go test 工具关于基准测试的参数,除了参数 -bench 之外,还有 -benchmem 统计内存分配;-cpu 指定参与执行基准测试的 CPU 线程数;-benchtime 指定测试时间和循环次数,其中值的单位为 s 表示指定执行多少秒,单位为 x 表示指定循环执行次数;-timeout 指定基准测试函数执行的超时时间。

04总结

本文我们介绍怎么编写测试代码,包含单元测试和基准测试。特别需要注意的是一些命名规范。

养成编写测试代码的习惯,不仅可以降低代码逻辑的错误率,而且在多人开发中,还可以提升联调效率和提测通过率。

本文转载自微信公众号「Golang语言开发栈」,可以通过以下二维码关注。转载本文请联系Golang语言开发栈公众号。

 

来源:Golang语言开发栈内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯