您现在的位置是:亿华云 > IT科技
Golang 语言怎么编写测试代码?
亿华云2025-10-09 01:17:14【IT科技】6人已围观
简介01介绍我们使用 Golang 语言开发的项目,怎么保证逻辑正确和性能要求呢?也就是说我们如何测试我们的 Golang 代码呢?在 Golang 语言中,可以使用标准库 testing 包编写单元测试
01介绍
我们使用 Golang 语言开发的编写项目,怎么保证逻辑正确和性能要求呢?测试也就是说我们如何测试我们的 Golang 代码呢?在 Golang 语言中,可以使用标准库 testing 包编写单元测试和基准测试,代码使用 go test 命令执行单元测试和基准测试的编写代码。本文我们介绍在 Golang 语言中怎么编写测试代码。测试
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 方法记录测试状态,该类型的更多方法可以阅读官方文档。
被测试函数:
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.555sgo 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语言开发栈」,可以通过以下二维码关注。转载本文请联系Golang语言开发栈公众号。
很赞哦!(3938)
相关文章
- 只要我们做的是从目前的市场情况选择域名,从简单易记,从个性特征上,我们就可以找到一个好域名进行注册。域名注册进行域名记录和解析以及绑定网站后,客户可以通过URL登录您的网站。
- 教妹学 Java:字符串拼接
- pgzero:用 Python 进行游戏开发
- 公司到底能不能监控到微信聊天?
- ICANN 规章禁止转移已经被记录或者在60天前内转移的域名。
- pgzero:用 Python 进行游戏开发
- 判空我推荐用StringUtils.isBlank
- 如何高效地拼接字符串
- 主流搜索引擎显示的相关搜索项越多,越能积极反映该域名的市场价值。同时,被评估域名的搜索引擎显示结果不佳可能是由于以下两个原因:
- Python之父:明年让Python快2倍
站长推荐
当投资者经过第二阶段的认真学习之后又充满了信心,认为自己可以在市场上叱咤风云地大干一场了。但没想到“看花容易绣花难”,由于对理论知识不会灵活运用.从而失去灵活应变的本能,就经常会出现小赢大亏的局面,结果往往仍以失败告终。这使投资者很是困惑和痛苦,不知该如何办,甚至开始怀疑这个市场是不是不适合自己。在这种情况下,有的人选择了放弃,但有的意志坚定者则决定做最后的尝试。
CSS 推陈出新 | ::marker 让文字序号更有意思
资深架构师手把手教你性能优化
如何快速实现一个连接池?
解析之后一般在十分钟内生效,如果没有生效可以联系域名服务商进行沟通。
全面解读Python垃圾回收机制
Flutter Vs React Native:这是2021的优秀选择?
地表最强VS Code新版发布,集成 Edge 浏览器开发工具