新闻详情

新闻详情

首页 / 资讯中心 / 详情

用 BDD 场景串联 Issue:让 Agent 自动编写可验证的验收用例

发布时间:2026/9/4 22:56:28来源:尧图网络
用 BDD 场景串联 Issue:让 Agent 自动编写可验证的验收用例
用 BDD 场景串联 Issue让 Agent 自动编写可验证的验收用例在软件开发流程中让 AI Agent 直接根据产品经理或开发者提交的自然语言 Issue 来生成代码常常面临一个核心挑战自然语言的模糊性与边界条件的缺失。一段诸如“支持用户使用优惠券抵扣订单金额但不能超出限额”的 Issue 描述留下了大量的未定义行为——优惠券能否叠加运费是否参与抵扣抵扣后金额为 0 如何处理当 Agent 面对模糊的 Issue 时它只能根据先验概率进行“合理脑补”最终生成的代码看似优雅却与实际业务预期大相径庭。通过引入行为驱动开发Behavior-Driven Development, BDD的 Gherkin 语法规范Given-When-Then我们可以将 Issue 结构化为无歧义的领域验收场景。Agent 能够直接将这些场景转化为自动化验收测试Acceptance Tests并以“测试红灯 - 编写业务代码 - 测试绿灯”的严密闭环推进任务落地。Gherkin 语法人、AI 与系统之间的统一契约Gherkin 是一种业务人员易读、同时具备严格语法结构的领域描述语言。一个典型的 BDD Issue 由多个确定的 Scenario场景组成Feature: 优惠券抵扣结算引擎 作为在线商城用户 我希望在结账时使用满减优惠券 以便于享受订单立减优惠 Scenario: 满减券在满足门槛时的正常抵扣 Given 用户购物车包含商品总额为 20000 分 And 用户持有一张 满 15000 减 3000 的优惠券 When 用户选择使用该优惠券发起结算 Then 订单实际应付金额应为 17000 分 And 优惠券状态应变更为 LOCKED Scenario: 订单金额未达到优惠券门槛时拒绝抵扣 Given 用户购物车包含商品总额为 10000 分 And 用户持有一张 满 15000 减 3000 的优惠券 When 用户尝试使用该优惠券发起结算 Then 结算应失败并返回错误码 COUPON_THRESHOLD_NOT_MET And 订单实际应付金额保持 10000 分不变对于 AI Agent 而言这种结构化输入消除了任何主观臆断空间Given明确前置状态与测试夹具Test Fixture的初始化参数When明确被测行为Action与调用的核心 APIThen明确状态机变更、返回值断言与错误码。Agent 自动解析 BDD 生成 Go 验收测试套件以 Go 语言生态下的 BDD 框架godog为例Agent 可以根据 Gherkin 特性文件直接生成对应的 Step Definitions步骤定义代码。1. 结构化步骤绑定实现package checkout_test import ( context fmt github.com/cucumber/godog github.com/stretchr/testify/assert testing ) type checkoutFeatureCtx struct { cartTotal int64 coupon *Coupon resultOrder *Order executionErr error } func (c *checkoutFeatureCtx) 用户购物车包含商品总额为分(amount int64) error { c.cartTotal amount return nil } func (c *checkoutFeatureCtx) 用户持有一张满减的优惠券(threshold, discount int64) error { c.coupon Coupon{ ID: cp-9988, Threshold: threshold, Discount: discount, Status: ACTIVE, } return nil } func (c *checkoutFeatureCtx) 用户选择使用该优惠券发起结算() error { service : NewCheckoutEngine() order, err : service.CalculateOrder(context.Background(), c.cartTotal, c.coupon) c.resultOrder order c.executionErr err return nil } func (c *checkoutFeatureCtx) 用户尝试使用该优惠券发起结算() error { return c.用户选择使用该优惠券发起结算() } func (c *checkoutFeatureCtx) 订单实际应付金额应为分(expectedAmount int64) error { if c.executionErr ! nil { return fmt.Errorf(预期结算成功但实际抛出错误: %w, c.executionErr) } if c.resultOrder.PayableAmount ! expectedAmount { return fmt.Errorf(应付金额不匹配: 期望 %d, 实际 %d, expectedAmount, c.resultOrder.PayableAmount) } return nil } func (c *checkoutFeatureCtx) 结算应失败并返回错误码(expectedCode string) error { if c.executionErr nil { return fmt.Errorf(预期结算失败但实际返回成功) } bizErr, ok : c.executionErr.(*BusinessError) if !ok || bizErr.Code ! expectedCode { return fmt.Errorf(错误码不匹配: 期望 %s, 实际 %v, expectedCode, c.executionErr) } return nil } func (c *checkoutFeatureCtx) 优惠券状态应变更为(expectedStatus string) error { if c.coupon.Status ! expectedStatus { return fmt.Errorf(优惠券状态错误: 期望 %s, 实际 %s, expectedStatus, c.coupon.Status) } return nil } func InitializeScenario(ctx *godog.ScenarioContext) { tc : checkoutFeatureCtx{} ctx.Step(^用户购物车包含商品总额为 (\d) 分$, tc.用户购物车包含商品总额为分) ctx.Step(^用户持有一张 满 (\d) 减 (\d) 的优惠券$, tc.用户持有一张满减的优惠券) ctx.Step(^用户选择使用该优惠券发起结算$, tc.用户选择使用该优惠券发起结算) ctx.Step(^用户尝试使用该优惠券发起结算$, tc.用户尝试使用该优惠券发起结算) ctx.Step(^订单实际应付金额应为 (\d) 分$, tc.订单实际应付金额应为分) ctx.Step(^结算应失败并返回错误码 ([^]*)$, tc.结算应失败并返回错误码) ctx.Step(^优惠券状态应变更为 ([^]*)$, tc.优惠券状态应变更为) }Agent 的“测试先行与闭环自愈”工作流在 Agent 辅助开发工作流中整个实现过程被收敛为确定性的四个阶段[结构化 BDD Issue] │ ├── 1. Agent 解析并生成 *.feature 与 step_definitions_test.go │ ├── 2. 运行测试Red由于业务代码未实现测试抛出 NotImplemented 失败 │ ├── 3. Agent 迭代编写核心业务实现代码Green直至所有验收场景全部 PASS │ └── 4. 自动生成 PR附带 BDD 测试运行报告与代码覆盖率当业务逻辑出现遗漏例如 Agent 在编写代码时忘记将优惠券状态更新为LOCKED时godog验收测试会明确报出Assertion failed: 优惠券状态错误: 期望 LOCKED, 实际 ACTIVE。Agent 能够直接捕获该失败信息自动在业务逻辑中补充状态转移逻辑并再次执行测试验证直到达成全部绿灯。收益与工程实践准则在团队中推行 BDD 串联 Agent 开发能够带来显著的效能与质量收益零返工的需求对齐产品经理与研发在 Issue 评审阶段即敲定 Gherkin 场景消除了理解歧义。绝对可信的质量门禁验收用例由业务场景直接派生彻底规避了传统 AI 生成单测时“只测 Happy Path、忽略边界异常”的偷懒行为。活文档Living Documentation生成的.feature文件随着代码一同入库演进成为系统永远不会过期的活业务规范。将 BDD 的严格契约约束与 AI Agent 的代码生成速度结合是从“人肉审查 AI 幻觉”走向“确定性自动化研发”的关键升级。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

