Ginkgo 的 Describe 和 It 不自带自描述性,需人工通过完整业务语句命名、动词开头的 It 描述、合理 Context 分组及清晰断言链来实现。

直接说结论:Ginkgo 的 Describe 和 It 本身不提供“自描述性”,真正让它读起来像自然语言的,是你怎么组织语义、怎么命名、怎么约束上下文——不是框架自动给的,是人写出来的。
Describe 块名必须是完整业务语句,不能是名词或缩写
很多人写 Describe("UserService", func() {...}),这等于没写。Ginkgo 不会报错,但 CI 里一搜 ginkgo -focus="UserService" 就匹配一堆无关测试,根本没法按行为筛选。
- ✅ 正确写法:
Describe("User registration flow", func() {...})、Describe("API response when email is already taken", func() {...}) - ❌ 错误写法:
Describe("UserSvc", ...)、Describe("login", ...)(太模糊)、Describe("v1", ...)(无业务含义) - 注意:字符串必须是常量,不能是变量或拼接结果,否则
ginkgo -focus失效
It 描述必须以动词开头,且包含预期结果
It 不是“测试某个函数”,而是“当…时,应该…”。省略主语或结果,就失去 BDD 意义,也削弱可读性与错误定位能力。
- ✅ 推荐:
It("returns 400 status code when email format is invalid", func() {...}) - ✅ 推荐:
It("saves user to database and returns ID", func() {...}) - ❌ 常见坑:
It("CreateUser", ...)(只是函数名)、It("works", ...)(毫无信息量)、It("should create user", ...)(缺条件和结果) - 小技巧:把
It字符串复制出来,能直接贴进 PR 描述或需求文档里用——这就是自描述性的检验标准
Context 是隐藏逻辑的“语义分组器”,不是装饰性容器
Context 容易被当成视觉分隔符滥用,但它真正的价值是显式声明前置条件变化,让同一 Describe 下不同分支的行为差异一目了然。
在 Go 中使用 google/wire 实现编译时依赖注入——wire.NewSet、wire.Build、wire.Bind(接口→实现)、wire.Struct、wire.Value、wire.Interface
立即学习“go语言免费学习笔记(深入)”;
- ✅ 合理使用:
Context("when password is less than 8 chars", func() {...})、Context("with valid OAuth token", func() {...}) - ✅ 进阶用法:嵌套
Context表达组合条件,比如Context("when user is admin", func() { Context("and resource is locked", func() {...}) }) - ⚠️ 风险点:如果
Context里没改任何状态(比如没重置 mock、没替换依赖),那它只是心理安慰——Ginkgo 不会自动隔离状态,全靠你手动控制BeforeEach和变量作用域
Gomega 断言链要反映业务断言顺序,别堆 Expect(...).To(...).Should(...)
很多人为了“链式”强行连写,结果一行断言横跨 3 个业务含义,失败时根本看不出哪一环崩了。
- ✅ 清晰写法:
Expect(resp.StatusCode).To(Equal(http.StatusBadRequest));Expect(err).To(HaveOccurred());Expect(body).To(ContainSubstring("email"))—— 每行一个独立可验证事实 - ❌ 反模式:
Expect(user.Name).To(Equal("test")).And(Not(BeNil())).And(HaveLen(4))(混合校验类型,失败定位困难) - 注意:
Expect(...).To(And(...))在 Gomega v1.29+ 已弃用,推荐拆成多个Expect;若真需组合,用And(ContainSubstring("x"), HaveLen(5))显式包裹
最难的不是写对语法,而是每次敲下 It 前多想两秒:这个字符串,脱离代码还能不能被人看懂?有没有漏掉关键前提或预期结果?Ginkgo 给你的是骨架,血肉得自己一词一句填进去。

















