1. 项目概述当BDD遇上生成式AI一场测试范式的变革在软件开发的漫长周期里测试环节常常扮演着“守门员”的角色确保交付质量但也时常成为流程的瓶颈。特别是行为驱动开发BDD它强调用自然语言描述业务行为促进业务、开发和测试三方协作理念虽好落地却难。难点在哪编写和维护那些海量的、精确的、可执行的场景文件通常是Gherkin语法是一项极其耗时且容易出错的工作。业务人员写的场景可能不够精确开发人员转写成自动化脚本又可能偏离原意测试人员则需要在两者之间反复沟通确认协作成本居高不下。这正是生成式AI大显身手的舞台。最近我深度参与了一个项目核心目标就是“通过生成式AI实现BDD场景的落地”。这不仅仅是把ChatGPT当成一个写文档的助手而是构建一套从需求描述到可执行测试代码的自动化、智能化工作流。想象一下产品经理在需求文档里用自然语言描述了一个新功能AI能自动将其转化为结构化的BDD场景或者开发人员在代码评审时提到一个边界情况AI能即时生成对应的测试场景草案。这背后是生成式AI对自然语言的理解、结构化生成以及代码生成能力的综合运用。对于测试工程师、开发人员乃至产品经理来说掌握这套方法意味着能将BDD从一种“美好的理念”真正转化为提升效率、保障质量的“生产力工具”。它解决的不仅是“写测试”的效率问题更是“沟通与对齐”的协作问题。接下来我将拆解我们是如何一步步构建这套工作流的分享其中的核心思路、技术选型、实操细节以及我们踩过的那些坑。2. 核心思路与架构设计构建智能BDD工作流2.1 从理念到架构为什么是生成式AIBDDBDD的核心资产是那些用Given-When-Then格式编写的场景。传统流程中这些场景的诞生依赖于人工的、线性的转换业务需求 - 人工编写Gherkin - 人工编写步骤定义 - 人工编写底层测试代码。每一个环节都存在信息损耗和偏差。生成式AI特别是大语言模型LLM给我们提供了一种“非线性”的解决方案。它能够理解非结构化的自然语言需求并直接生成结构化的Gherkin场景甚至能进一步生成对应的步骤定义代码骨架。我们的核心思路是构建一个“AI增强的BDD协作循环”输入多样化接受多种形式的输入包括PRD产品需求文档片段、用户故事描述、API接口文档、甚至是代码库中的注释或提交信息。AI理解与生成利用LLM理解输入内容识别其中的角色、前置条件、操作和预期结果并遵循Gherkin语法规范生成场景大纲和场景。人工审核与精炼生成的场景并非最终成品必须由业务或测试专家进行审核、修正和确认。AI在这里扮演的是“高级助手”而非“决策者”。代码生成与同步对于审核通过的场景AI可以进一步生成对应测试框架如Cucumber-JVM, Behave, SpecFlow的步骤定义代码骨架极大减少开发人员的重复性劳动。反馈与迭代将人工修正的结果和测试运行的结果作为反馈用于微调AI模型或优化提示词形成闭环让AI越来越懂我们的业务和测试规范。这个架构的关键在于AI不是要取代人而是要放大人的能力将人从繁琐的格式转换和基础代码编写中解放出来聚焦于更高价值的业务逻辑确认、边界案例设计和测试策略制定。2.2 技术栈选型在“五层技术栈”中找到我们的位置参考“生成式AI工程落地五层技术栈”的理念我们将整个系统分为以下几个层次并做出了具体的技术选型应用层我们的目标应用很明确——BDD场景生成与测试代码辅助生成工具。形态可以是一个IDE插件如VS Code Extension、一个CI/CD流水线中的自动任务或者一个独立的Web服务。编排与提示工程层这是大脑。我们选择使用LangChain或Semantic Kernel这类框架。它们提供了链Chain、代理Agent等高级抽象能帮我们轻松构建“读取需求 - 分析 - 生成场景 - 生成代码”的多步工作流。提示词工程是这里的灵魂我们需要精心设计System Prompt和Few-shot示例教会LLM我们的Gherkin格式规范、业务领域术语和代码风格。模型层核心引擎。考虑到成本、性能和对代码的理解能力我们采用了混合策略云端大模型如GPT-4, Claude 3用于最核心、最需要创造性和深度理解的任务比如从模糊的需求描述中首次生成场景。它们的逻辑推理和语言理解能力最强。本地/专用微调模型如CodeLlama, DeepSeek-Coder对于已经标准化、模式固定的任务如根据确认后的Gherkin场景生成特定框架的步骤定义代码可以使用在代码上微调过的、更轻量的开源模型。这能降低API调用成本提高响应速度。数据与评估层我们积累的历史BDD场景用例库是最宝贵的资产。它们既是Few-shot学习的示例也是用于评估AI生成质量的“黄金标准”。需要建立一套评估体系包括语法正确性、场景覆盖度、与原始需求的语义一致性等指标。基础设施层考虑到可能涉及本地模型部署我们使用Docker进行环境容器化。对于需要处理大量文档或代码仓库的应用向量数据库如Chroma, Weaviate可以用来存储和检索相关的历史需求、场景和代码片段为AI提供更丰富的上下文。注意模型选型没有银弹。我们的策略是“重任务用强模型轻任务用专模”。初期可以全部依赖GPT-4 API快速验证想法待流程跑通、模式固定后再将部分任务迁移到成本更低的微调模型上。3. 实操流程详解从零构建你的第一个AI-BDD生成器3.1 环境准备与工具链搭建我们以一个Python技术栈的BDD项目使用behave框架为例演示如何构建一个命令行工具将一段自然语言需求自动转换为Gherkin.feature文件和对应的steps.py骨架。第一步基础环境# 创建项目目录 mkdir ai-bdd-assistant cd ai-bdd-assistant python -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate # 安装核心依赖 pip install openai langchain chromadb # 使用OpenAI API和LangChain pip install behave # BDD测试框架如果你打算使用开源模型可能还需要安装transformers,torch,ctransformers(用于GGUF格式模型)等库。第二步组织项目结构ai-bdd-assistant/ ├── requirements.txt ├── .env # 存放API密钥等敏感信息 ├── prompt_templates/ # 存放各种提示词模板 │ ├── generate_scenario.j2 │ └── generate_steps.j2 ├── output/ # 生成文件输出目录 │ ├── features/ │ └── steps/ ├── evaluators/ # 评估脚本 ├── main.py # 主程序入口 └── utils/ # 工具函数第三步配置模型访问在.env文件中配置你的大模型访问凭证例如使用OpenAIOPENAI_API_KEYyour_api_key_here OPENAI_MODELgpt-4-turbo-preview # 或 gpt-3.5-turbo 用于成本敏感任务在main.py中初始化LangChain的LLMfrom langchain_openai import ChatOpenAI from langchain.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser import os from dotenv import load_dotenv load_dotenv() llm ChatOpenAI(modelos.getenv(OPENAI_MODEL), temperature0.2) # temperature调低使输出更确定、更符合格式要求3.2 核心环节一设计提示词教会AI写BDD提示词的质量直接决定生成结果的好坏。我们设计两个核心提示词模板。1. 场景生成提示词 (prompt_templates/generate_scenario.j2)你是一个资深的软件测试工程师精通行为驱动开发BDD和Gherkin语法。 你的任务是将以下用自然语言描述的需求转化为标准的、可执行的Gherkin场景。 请严格遵循以下规则 1. 使用标准的Gherkin关键字Feature, Scenario, Given, When, Then, And, But。 2. 场景描述应清晰、无歧义每个步骤只做一件事。 3. 背景Background和场景大纲Scenario Outline仅在适当时使用。 4. 如果需要示例数据请使用data占位符不要使用真实数据。 5. 输出格式必须是纯净的Gherkin语法不要有任何额外的解释或Markdown格式。 以下是一些优秀示例 示例需求“用户登录功能如果用户名密码正确则跳转到首页如果错误则提示错误信息。” 示例输出Feature: User Login As a registered user I want to login to the system So that I can access my personal dashboardScenario: Successful login with valid credentials Given the user is on the login page When the user enters a valid username and password And clicks the login button Then the user should be redirected to the homepage And a welcome message should be displayedScenario: Failed login with invalid credentials Given the user is on the login page When the user enters an invalid username or password And clicks the login button Then an error message Invalid username or password should be displayed And the user should remain on the login page现在请处理以下需求{{ user_requirement }}2. 步骤定义生成提示词 (prompt_templates/generate_steps.j2)你是一个Python开发工程师熟悉behave测试框架。 请根据以下Gherkin场景生成对应的Python步骤定义代码骨架。 只需要生成 given, when, then 装饰器及其对应的函数骨架函数体内用 pass 或适当的注释如 # TODO: implement this step填充。 遵循PEP8风格使用清晰的函数名和参数。 示例Gherkin步骤Given the user is on the login page 示例输出 python from behave import given, when, then given(the user is on the login page) def step_impl(context): # TODO: navigate to login page, e.g., context.browser.get(/login) pass现在请为以下Gherkin场景生成步骤定义{{ gherkin_scenario }} **实操心得**提示词中的示例Few-shot至关重要。它比单纯描述规则更有效。我们建立了“场景示例库”针对不同的业务领域如登录、支付、搜索收集了高质量的Gherkin示例在生成时动态选择最相关的2-3个示例插入提示词能显著提升生成质量。 ### 3.3 核心环节二实现生成链与输出 在 main.py 中我们实现两个主要的生成链。 python import os from langchain.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain.globals import set_verbose set_verbose(True) # 调试时开启查看LangChain的中间过程 class BDDGenerator: def __init__(self, llm): self.llm llm self.output_parser StrOutputParser() # 加载提示词模板 with open(prompt_templates/generate_scenario.j2, r) as f: scenario_template f.read() with open(prompt_templates/generate_steps.j2, r) as f: steps_template f.read() self.scenario_prompt ChatPromptTemplate.from_template(scenario_template) self.steps_prompt ChatPromptTemplate.from_template(steps_template) # 构建链 self.scenario_chain self.scenario_prompt | self.llm | self.output_parser self.steps_chain self.steps_prompt | self.llm | self.output_parser def generate_from_requirement(self, requirement: str, feature_name: str): 从需求生成Feature文件和Steps文件 print(f正在为需求生成BDD场景...) # 1. 生成Gherkin场景 gherkin_text self.scenario_chain.invoke({user_requirement: requirement}) print(生成的Gherkin场景) print(gherkin_text) print(- * 50) # 2. 保存Feature文件 feature_file_path foutput/features/{feature_name}.feature os.makedirs(os.path.dirname(feature_file_path), exist_okTrue) with open(feature_file_path, w) as f: f.write(gherkin_text) print(fFeature文件已保存至{feature_file_path}) # 3. 生成步骤定义代码 steps_code self.steps_chain.invoke({gherkin_scenario: gherkin_text}) print(\n生成的步骤定义代码) print(steps_code) # 4. 保存Steps文件 steps_file_path foutput/steps/{feature_name}_steps.py os.makedirs(os.path.dirname(steps_file_path), exist_okTrue) with open(steps_file_path, w) as f: f.write(steps_code) print(fSteps文件已保存至{steps_file_path}) return feature_file_path, steps_file_path if __name__ __main__: generator BDDGenerator(llm) # 示例需求 sample_req 作为一个电商网站的用户我希望能够将商品加入购物车。 如果商品有库存加入成功购物车图标数量增加页面显示成功提示。 如果商品无库存则提示“该商品已售罄”且不能加入购物车。 如果未登录用户尝试加入则弹出登录模态框。 generator.generate_from_requirement(sample_req, add_to_cart)运行这个脚本你会在output/目录下得到add_to_cart.feature和add_to_cart_steps.py两个文件。生成的Gherkin场景会包含多个Scenario来覆盖正常、库存不足、未登录等情况步骤定义代码也包含了对应的函数骨架。这已经完成了从需求到可执行测试框架代码的80%的基础工作。4. 进阶优化与工程化考量4.1 提升生成质量上下文检索与领域微调最初的版本可能对复杂需求或特定领域术语处理不佳。我们需要引入更强大的上下文。方案一基于向量数据库的上下文检索将历史的需求文档、已编写的Feature文件存入向量数据库如Chroma。当有新需求输入时先检索最相关的历史资料并将其作为上下文连同Few-shot示例一起喂给LLM。# 伪代码示例 from langchain_community.vectorstores import Chroma from langchain_openai import OpenAIEmbeddings # 初始化向量库 embeddings OpenAIEmbeddings() vectorstore Chroma.from_documents(documents, embeddings) # documents为历史文档 # 检索相关上下文 retriever vectorstore.as_retriever(search_kwargs{k: 3}) relevant_docs retriever.invoke(user_requirement) # 将relevant_docs的内容整合到提示词中这样AI在生成“退货流程”的场景时就能参考历史上“换货流程”的写法保持公司内部用词和风格的一致性。方案二对开源模型进行LoRA微调如果公司有大量高质量的、标注好的需求-Gherkin对数据可以考虑使用像unsloth这样的工具对CodeLlama或Mistral模型进行轻量级的LoRA微调让它更擅长生成符合我们特定规范的BDD内容。这能从根本上提升生成质量并降低对昂贵API的依赖。4.2 集成到开发工作流从IDE到CI/CD生成的代码不能是孤立的必须融入现有流程。IDE插件开发一个VS Code插件。当开发人员在写代码注释或修改需求文档时右键选择“生成BDD场景”插件调用后台服务直接将生成的.feature文件插入到项目的对应features目录并打开预览。PR拉取请求机器人在GitHub/GitLab上配置一个机器人。当新的PR被创建或更新时机器人分析PR描述和代码变更自动生成或更新相关的BDD场景并以评论的形式提交供评审者参考。这能确保测试用例与代码变更同步。CI流水线任务在CI流水线中增加一个“BDD场景健康度检查”任务。使用AI分析新提交的Feature文件检查其语法规范性、场景的完整性是否覆盖了主要分支和异常流甚至可以尝试运行生成的步骤定义骨架如果已实现给出初步的质量报告。4.3 建立评估与反馈闭环我们不能盲目相信AI的输出。必须建立评估机制。自动化基础校验使用gherkin-lint等工具校验生成的Gherkin语法。人工审核打分在工具界面提供“/”按钮收集用户对生成结果的直接反馈。场景执行率追踪追踪AI生成的场景中最终有多少被团队采纳并成功实现了自动化测试。这是一个关键的业务指标。反馈回流将人工修正后的最终版Gherkin以及标记为“好”的生成结果不断补充到我们的向量数据库和Few-shot示例库中。这样系统就在持续学习和进化。5. 避坑指南与常见问题在实际落地过程中我们遇到了不少挑战以下是总结出的关键注意事项和解决方案。问题现象/风险解决方案与建议生成场景过于笼统AI生成的步骤像“用户进行操作然后看到结果”缺乏可操作的具体细节如具体的URL、按钮ID、数据。在提示词中强调“具体化”和“可自动化”。要求步骤必须包含可识别的UI元素如#login-btn或API端点。提供包含具体细节的优秀示例。场景逻辑遗漏或错误AI可能遗漏重要的异常流程如网络超时、并发冲突或生成不符合业务逻辑的场景。AI生成仅是初稿。必须建立强制的人工审核环节。可以设计检查清单Checklist审核者需逐一确认是否覆盖了主要成功路径、所有已知异常路径、业务规则边界等。步骤定义代码不可用生成的Python函数骨架参数不匹配或使用了项目中不存在的上下文context变量。在生成步骤定义的提示词中提供更多本项目实际的步骤定义代码作为示例。甚至可以先生成步骤定义再用一个单独的AI调用或规则引擎根据项目框架规范如使用selenium还是requests进行代码风格转换。成本失控频繁调用GPT-4 API生成大量场景费用快速增长。采用混合模型策略。首次创意性生成用强模型后续根据模板修改或生成简单步骤定义时切换到GPT-3.5-Turbo或本地微调模型。对生成结果进行缓存对相同或相似的需求直接复用缓存。“幻觉”问题AI生成了需求中根本不存在的功能或业务规则。在System Prompt中明确指令“只基于提供的需求描述生成场景不要添加任何需求中未提及的功能或假设。” 同时在输出解析后可以增加一个简单的“一致性校验”步骤用AI快速比对生成场景的关键词是否都来源于输入需求。最重要的心得不要追求全自动。我们的目标是“AI辅助”而不是“AI替代”。将AI定位为一个不知疲倦、知识渊博的初级测试工程师它能快速产出高质量的草稿但最终的决策权、业务逻辑的确认权必须牢牢掌握在人的手中。人机协作才是效率和质量的最大保障。这套方法实施后在我们团队编写基础BDD场景的时间平均减少了约70%团队能将更多精力投入到复杂的集成测试、性能测试和探索性测试中。更重要的是业务、开发和测试三方在“需求-场景”的对齐上更加顺畅因为AI生成的场景成了一个大家共同讨论和优化的起点而不是从零开始争吵的焦点。生成式AI为BDD注入了新的活力让它从一个理想的协作框架真正变成了触手可及的生产力工具。
生成式AI驱动BDD测试自动化:从自然语言需求到可执行代码的智能工作流
发布时间:2026/6/26 5:26:43
1. 项目概述当BDD遇上生成式AI一场测试范式的变革在软件开发的漫长周期里测试环节常常扮演着“守门员”的角色确保交付质量但也时常成为流程的瓶颈。特别是行为驱动开发BDD它强调用自然语言描述业务行为促进业务、开发和测试三方协作理念虽好落地却难。难点在哪编写和维护那些海量的、精确的、可执行的场景文件通常是Gherkin语法是一项极其耗时且容易出错的工作。业务人员写的场景可能不够精确开发人员转写成自动化脚本又可能偏离原意测试人员则需要在两者之间反复沟通确认协作成本居高不下。这正是生成式AI大显身手的舞台。最近我深度参与了一个项目核心目标就是“通过生成式AI实现BDD场景的落地”。这不仅仅是把ChatGPT当成一个写文档的助手而是构建一套从需求描述到可执行测试代码的自动化、智能化工作流。想象一下产品经理在需求文档里用自然语言描述了一个新功能AI能自动将其转化为结构化的BDD场景或者开发人员在代码评审时提到一个边界情况AI能即时生成对应的测试场景草案。这背后是生成式AI对自然语言的理解、结构化生成以及代码生成能力的综合运用。对于测试工程师、开发人员乃至产品经理来说掌握这套方法意味着能将BDD从一种“美好的理念”真正转化为提升效率、保障质量的“生产力工具”。它解决的不仅是“写测试”的效率问题更是“沟通与对齐”的协作问题。接下来我将拆解我们是如何一步步构建这套工作流的分享其中的核心思路、技术选型、实操细节以及我们踩过的那些坑。2. 核心思路与架构设计构建智能BDD工作流2.1 从理念到架构为什么是生成式AIBDDBDD的核心资产是那些用Given-When-Then格式编写的场景。传统流程中这些场景的诞生依赖于人工的、线性的转换业务需求 - 人工编写Gherkin - 人工编写步骤定义 - 人工编写底层测试代码。每一个环节都存在信息损耗和偏差。生成式AI特别是大语言模型LLM给我们提供了一种“非线性”的解决方案。它能够理解非结构化的自然语言需求并直接生成结构化的Gherkin场景甚至能进一步生成对应的步骤定义代码骨架。我们的核心思路是构建一个“AI增强的BDD协作循环”输入多样化接受多种形式的输入包括PRD产品需求文档片段、用户故事描述、API接口文档、甚至是代码库中的注释或提交信息。AI理解与生成利用LLM理解输入内容识别其中的角色、前置条件、操作和预期结果并遵循Gherkin语法规范生成场景大纲和场景。人工审核与精炼生成的场景并非最终成品必须由业务或测试专家进行审核、修正和确认。AI在这里扮演的是“高级助手”而非“决策者”。代码生成与同步对于审核通过的场景AI可以进一步生成对应测试框架如Cucumber-JVM, Behave, SpecFlow的步骤定义代码骨架极大减少开发人员的重复性劳动。反馈与迭代将人工修正的结果和测试运行的结果作为反馈用于微调AI模型或优化提示词形成闭环让AI越来越懂我们的业务和测试规范。这个架构的关键在于AI不是要取代人而是要放大人的能力将人从繁琐的格式转换和基础代码编写中解放出来聚焦于更高价值的业务逻辑确认、边界案例设计和测试策略制定。2.2 技术栈选型在“五层技术栈”中找到我们的位置参考“生成式AI工程落地五层技术栈”的理念我们将整个系统分为以下几个层次并做出了具体的技术选型应用层我们的目标应用很明确——BDD场景生成与测试代码辅助生成工具。形态可以是一个IDE插件如VS Code Extension、一个CI/CD流水线中的自动任务或者一个独立的Web服务。编排与提示工程层这是大脑。我们选择使用LangChain或Semantic Kernel这类框架。它们提供了链Chain、代理Agent等高级抽象能帮我们轻松构建“读取需求 - 分析 - 生成场景 - 生成代码”的多步工作流。提示词工程是这里的灵魂我们需要精心设计System Prompt和Few-shot示例教会LLM我们的Gherkin格式规范、业务领域术语和代码风格。模型层核心引擎。考虑到成本、性能和对代码的理解能力我们采用了混合策略云端大模型如GPT-4, Claude 3用于最核心、最需要创造性和深度理解的任务比如从模糊的需求描述中首次生成场景。它们的逻辑推理和语言理解能力最强。本地/专用微调模型如CodeLlama, DeepSeek-Coder对于已经标准化、模式固定的任务如根据确认后的Gherkin场景生成特定框架的步骤定义代码可以使用在代码上微调过的、更轻量的开源模型。这能降低API调用成本提高响应速度。数据与评估层我们积累的历史BDD场景用例库是最宝贵的资产。它们既是Few-shot学习的示例也是用于评估AI生成质量的“黄金标准”。需要建立一套评估体系包括语法正确性、场景覆盖度、与原始需求的语义一致性等指标。基础设施层考虑到可能涉及本地模型部署我们使用Docker进行环境容器化。对于需要处理大量文档或代码仓库的应用向量数据库如Chroma, Weaviate可以用来存储和检索相关的历史需求、场景和代码片段为AI提供更丰富的上下文。注意模型选型没有银弹。我们的策略是“重任务用强模型轻任务用专模”。初期可以全部依赖GPT-4 API快速验证想法待流程跑通、模式固定后再将部分任务迁移到成本更低的微调模型上。3. 实操流程详解从零构建你的第一个AI-BDD生成器3.1 环境准备与工具链搭建我们以一个Python技术栈的BDD项目使用behave框架为例演示如何构建一个命令行工具将一段自然语言需求自动转换为Gherkin.feature文件和对应的steps.py骨架。第一步基础环境# 创建项目目录 mkdir ai-bdd-assistant cd ai-bdd-assistant python -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate # 安装核心依赖 pip install openai langchain chromadb # 使用OpenAI API和LangChain pip install behave # BDD测试框架如果你打算使用开源模型可能还需要安装transformers,torch,ctransformers(用于GGUF格式模型)等库。第二步组织项目结构ai-bdd-assistant/ ├── requirements.txt ├── .env # 存放API密钥等敏感信息 ├── prompt_templates/ # 存放各种提示词模板 │ ├── generate_scenario.j2 │ └── generate_steps.j2 ├── output/ # 生成文件输出目录 │ ├── features/ │ └── steps/ ├── evaluators/ # 评估脚本 ├── main.py # 主程序入口 └── utils/ # 工具函数第三步配置模型访问在.env文件中配置你的大模型访问凭证例如使用OpenAIOPENAI_API_KEYyour_api_key_here OPENAI_MODELgpt-4-turbo-preview # 或 gpt-3.5-turbo 用于成本敏感任务在main.py中初始化LangChain的LLMfrom langchain_openai import ChatOpenAI from langchain.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser import os from dotenv import load_dotenv load_dotenv() llm ChatOpenAI(modelos.getenv(OPENAI_MODEL), temperature0.2) # temperature调低使输出更确定、更符合格式要求3.2 核心环节一设计提示词教会AI写BDD提示词的质量直接决定生成结果的好坏。我们设计两个核心提示词模板。1. 场景生成提示词 (prompt_templates/generate_scenario.j2)你是一个资深的软件测试工程师精通行为驱动开发BDD和Gherkin语法。 你的任务是将以下用自然语言描述的需求转化为标准的、可执行的Gherkin场景。 请严格遵循以下规则 1. 使用标准的Gherkin关键字Feature, Scenario, Given, When, Then, And, But。 2. 场景描述应清晰、无歧义每个步骤只做一件事。 3. 背景Background和场景大纲Scenario Outline仅在适当时使用。 4. 如果需要示例数据请使用data占位符不要使用真实数据。 5. 输出格式必须是纯净的Gherkin语法不要有任何额外的解释或Markdown格式。 以下是一些优秀示例 示例需求“用户登录功能如果用户名密码正确则跳转到首页如果错误则提示错误信息。” 示例输出Feature: User Login As a registered user I want to login to the system So that I can access my personal dashboardScenario: Successful login with valid credentials Given the user is on the login page When the user enters a valid username and password And clicks the login button Then the user should be redirected to the homepage And a welcome message should be displayedScenario: Failed login with invalid credentials Given the user is on the login page When the user enters an invalid username or password And clicks the login button Then an error message Invalid username or password should be displayed And the user should remain on the login page现在请处理以下需求{{ user_requirement }}2. 步骤定义生成提示词 (prompt_templates/generate_steps.j2)你是一个Python开发工程师熟悉behave测试框架。 请根据以下Gherkin场景生成对应的Python步骤定义代码骨架。 只需要生成 given, when, then 装饰器及其对应的函数骨架函数体内用 pass 或适当的注释如 # TODO: implement this step填充。 遵循PEP8风格使用清晰的函数名和参数。 示例Gherkin步骤Given the user is on the login page 示例输出 python from behave import given, when, then given(the user is on the login page) def step_impl(context): # TODO: navigate to login page, e.g., context.browser.get(/login) pass现在请为以下Gherkin场景生成步骤定义{{ gherkin_scenario }} **实操心得**提示词中的示例Few-shot至关重要。它比单纯描述规则更有效。我们建立了“场景示例库”针对不同的业务领域如登录、支付、搜索收集了高质量的Gherkin示例在生成时动态选择最相关的2-3个示例插入提示词能显著提升生成质量。 ### 3.3 核心环节二实现生成链与输出 在 main.py 中我们实现两个主要的生成链。 python import os from langchain.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain.globals import set_verbose set_verbose(True) # 调试时开启查看LangChain的中间过程 class BDDGenerator: def __init__(self, llm): self.llm llm self.output_parser StrOutputParser() # 加载提示词模板 with open(prompt_templates/generate_scenario.j2, r) as f: scenario_template f.read() with open(prompt_templates/generate_steps.j2, r) as f: steps_template f.read() self.scenario_prompt ChatPromptTemplate.from_template(scenario_template) self.steps_prompt ChatPromptTemplate.from_template(steps_template) # 构建链 self.scenario_chain self.scenario_prompt | self.llm | self.output_parser self.steps_chain self.steps_prompt | self.llm | self.output_parser def generate_from_requirement(self, requirement: str, feature_name: str): 从需求生成Feature文件和Steps文件 print(f正在为需求生成BDD场景...) # 1. 生成Gherkin场景 gherkin_text self.scenario_chain.invoke({user_requirement: requirement}) print(生成的Gherkin场景) print(gherkin_text) print(- * 50) # 2. 保存Feature文件 feature_file_path foutput/features/{feature_name}.feature os.makedirs(os.path.dirname(feature_file_path), exist_okTrue) with open(feature_file_path, w) as f: f.write(gherkin_text) print(fFeature文件已保存至{feature_file_path}) # 3. 生成步骤定义代码 steps_code self.steps_chain.invoke({gherkin_scenario: gherkin_text}) print(\n生成的步骤定义代码) print(steps_code) # 4. 保存Steps文件 steps_file_path foutput/steps/{feature_name}_steps.py os.makedirs(os.path.dirname(steps_file_path), exist_okTrue) with open(steps_file_path, w) as f: f.write(steps_code) print(fSteps文件已保存至{steps_file_path}) return feature_file_path, steps_file_path if __name__ __main__: generator BDDGenerator(llm) # 示例需求 sample_req 作为一个电商网站的用户我希望能够将商品加入购物车。 如果商品有库存加入成功购物车图标数量增加页面显示成功提示。 如果商品无库存则提示“该商品已售罄”且不能加入购物车。 如果未登录用户尝试加入则弹出登录模态框。 generator.generate_from_requirement(sample_req, add_to_cart)运行这个脚本你会在output/目录下得到add_to_cart.feature和add_to_cart_steps.py两个文件。生成的Gherkin场景会包含多个Scenario来覆盖正常、库存不足、未登录等情况步骤定义代码也包含了对应的函数骨架。这已经完成了从需求到可执行测试框架代码的80%的基础工作。4. 进阶优化与工程化考量4.1 提升生成质量上下文检索与领域微调最初的版本可能对复杂需求或特定领域术语处理不佳。我们需要引入更强大的上下文。方案一基于向量数据库的上下文检索将历史的需求文档、已编写的Feature文件存入向量数据库如Chroma。当有新需求输入时先检索最相关的历史资料并将其作为上下文连同Few-shot示例一起喂给LLM。# 伪代码示例 from langchain_community.vectorstores import Chroma from langchain_openai import OpenAIEmbeddings # 初始化向量库 embeddings OpenAIEmbeddings() vectorstore Chroma.from_documents(documents, embeddings) # documents为历史文档 # 检索相关上下文 retriever vectorstore.as_retriever(search_kwargs{k: 3}) relevant_docs retriever.invoke(user_requirement) # 将relevant_docs的内容整合到提示词中这样AI在生成“退货流程”的场景时就能参考历史上“换货流程”的写法保持公司内部用词和风格的一致性。方案二对开源模型进行LoRA微调如果公司有大量高质量的、标注好的需求-Gherkin对数据可以考虑使用像unsloth这样的工具对CodeLlama或Mistral模型进行轻量级的LoRA微调让它更擅长生成符合我们特定规范的BDD内容。这能从根本上提升生成质量并降低对昂贵API的依赖。4.2 集成到开发工作流从IDE到CI/CD生成的代码不能是孤立的必须融入现有流程。IDE插件开发一个VS Code插件。当开发人员在写代码注释或修改需求文档时右键选择“生成BDD场景”插件调用后台服务直接将生成的.feature文件插入到项目的对应features目录并打开预览。PR拉取请求机器人在GitHub/GitLab上配置一个机器人。当新的PR被创建或更新时机器人分析PR描述和代码变更自动生成或更新相关的BDD场景并以评论的形式提交供评审者参考。这能确保测试用例与代码变更同步。CI流水线任务在CI流水线中增加一个“BDD场景健康度检查”任务。使用AI分析新提交的Feature文件检查其语法规范性、场景的完整性是否覆盖了主要分支和异常流甚至可以尝试运行生成的步骤定义骨架如果已实现给出初步的质量报告。4.3 建立评估与反馈闭环我们不能盲目相信AI的输出。必须建立评估机制。自动化基础校验使用gherkin-lint等工具校验生成的Gherkin语法。人工审核打分在工具界面提供“/”按钮收集用户对生成结果的直接反馈。场景执行率追踪追踪AI生成的场景中最终有多少被团队采纳并成功实现了自动化测试。这是一个关键的业务指标。反馈回流将人工修正后的最终版Gherkin以及标记为“好”的生成结果不断补充到我们的向量数据库和Few-shot示例库中。这样系统就在持续学习和进化。5. 避坑指南与常见问题在实际落地过程中我们遇到了不少挑战以下是总结出的关键注意事项和解决方案。问题现象/风险解决方案与建议生成场景过于笼统AI生成的步骤像“用户进行操作然后看到结果”缺乏可操作的具体细节如具体的URL、按钮ID、数据。在提示词中强调“具体化”和“可自动化”。要求步骤必须包含可识别的UI元素如#login-btn或API端点。提供包含具体细节的优秀示例。场景逻辑遗漏或错误AI可能遗漏重要的异常流程如网络超时、并发冲突或生成不符合业务逻辑的场景。AI生成仅是初稿。必须建立强制的人工审核环节。可以设计检查清单Checklist审核者需逐一确认是否覆盖了主要成功路径、所有已知异常路径、业务规则边界等。步骤定义代码不可用生成的Python函数骨架参数不匹配或使用了项目中不存在的上下文context变量。在生成步骤定义的提示词中提供更多本项目实际的步骤定义代码作为示例。甚至可以先生成步骤定义再用一个单独的AI调用或规则引擎根据项目框架规范如使用selenium还是requests进行代码风格转换。成本失控频繁调用GPT-4 API生成大量场景费用快速增长。采用混合模型策略。首次创意性生成用强模型后续根据模板修改或生成简单步骤定义时切换到GPT-3.5-Turbo或本地微调模型。对生成结果进行缓存对相同或相似的需求直接复用缓存。“幻觉”问题AI生成了需求中根本不存在的功能或业务规则。在System Prompt中明确指令“只基于提供的需求描述生成场景不要添加任何需求中未提及的功能或假设。” 同时在输出解析后可以增加一个简单的“一致性校验”步骤用AI快速比对生成场景的关键词是否都来源于输入需求。最重要的心得不要追求全自动。我们的目标是“AI辅助”而不是“AI替代”。将AI定位为一个不知疲倦、知识渊博的初级测试工程师它能快速产出高质量的草稿但最终的决策权、业务逻辑的确认权必须牢牢掌握在人的手中。人机协作才是效率和质量的最大保障。这套方法实施后在我们团队编写基础BDD场景的时间平均减少了约70%团队能将更多精力投入到复杂的集成测试、性能测试和探索性测试中。更重要的是业务、开发和测试三方在“需求-场景”的对齐上更加顺畅因为AI生成的场景成了一个大家共同讨论和优化的起点而不是从零开始争吵的焦点。生成式AI为BDD注入了新的活力让它从一个理想的协作框架真正变成了触手可及的生产力工具。