尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

AI生成本地跑:用Copilot写Gherkin,MCP当司机,微软团队的自动化测试务实方案

发布时间:2026/9/26 11:14:53

资讯中心
01
ARTICLE

AI生成本地跑:用Copilot写Gherkin,MCP当司机,微软团队的自动化测试务实方案

AI生成本地跑:用Copilot写Gherkin,MCP当司机,微软团队的自动化测试务实方案
1. 为什么我把 Copilot 从“执行者”降级成“翻译官”聊 AI 做自动化测试很容易走两个极端要么觉得 AI 不靠谱生成的脚本跑两次就崩要么幻想一个 Agent 全自动搞定一切。我两种都试过最后发现真正能落地的方案是把 AI 限定在它擅长的位置——生成而不是执行。具体来说这套思路的核心是Copilot 负责把 Gherkin 自然语言场景翻译成调用本地工具的代码Behave 负责确定性地执行MCP 负责在中间当“司机”把工具能力标准化地暴露出来。适合谁适合团队里有产品、外包测试这类非开发角色希望他们也能产出自动化资产也适合应用同时覆盖 Windows 桌面和移动端不想为每个平台维护两套脚本的团队。我踩过的坑是一开始让 AI 直接生成完整的 pytest 脚本结果控件定位、等待逻辑、异常处理全靠它猜跑十次崩三次。后来改成“AI 只生成对 MCP 工具的调用序列”执行交给本地框架稳定性立刻上来了。这篇就按这个思路给你一套可复制的 config.toml 和 settings.json 骨架再演示一次从生成到跑通的完整验证。2. TaoToken 前置给 Copilot 和 MCP 链路准备一个稳定的模型入口在动手写配置之前先把模型调用这一层理顺。Copilot 生成 Gherkin 步骤定义、MCP Server 内部如果需要调用模型做意图解析都需要一个稳定的 API 入口。我这边用的是 TaoToken 的 API 地址它兼容 OpenAI 风格的调用方式配置起来比较直接。你需要先拿到一个 API Key。操作路径是访问官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 进入控制台后创建 API Key。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite API Keys 管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。拿到 Key 之后API 的基础地址填 https://taotoken.net/api 注意这个地址不带 UTM 参数直接写就行。如果你后面要跑长期编码任务或者 Agent 类的自动化可以看看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。只是想先验证模型能不能正常对话用模型对话页就行https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 配置遇到问题可以先翻这里。注意API Key 不要硬编码在会被提交到 Git 的文件里用环境变量或者本地 settings.json 的私有字段承载。3. 可复制配置config.toml 与 settings.json 骨架这一节是全文的技术核心。整套链路需要两个配置文件一个是 MCP Server 的 config.toml定义工具注册和平台适配另一个是 Copilot 侧的 settings.json告诉它去哪里找 MCP Server、用哪个模型。3.1 MCP Server 的 config.toml这个文件放在你的 MCP Server 项目根目录负责声明当前平台注册哪些工具、连接参数是什么。# config.toml - MCP Server 配置骨架 [server] name autogenesis-mcp version 0.1.0 transport stdio # 本地通信用 stdio避免额外端口暴露 log_level info [platform] # 当前激活的平台可选 windows / android / ios / macos active windows [platform.windows] driver pywinauto backend uia # Windows UI Automation default_timeout 10 # 秒单次控件查找超时 [platform.android] driver appium server_url http://127.0.0.1:4723 capabilities { platformName Android, automationName UiAutomator2 } [platform.ios] driver appium server_url http://127.0.0.1:4723 capabilities { platformName iOS, automationName XCUITest } [llm] # 模型调用入口用于 MCP Server 内部的意图解析可选 base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY # 从环境变量读取不写死 model gpt-4o-mini timeout 30 [tools] # 按平台注册工具AI 只能看到当前平台可用的工具 windows [click_element, input_text, get_window, wait_for_element] android [tap_element, input_text, swipe, wait_for_element] ios [tap_element, input_text, swipe, wait_for_element]关键点在于[tools]这一段连接 Windows 时AI 看不到 Android 专用的swipe避免它生成当前上下文里根本不存在的调用。这是“给 AI 戴镣铐”最直接的一步。3.2 Copilot 侧的 settings.json这个文件放在.vscode/settings.json或者你的 Copilot 配置目录告诉编辑器去哪里启动 MCP Server。{ mcpServers: { autogenesis: { command: python, args: [-m, autogenesis_mcp.server], cwd: ${workspaceFolder}/mcp-server, env: { TAOTOKEN_API_KEY: ${env:TAOTOKEN_API_KEY}, MCP_CONFIG_PATH: ${workspaceFolder}/mcp-server/config.toml } } }, github.copilot.chat.mcp.enabled: true, github.copilot.chat.codeGeneration.instructions: [ { text: 生成步骤定义时只允许调用 MCP 工具列表中存在的工具不要自行发明函数名。 } ] }env里用${env:TAOTOKEN_API_KEY}引用系统环境变量这样 Key 不会出现在配置文件里。codeGeneration.instructions那段是给 Copilot 的硬约束实测能明显减少它“自由发挥”生成不存在函数的概率。3.3 Behave 侧的钩子骨架Behave 是同步框架MCP 客户端通信通常是异步的中间需要一个桥接。在environment.py里这样写# features/environment.py import asyncio import threading import janus from autogenesis_mcp.client import MCPClient _loop None _queue None def before_all(context): global _loop, _queue _queue janus.Queue() _loop asyncio.new_event_loop() def run_loop(): asyncio.set_event_loop(_loop) _loop.run_forever() threading.Thread(targetrun_loop, daemonTrue).start() context.mcp MCPClient(loop_loop, queue_queue) def after_all(context): context.mcp.close() _loop.call_soon_threadsafe(_loop.stop)janus.Queue提供了线程安全的同步/异步桥接步骤函数里用同步方式调用context.mcp.call_tool(...)底层走异步 IO写起来不别扭。4. 验证请求从 Gherkin 生成到 Behave 跑通配置就绪后走一遍完整链路。我以一个 Windows 记事本的场景为例。4.1 写一个 Gherkin 场景# features/notepad.feature Feature: 记事本基础操作 Scenario: 输入文字并保存 Given 记事本应用已启动 When 我在编辑区输入 hello autogenesis And 我点击菜单 文件 And 我点击菜单项 保存 Then 编辑区内容应包含 hello autogenesis4.2 让 Copilot 生成步骤定义在 VS Code 里打开这个 feature 文件唤起 Copilot Chat输入根据当前 feature 文件生成 Behave 步骤定义只调用 MCP 工具列表中的工具。Copilot 会先给出一个 diff 预览展示它准备写入steps/notepad_steps.py的内容。确认无误后再落盘。生成的代码大致长这样# features/steps/notepad_steps.py from behave import given, when, then given(记事本应用已启动) def step_launch_notepad(context): context.mcp.call_tool(get_window, {title: 记事本}) when(我在编辑区输入 {text}) def step_input_text(context, text): context.mcp.call_tool(input_text, {target: edit_area, text: text}) when(我点击菜单 {menu}) def step_click_menu(context, menu): context.mcp.call_tool(click_element, {name: menu, role: menu}) when(我点击菜单项 {item}) def step_click_menu_item(context, item): context.mcp.call_tool(click_element, {name: item, role: menu_item}) then(编辑区内容应包含 {expected}) def step_verify_content(context, expected): result context.mcp.call_tool(get_window, {title: 记事本}) assert expected in result.get(text, ), f期望包含 {expected}4.3 执行并观察结果# 确保 MCP Server 依赖已安装 pip install pywinauto janus fastmcp # 设置 API Key export TAOTOKEN_API_KEY你的key # 运行 Behave behave features/notepad.feature成功的话你会看到类似输出Feature: 记事本基础操作 # features/notepad.feature:2 Scenario: 输入文字并保存 # features/notepad.feature:3 Given 记事本应用已启动 # features/steps/notepad_steps.py:4 When 我在编辑区输入 hello autogenesis # features/steps/notepad_steps.py:8 And 我点击菜单 文件 # features/steps/notepad_steps.py:12 And 我点击菜单项 保存 # features/steps/notepad_steps.py:16 Then 编辑区内容应包含 hello autogenesis # features/steps/notepad_steps.py:20 1 feature passed, 0 failed, 0 skipped到这一步整条链路就跑通了Gherkin 是自然语言Copilot 翻译成工具调用MCP 把调用转成本地 pywinauto 操作Behave 同步执行并断言。5. 本篇常见错排查5.1 MCP Server 启动失败报 “No module named autogenesis_mcp”大概率是cwd路径不对。settings.json 里的cwd是相对于工作区根目录的确认你的 MCP Server 项目确实在${workspaceFolder}/mcp-server下。如果目录名不同改成实际路径。另外确认python -m autogenesis_mcp.server这个模块入口存在有些项目入口是main.py那就改成args: [mcp-server/main.py]。5.2 Copilot 生成的代码调用了不存在的工具检查 config.toml 里[tools]段当前平台注册了哪些工具。如果 AI 生成了swipe但你在 Windows 平台说明它没读到平台限制。解决办法是在 settings.json 的codeGeneration.instructions里把约束写得更死比如加上“当前平台为 windows可用工具仅限 click_element/input_text/get_window/wait_for_element”。5.3 Behave 步骤函数里调用 MCP 工具卡死这是同步/异步桥接没处理好。确认before_all里启动了独立的事件循环线程并且MCPClient内部用的是janus.Queue而不是普通的asyncio.Queue。普通队列跨线程会出问题。另外检查after_all里有没有正确关闭 loop否则进程可能挂住不退出。5.4 控件定位失败报 element not foundWindows 上用 pywinauto 的uiabackend 时控件名要和实际 UI 树一致。可以用inspect.exe或者 pywinauto 自带的print_control_identifiers()打印控件树确认name和role字段。移动端 Appium 则检查 accessibility id 是否配置正确。这类问题 AI 帮不上忙得人工调。5.5 API 调用返回 401检查环境变量TAOTOKEN_API_KEY是否在当前 shell 会话里生效。export之后要新开终端或者source一下配置文件。另外确认 config.toml 里api_key_env写的变量名和实际导出的名字一致大小写敏感。6. 后续怎么接把这条链路用起来跑通一次之后你可以把 Behave 的执行挂到 CI 里每次提交自动跑核心回归场景。Gherkin 场景由产品或者外包同学写Copilot 生成步骤定义人工确认 diff 后落盘执行完全本地化。这套分工的好处是AI 的不确定性被限制在“生成”阶段而且生成结果有人工审查执行阶段是纯本地代码稳定可重复。如果你要接更多平台比如 Android只需要在 config.toml 里把active改成android确保 Appium Server 已启动然后重新生成对应平台的步骤定义。上层的 Gherkin 场景可以完全复用这是 MCP 抽象层带来的最大收益。模型调用这一层如果后面要跑更复杂的 Agent 任务可以走 Coding Plan 那条线日常验证模型连通性用模型对话页就够了。接入细节翻文档API Key 在控制台管理。整条链路的关键不是模型多强而是把 AI 放在它该在的位置上。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。