UAT发动机
基于模型上下文协议的人工智能原生测试
给你的AI代理一个浏览器、一个HTTP客户端和一个MCP探测器。让它测试任何东西。
46个用于浏览器自动化、API测试和MCP服务器验证的MCP工具-- 完全通过控制 模型上下文协议.
    
建造于 OpZero 的 --AI原生部署平台。
______________________________________________________________________
为什么选择UAT发动机?
人工智能代理正在发送代码,但谁来测试它呢?传统的测试框架需要人工编写和维护脚本。UAT Engine翻转模型:代理 描述要测试的内容,发动机手柄 怎么.
- MCP本地 --插入任何MCP客户端(Claude、Cursor、自定义代理)。没有SDK,没有包装器,只有工具调用。
- 浏览器+API+MCP --一个引擎包括UI验收测试、API集成测试和MCP服务器验证。
- 声明性流程 --编写具有变量插值、条件、并行执行和跨步数据传递的YAML规范。零代码。
- 幕后剧作家 --完全Chromium自动化,具有屏幕截图、跟踪、设备模拟和代理支持。
- 生产硬化 --多级Docker镜像,非root执行,连接耗尽的优雅关机,就绪探测。
用于生产 OpZero.sh 验证Cloudflare、Netlify和Vercel之间的部署。
快速开始
# Install
bun install
# Start the MCP server
bun run start
# => Listening on http://localhost:3200/mcp将任何MCP客户端指向 http://localhost:3200/mcp 并开始调用工具:
{
"mcpServers": {
"uat": {
"type": "url",
"url": "http://localhost:3200/mcp"
}
}
}使用Docker
docker build -t uat-engine .
docker run --init -p 3200:3200 uat-engineMCP工具
9个类别的46个工具。所有前缀均为 uat_.
会话管理
| 工具 | 它做什么 |
|---|---|
uat_session_create | 启动浏览器会话(无头、视口、设备模拟、代理) |
uat_session_list | 列出活动会话及其状态 |
uat_session_close | 关闭会话并释放资源 |
浏览器导航
| 工具 | 它做什么 |
|---|---|
uat_navigate_goto | 导航到URL |
uat_navigate_back | 回到历史 |
uat_navigate_forward | 在历史中前进 |
uat_navigate_reload | 重新加载页面 |
uat_navigate_wait | 等待条件(选择器、网络空闲、超时) |
浏览器交互
| 工具 | 它做什么 |
|---|---|
uat_interact_click | 按选择器单击元素 |
uat_interact_fill | 填写输入字段 |
uat_interact_select | 选择下拉选项 |
uat_interact_check | 切换复选框 |
uat_interact_press | 按键盘键 |
uat_interact_scroll | 滚动页面或至某个元素 |
uat_interact_upload | 将文件上传到输入 |
浏览器观察
| 工具 | 它做什么 |
|---|---|
uat_observe_screenshot | 截图(整页或元素) |
uat_observe_snapshot | 获取页面HTML快照 |
uat_observe_get_text | 从元素中提取文本内容 |
uat_observe_get_attribute | 读取元素属性 |
uat_observe_evaluate | 在页面上下文中执行JavaScript |
断言
| 工具 | 它做什么 |
|---|---|
uat_assert_visible | 断言元素可见 |
uat_assert_text | 断言元素文本匹配(精确、包含、正则表达式) |
uat_assert_url | 断言当前URL与模式匹配 |
uat_assert_title | 断言页面标题 |
uat_assert_count | 断言元素计数(eq、gt、lt) |
uat_assert_value | 断言输入字段值 |
uat_assert_status | 断言HTTP响应状态代码 |
uat_assert_body | 在响应体中声明值(支持虚线路径) |
API测试
| 工具 | 它做什么 |
|---|---|
uat_api_request | 发送带有标头、正文和身份验证的HTTP请求——返回带时间的结构化响应 |
MCP服务器测试
| 工具 | 它做什么 |
|---|---|
uat_mcp_connect | 连接到远程MCP服务器 |
uat_mcp_list_tools | 发现连接上的可用工具 |
uat_mcp_call | 调用工具并测量响应时间 |
uat_mcp_disconnect | 断开与MCP服务器的连接 |
流程执行
| 工具 | 它做什么 |
|---|---|
uat_flow_run | 执行YAML流规范 |
uat_flow_run_suite | 使用聚合的通过/失败运行多个流 |
uat_flow_list | 列出可用的流量规格 |
uat_flow_validate | 在不运行流规范的情况下对其进行验证 |
uat_flow_get_results | 从已完成的流运行中检索结果 |
录制
| 工具 | 它做什么 |
|---|---|
uat_record_start | 开始录制剧作家的足迹 |
uat_record_stop | 停止录制并保存跟踪文件 |
uat_record_list | 列出已保存的录音 |
流量规格
流是声明性的YAML文件,将工具链接到完整的测试场景中。无需代码——代理编写YAML,引擎执行它。
示例:健康检查
name: health-check
description: Verify a page loads and has expected content
config:
base_url: "${BASE_URL}"
steps:
- action: goto
url: "${BASE_URL}"
- action: wait
condition: networkidle
- action: screenshot
name: homepage-loaded
- action: assert_title
match: contains
value: "${EXPECTED_TITLE}"
- action: assert_visible
selector: "nav"示例:部署和验证(API+浏览器)
name: api-deploy-verify
description: Deploy via API, then verify the result in a browser
steps:
- action: api_request
method: POST
url: "${BASE_URL}/api/deploy"
headers:
Authorization: "Bearer ${API_TOKEN}"
body:
files:
index.html: "
smoke test
"
assert_status: 200
save_as: deploy
- action: goto
url: "${deploy.body.url}"
- action: assert_text
selector: "h1"
value: "smoke test"示例:MCP服务器验证
name: mcp-tools-check
description: Verify an MCP server responds with expected tools
steps:
- action: mcp_connect
url: "${MCP_URL}"
auth: "Bearer ${MCP_TOKEN}"
- action: mcp_list_tools
save_as: tools
- action: assert_body
path: "tools.length"
operator: gte
value: 1
- action: mcp_call
tool: "repos_list"
params: {}
save_as: repos
- action: mcp_disconnect流量特征
- 变量插值 --
${VAR}从会话上下文、流配置和环境变量解析。点状路径,如${deploy.body.url}支持。 - 跨步数据 --
save_as: name存储步骤结果以供后续步骤使用 - 条件 --
if: key/unless: key用于条件步骤执行 - 平行组 --
parallel:块同时运行步骤 - 行动路线 --
api_*转到HTTP客户端,mcp_*对于MCP探针,assert_*对于断言,其他一切都归功于剧作家
码头工人
独立
docker build -t uat-engine .
docker run --init -p 3200:3200 uat-engineDocker Compose(带网络)
docker network create devnet # if not already created
docker compose upcompose配置包括:
init: true用于正确的信号处理read_only: true带有显式tmpfs挂载的rootfs- 2GB内存/2 CPU限制(Chromium需要余量)
- 健康检查
/health - 加入
devnet服务发现网络
部署到铁路
railway up看 railway.toml 对于部署配置。
建筑
mcp-server/src/
index.ts Entrypoint -- HTTP server, graceful shutdown, readiness probe
types.ts Shared TypeScript types
engine/
browser.ts Playwright browser pool (singleton, isolated contexts per session)
http-client.ts HTTP client with structured responses
mcp-probe.ts MCP client for testing remote MCP servers
trace-manager.ts Playwright trace recording
session-store.ts In-memory session + context store
flow-runner.ts YAML flow execution engine
tools/
session.ts Session lifecycle tools
navigate.ts Browser navigation tools
interact.ts Browser interaction tools
observe.ts Screenshot, snapshot, text extraction
assert.ts Assertion tools (browser + API)
api.ts HTTP request tool
mcp-client.ts MCP connect / list / call / disconnect
flow.ts Flow execution tools
record.ts Trace recording tools
flows/
examples/ Starter flow specs生产硬化
- 多级Dockerfile --Builder安装deps,运行时仅复制生产工件
- 非根执行 --运行为
pwuser(uid 1001)来自剧作家基础图像 - 优雅关闭 --SIGTERM/SIGINT触发就绪探测失败、连接耗尽(10秒截止时间)、浏览器池关闭,然后干净退出
- 就绪探针 --
/readiness在排水过程中返回503,与/health活性 - 请求超时 --每个MCP请求的截止时间为5分钟
- 运输跟踪 --在停机时跟踪并排空活动连接
由OpZero制造
OpZero 的 是一个AI原生部署平台。从任何MCP客户端(Claude、Cursor或您自己的代理)将网站发送到Cloudflare、Netlify和Vercel。
UAT引擎是我们验证部署工作的方式 opzero.sh AI代理可以使用此引擎进行烟雾测试。
- opzero.sh --从AI部署
- @OpZero sh --更多来自OpZero的开源
贡献
欢迎捐款。请先打开一个问题以进行非琐碎的更改。
bun install # install deps
bun run dev # start with watch mode
bun test # run tests
bun run typecheck # type check