Golang BDD框架GoBDD发布1.0版本
Golang BDD框架GoBDD发布1.0版本 大约一年前,我开始着手为 Go 语言开发一个小型的 BDD 框架——GoBDD。
最近,我发布了第一个稳定版本。该项目的目标是构建一个替代 godog 的方案,godog 虽然非常出色,但其工作方式存在一些不足。我希望修复这些问题,并为此构建自己的工具。
非常欢迎您提供反馈和改进建议。
1 回复
更多关于Golang BDD框架GoBDD发布1.0版本的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
GoBDD 1.0的发布是Go社区BDD工具链的一个重要进展。从架构上看,它通过更简洁的API设计解决了godog中常见的上下文传递复杂性问题。以下是一个典型的使用示例:
package calculator_test
import (
"testing"
"github.com/go-bdd/gobdd"
)
func TestCalculator(t *testing.T) {
suite := gobdd.NewSuite(t)
suite.Given("我有一个计算器", func(ctx gobdd.Context) {
ctx.Set("calculator", NewCalculator())
})
suite.When("我输入$input", func(ctx gobdd.Context, input int) {
calc := ctx.Get("calculator").(*Calculator)
calc.Input(input)
})
suite.Then("结果应该是$expected", func(ctx gobdd.Context, expected int) {
calc := ctx.Get("calculator").(*Calculator)
if calc.Result() != expected {
t.Errorf("期望 %d, 得到 %d", expected, calc.Result())
}
})
suite.Run()
}
关键改进包括类型安全的参数绑定、更直观的上下文管理以及更好的测试报告集成。框架通过反射自动将字符串参数转换为函数参数类型,这比godog的手动转换更简洁。上下文API使用泛型提供了编译时类型检查:
// 类型安全的Get方法
result := gobdd.Get[int](ctx, "key")
// 替代原有的类型断言
val := ctx.Get("key").(int) // 旧方式可能panic
对于步骤定义,GoBDD支持表格驱动测试的DSL:
suite.TableTest("加法运算", []gobdd.TableRow{
{"a": 1, "b": 2, "expected": 3},
{"a": -1, "b": 1, "expected": 0},
}, func(ctx gobdd.Context) {
a := gobdd.Get[int](ctx, "a")
b := gobdd.Get[int](ctx, "b")
expected := gobdd.Get[int](ctx, "expected")
calc := NewCalculator()
calc.Add(a, b)
if calc.Result() != expected {
ctx.Fail("结果不匹配")
}
})
在并发测试方面,GoBDD 1.0提供了内置的并行执行支持:
suite := gobdd.NewSuite(t, gobdd.WithParallelism(4))
这个实现避免了godog中需要手动管理测试并发的复杂性。框架还改进了错误报告机制,在步骤失败时提供更详细的堆栈跟踪和上下文状态快照。
从工程化角度看,GoBDD的模块化设计允许扩展自定义的匹配器和报告器。例如实现JSON响应验证:
suite.RegisterMatcher("匹配JSON", func(actual interface{}, expected string) error {
var actualJSON map[string]interface{}
json.Unmarshal([]byte(actual.(string)), &actualJSON)
var expectedJSON map[string]interface{}
json.Unmarshal([]byte(expected), &expectedJSON)
return deepEqual(actualJSON, expectedJSON)
})
这些设计选择使得GoBDD在保持BDD表达力的同时,提供了更好的类型安全和开发体验。

