应优先用 require——前置条件不满足时直接终止,避免无效执行;assert 适用于循环内多元素验证等需继续执行场景。
testify 的 assert 和 require 到底该用哪个?
核心区别在于失败行为:assert 失败只打日志、继续执行后续断言;require 失败直接 return,跳过当前函数剩余逻辑。多数测试里你应该优先用 require——比如检查返回值非 nil、err 为 nil 这类前置条件,不满足就无意义再往下测。
常见误用:在循环里用 require 导致只测到第一个元素就退出。这时改用 assert 更合理,或者把单次断言抽成子函数 + t.Run 隔离。
-
require.NoError(t, err)比assert.NoError(t, err)更安全,尤其在初始化依赖后 - 结构体字段对比优先用
require.Equal(t, want, got),别手写if !reflect.DeepEqual() - 避免
assert.True(t, len(s) > 0),改用require.NotEmpty(t, s)——语义清晰且失败信息更友好
gomock 生成 mock 时为什么总报 “no buildable Go source files”?
这是 mockgen 扫描包路径时找不到 .go 文件的典型错误,根本原因不是代码问题,而是路径或构建约束没对上。
实操要点:
- 确保目标接口所在包能被正常
go build(比如没有//go:build ignore或平台限制) - 用绝对路径或相对于模块根目录的路径调用
mockgen,例如:mockgen -source=internal/service/user.go -destination=mocks/mock_user.go - 如果接口在
main包,必须先移到独立包(gomock 不支持 mock main 包) - 使用
-package显式指定生成文件的包名,避免和原包冲突
怎么让 gomock 行为模拟更贴近真实调用链?
关键不在“模拟得多像”,而在“控制得够细”——重点是设置好调用次数、参数匹配、返回值策略。