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表达力的同时,提供了更好的类型安全和开发体验。

回到顶部