0

0

Go测试与基准测试有什么区别_Go测试类型对比说明

P粉602998670

P粉602998670

发布时间:2026-01-15 14:47:29

|

717人浏览过

|

来源于php中文网

原创

TestXxx和BenchmarkXxx函数名不可混用:前者仅被go test执行,后者仅被go test -bench=.执行;命名错误将导致静默跳过,且参数类型、执行逻辑、结果统计方式均严格区分。

go测试与基准测试有什么区别_go测试类型对比说明

TestXxx 和 BenchmarkXxx 函数名不能混用

Go 的 testing 包靠函数名前缀自动识别测试类型:以 Test 开头的函数被 go test 执行,以 Benchmark 开头的才被 go test -bench=. 执行。如果写成 TestAddBenchmarkBenchmarkAddTest,对应命令会直接忽略——既不报错,也不运行,容易误以为“测试通过”或“没性能问题”。

  • go test 只找 Test*,哪怕函数里写了 b.N 也会 panic(因为参数类型是 *testing.T,不是 *testing.B
  • go test -bench=. 只找 Benchmark*Test* 函数完全不参与,哪怕内容是纯性能逻辑
  • 同一文件中可共存两者,但必须严格遵守命名和参数签名,否则编译期不报错、运行期静默跳过

go test 和 go test -bench=. 的执行逻辑完全不同

go test 是验证性执行:每个 TestXxx 函数只运行一次,靠 t.Errorf 等触发失败;而 go test -bench=. 是测量性执行:每个 BenchmarkXxx 函数会自动调整 b.N 值反复运行,直到总耗时稳定在 1 秒左右,再计算平均值。

  • 基准测试默认不报告内存分配,需显式加 -benchmem 参数才能看到 B/opallocs/op
  • 单元测试加 -v 可看每条 t.Log 输出;基准测试加 -v 反而会抑制结果输出(只显示 PASS/FAIL),要查细节得靠 -benchmem -benchtime=100ms 等调优参数
  • 两者都支持 -run-bench 过滤,但语法不互通:go test -run=TestAdd 有效,go test -bench=TestAdd 无效(必须是 BenchmarkAdd

初始化逻辑不重置,基准测试容易测偏

很多开发者在 BenchmarkXxx 函数开头做初始化(比如构造大数组、打开文件、预热缓存),却忘了调用 b.ResetTimer(),导致初始化耗时被计入最终统计,结果严重虚高。

魔珐星云
魔珐星云

无需昂贵GPU,一键解锁超写实/二次元等多风格3D数字人,跨端适配千万级并发的具身智能平台。

下载
func BenchmarkProcessData(b *testing.B) {
    data := make([]int, 1e6) // 初始化开销大
    b.ResetTimer()           // ✅ 必须加这一行,否则 make 耗时也被计时
    for i := 0; i < b.N; i++ {
        _ = processData(data)
    }
}
  • 不加 b.ResetTimer():结果可能是 1200 ns/op(含初始化)
  • 加了之后:真实处理耗时可能只有 85 ns/op
  • 同理,b.StopTimer()b.StartTimer() 用于分段计时,比如只测某段循环内核

测试文件名和包隔离规则必须守死

所有测试代码必须放在 _test.go 文件里,且与被测代码同包(如 mymath.go 对应 mymath_test.go)。否则会出现两种典型问题:

  • 单元测试报 undefined: Add:因为测试文件用了新包名(如 package mymath_test),无法访问未导出函数
  • 基准测试跑出 0 次迭代(BenchmarkAdd-8 0 0 ns/op):常见于把 BenchmarkXxx 放在非同包的 helper_test.go 中,导致函数不可见
  • 想测私有函数?只能放同包;想复用测试工具函数?用 internal/xxx_test 子包,但主测试仍需同包
测试最常卡住的地方不在语法,而在“看不见的上下文”:函数名前缀是否精准、计时器是否重置、包是否一致、命令参数是否匹配目标类型。这些点不报错,但让结果失效——它不会告诉你测错了,只会安静地给你一个毫无意义的数字。

相关专题

更多
undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

4623

2023.07.31

网页undefined是什么意思
网页undefined是什么意思

网页undefined是指页面出现了未知错误的意思,提示undefined一般是在开发网站的时候定义不正确或是转换不正确,或是找不到定义才会提示undefined未定义这个错误。想了解更多的相关内容,可以阅读本专题下面的文章。

2949

2024.08.14

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

192

2025.12.25

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

4

2026.01.15

公务员递补名单公布时间 公务员递补要求
公务员递补名单公布时间 公务员递补要求

公务员递补名单公布时间不固定,通常在面试前,由招录单位(如国家知识产权局、海关等)发布,依据是原入围考生放弃资格,会按笔试成绩从高到低递补,递补考生需按公告要求限时确认并提交材料,及时参加面试/体检等后续环节。要求核心是按招录单位公告及时响应、提交材料(确认书、资格复审材料)并准时参加面试。

26

2026.01.15

公务员调剂条件 2026调剂公告时间
公务员调剂条件 2026调剂公告时间

(一)符合拟调剂职位所要求的资格条件。 (二)公共科目笔试成绩同时达到拟调剂职位和原报考职位的合格分数线,且考试类别相同。 拟调剂职位设置了专业科目笔试条件的,专业科目笔试成绩还须同时达到合格分数线,且考试类别相同。 (三)未进入原报考职位面试人员名单。

31

2026.01.15

国考成绩查询入口 国考分数公布时间2026
国考成绩查询入口 国考分数公布时间2026

笔试成绩查询入口已开通,考生可登录国家公务员局中央机关及其直属机构2026年度考试录用公务员专题网站http://bm.scs.gov.cn/pp/gkweb/core/web/ui/business/examResult/written_result.html,查询笔试成绩和合格分数线,点击“笔试成绩查询”按钮,凭借身份证及准考证进行查询。

6

2026.01.15

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

63

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

34

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.7万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号