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

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

01

介绍

我们使用 Golang 语言开发的项目,怎么保证逻辑正确和性能要求呢?也就是说我们如何测试我们的 Golang 代码呢?在 Golang 语言中,可以使用标准库 testing 包编写单元测试和基准测试,使用 go test 命令执行单元测试和基准测试的代码。本文我们介绍在 Golang 语言中怎么编写测试代码。

命名规范

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

文件名和包名

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

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

函数名和方法名

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

变量名

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

03

编写测试代码

单元测试

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

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

被测试函数:

func Sum(a, b int) int {
 return a+b
}

测试函数:

func TestSum(t *testing.T) {
 a, b := 1,2
 rst := Sum(a, b)
 if rst == 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 函数的输入参数,此外,我们还可以使用表格测试发,给定一组被测试函数的输入参数,限于篇幅,本文不准备花费篇幅介绍。

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

go test
PASS
ok      learn_go/lesson27       0.555s

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

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

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

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

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

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

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

基准测试

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

示例代码:

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

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

go test -bench=".*"
goos: darwin
goarch: amd64
pkg: learn_go/lesson27
cpu: Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
BenchmarkSum-16         1000000000               0.2325 ns/op
PASS
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 语言 gRPC 怎么使用?

Go 语言学习之测试

参考资料:

https://pkg.go.dev/testing 


目录
相关文章
|
2月前
|
数据采集 机器学习/深度学习 大数据
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
这篇文章详细介绍了C3D架构在行为检测领域的应用,包括训练和测试步骤,使用UCF101数据集进行演示。
80 1
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
|
2月前
|
机器学习/深度学习 人工智能 监控
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
|
24天前
|
JavaScript 前端开发 测试技术
在 golang 中执行 javascript 代码的方案详解
本文介绍了在 Golang 中执行 JavaScript 代码的四种方法:使用 `otto` 和 `goja` 嵌入式 JavaScript 引擎、通过 `os/exec` 调用 Node.js 外部进程以及使用 WebView 嵌入浏览器。每种方法都有其适用场景,如嵌入简单脚本、运行复杂 Node.js 脚本或在桌面应用中显示 Web 内容。
60 15
在 golang 中执行 javascript 代码的方案详解
|
3月前
|
Web App开发 JavaScript 前端开发
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
|
26天前
|
运维 监控 Cloud Native
一行代码都不改,Golang 应用链路指标日志全知道
本文将通过阿里云开源的 Golang Agent,帮助用户实现“一行代码都不改”就能获取到应用产生的各种观测数据,同时提升运维团队和研发团队的幸福感。
|
18小时前
|
算法 Java 测试技术
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
|
28天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
61 1
|
1月前
|
数据库连接 Go 数据库
Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性
本文探讨了Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性;防御编程则强调在编码时考虑各种错误情况,确保程序健壮性。文章详细介绍了这两种技术在Go语言中的实现方法及其重要性,旨在提升软件质量和可靠性。
38 1
|
1月前
|
测试技术 Go
go语言中测试工具
【10月更文挑战第22天】
33 4
|
3月前
|
Java C++
代码文件间重复性测试
本文介绍了如何使用代码相似性检测工具simian来找出代码文件中的重复行,并通过示例指令展示了如何将检测结果输出到指定的文本文件中。