大学生电动方程式赛车算法开发:从架构到车辆模型 2026/9/5 5:15:46

大学生电动方程式赛车算法开发:从架构到车辆模型

从零开始开发一套大学生电动方程式赛车算法——1收到一个大学生电动方程式车队朋友的私信,说他们车队的算法组刚组建,人手一台笔记本电脑,其他全无,问我第一周该干什么。这问题太典型了,我当年带队踩的坑,不…

阅读更多 →
AI智能体安全管控实践:构建基于策略的许可层与数字禁区 2026/9/5 5:15:46

AI智能体安全管控实践:构建基于策略的许可层与数字禁区

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
差分晶振波形识别与调试实战:从原理到定位 2026/9/5 5:15:46

差分晶振波形识别与调试实战:从原理到定位

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
开环霍尔电流传感器实战:充电电流隔离检测与CSA601-P030T01应用 2026/9/5 5:15:46

开环霍尔电流传感器实战:充电电流隔离检测与CSA601-P030T01应用

1. 为什么充电电流非要隔离检测,以及我为什么选了开环霍尔先交代一下背景。前阵子帮朋友修一台电动车充电器,故障现象是充电仪表显示的电流数字忽大忽小,有时候明明电池还没满,屏幕却已经跳到"0A充满"。拆开检查&#x…

阅读更多 →
Kimi K3 0.18B量化模型本地部署:低硬件门槛AI应用实践指南 2026/9/5 5:15:46

Kimi K3 0.18B量化模型本地部署:低硬件门槛AI应用实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
五种电源防反接电路方案对比:从二极管到PMOS/NMOS选型指南 2026/9/5 5:12:46

五种电源防反接电路方案对比:从二极管到PMOS/NMOS选型指南

1. 为什么电源反接会“冒烟”:先搞懂板子是怎么死的我接过不少硬件故障的单子,十次里有八次是客户一句轻描淡写的“我把电源接反了,然后板子冒烟了”。拆开看,有的芯片顶盖鼓了个包,有的电解电容裂了缝,有的…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