Agent+MCP+SKills性能测试·接口自动化·UI自动化·测试用例生成

0 阅读9分钟

系统概述

系统定位

但问智能测试管理系统是一个基于 LangChain大语言模型 ​

的企业级测试自动化平台,通过多个专业智能体实现测试全流程的智能化。

核心价值

全栈覆盖: API、性能、UI 测试、测试用例、缺陷分析全覆盖

智能生成: 基于需求和 Schema 自动生成测试

自动修复: 智能诊断并修复失败的测试

多框架支持: Playwright、Jest、Artillery.io、Postman

核心技术栈

后端技术栈

前端/Node.js 技术栈

技术栈详细清单

智能体架构

架构设计模式

核心设计原则

1. 技能化架构 (Skills-Based Architecture)

每个智能体由多个可复用技能组成:

# API 智能体技能结构api/├── agent_skills/│   └── skills/│       ├── planner/# 测试规划技能│       │   └── SKILL.md│       ├── generator/# 代码生成技能│       │   └── SKILL.md│       └── healer/# 测试修复技能│           └── SKILL.md

Plain Text

2. MCP 协议集成

使用 Model Context Protocol 实现工具与智能体的标准化通信:

# MCP 客户端配置client = MultiServerMCPClient({    "ui": {        "transport": "stdio",        "command": "npx",        "args": ["playwright"]    },    "perf": {        "transport": "stdio",        "command": "node",        "args": ["./artillery-mcp-server.js"]    }})

Plain Text

3. 虚拟文件系统后端

使用 FilesystemBackend 实现工作空间隔离:

workspace_backend = FilesystemBackend(    root_dir=workspace_root,    virtual_mode=True  # 虚拟模式,不直接操作文件系统)

Plain Text

🤖 四大核心智能体

1️⃣ API 测试智能体

文件位置: backend/app/agents/api/agent.py

核心能力

三大核心技能

Planner - API 测试规划
功能: 从 Schema 生成全面测试计划输入:  - OpenAPI 3.0 / Swagger 2.0 / GraphQL SDL  - 本地文件路径或远程 URL输出:  - 功能测试场景  - 安全测试场景  - 边界测试场景  - 真实测试样本数据  - 可选的端点验证结果

Plain Text

特色功能

支持的 50+ 字段模式:

Generator - API 测试代码生成
功能: 自动生成可执行测试代码支持框架:  - Playwright Tests  - Jest Tests  - Postman Collections
工作流程:  1. api_project_setup (检测项目框架)  2. 提取测试计划章节  3. api_generator (生成代码)  4. 验证生成的测试  5. 手动优化 (可选)

Plain Text

生成示例

// Playwright API 测试示例import { test, expect } from '@playwright/test';
test.describe('User API Tests', () => {  test('should create user with valid data', async ({ request }) => {    const response = await request.post('/api/users', {      data: {        firstName: 'John',        lastName: 'Doe',        email: 'john.doe@example.com',        password: 'SecurePass123!'      }    });
    expect(response.status()).toBe(201);    const body = await response.json();    expect(body).toHaveProperty('id');    expect(body.email).toBe('john.doe@example.com');  });});

Plain Text

Healer - API 测试修复
功能: 自动诊断并修复失败的 API 测试
5 种修复策略:  1. schema-update: Schema 变更更新  2. endpoint-fix: 端点 URL 修复  3. auth-repair: 认证问题修复  4. data-correction: 测试数据修正  5. assertion-update: 断言更新
诊断能力:  - 错误消息分析  - 响应结构对比  - 网络问题诊断  - Schema 一致性检查

Plain Text

工作流程

2️⃣ 性能测试智能体

文件位置: backend/app/agents/perf/agent.py

核心能力

Artillery.io 配置生成

# 自动生成的 Artillery 配置示例config:  target: "https://api.example.com"  phases:    - duration: 60      arrivalRate: 10  # warm-up      name: "Warm up"    - duration: 300      arrivalRate: 50  # normal load      name: "Sustained load"    - duration: 120      arrivalRate: 100  # peak load      name: "Peak spike"    - duration: 60      arrivalRate: 5   # cool-down      name: "Cool down"
scenarios:  - name: "User Journey"    flow:      - get:          url: "/api/products"      - think: 2  # 用户思考时间      - post:          url: "/api/cart"          json:            productId: "{{ $randomString() }}"            quantity: 2

Plain Text

性能报告

关键指标

3️⃣ UI 测试智能体

文件位置: backend/app/agents/ui/agent.py

核心能力

三大核心技能

Planner - UI 测试规划
功能: 分析 Web 应用并创建测试计划
工具:  - planner_setup_page: 初始化浏览器页面  - browser_click: 点击元素  - browser_type: 输入文本  - browser_snapshot: 捕获页面快照
输出:  - 用户流程分析  - 测试场景设计  - 选择器策略建议

Plain Text

Generator - UI 测试生成
功能: 生成可靠的 Playwright 测试代码
工作流程:  1. generator_setup_page (初始化页面)  2. 执行测试步骤 (实时浏览器操作)  3. generator_read_log (读取操作日志)  4. generator_write_test (生成测试代码)
选择器策略 (优先级):  1. data-testid (最稳定)  2. role-based (role, name)  3. aria-label  4. CSS Selector  5. XPath (最后选择)

Plain Text

生成的 Playwright 测试示例

import { test, expect } from '@playwright/test';
test.describe('Login Flow', () => {  test('user can login with valid credentials', async ({ page }) => {    // Navigate to login page    await page.goto('/login');
    // Fill login form    await page.fill('[data-testid="email-input"]', 'user@example.com');    await page.fill('[data-testid="password-input"]', 'SecurePass123!');
    // Click login button    await page.click('[data-testid="login-button"]');
    // Verify successful login    await expect(page).toHaveURL('/dashboard');    await expect(page.locator('[data-testid="welcome-message"]')).toBeVisible();  });});

Plain Text

Healer - UI 测试修复
功能: 修复失败的 Playwright 测试
诊断能力:  - 错误消息分析  - 页面快照对比  - 网络请求检查  - 选择器验证
修复策略:  - 更新过时的选择器  - 优化等待策略  - 修复时序问题  - 调整断言条件

Plain Text

Playwright MCP 工具集

4️⃣ 测试用例生成智能体

文件位置: backend/app/agents/testcase/agent.py

核心能力

支持的测试用例格式

传统测试用例格式
{  "name": "用户使用正确凭据登录成功",  "description": "验证用户使用正确的用户名和密码能够成功登录系统",  "preconditions": "用户已注册且账号状态正常",  "priority": "critical",  "case_type": "functional",  "test_case_steps": [    {      "step": "打开登录页面",      "result": "页面正常显示登录表单"    },    {      "step": "输入正确的用户名和密码",      "result": "输入框接受输入"    },    {      "step": "点击登录按钮",      "result": "成功登录并跳转到首页"    }  ]}

Plain Text

BDD (行为驱动开发) 格式
{  "name": "用户登录场景",  "template": "test_case_bdd",  "feature": "用户认证",  "scenario": "用户使用正确的凭据登录",  "background": "Given 用户已注册\nAnd 用户账号状态正常",  "priority": "high",  "case_type": "acceptance"}

Plain Text

动态上下文配置

@dataclassclass TestCaseGeneratorContext:    """测试用例生成器上下文"""    project_identifier: str = ""    # 项目标识符    folder_id: str = ""              # 文件夹 ID    current_user_id: str = "..."     # 当前用户 ID    template_type: str = "test_case" # 默认模板类型

Plain Text

PDF 文档解析

PDF 处理器:  - PyPDF2: 基础 PDF 文本提取  - langchain-community: 高级 PDF 解析  - 自研多模态提取组件: 表格和图片提取
工作流程:  1. 接收 PDF 文件  2. 提取文本内容  3. 分析需求文档  4. 识别功能点  5. 生成测试用例

Plain Text

优先级分类

| 优先级

| 说明

| 适用场景

|

| ------------------ | ---------------- | ------------------------ | | critical

| 关键功能


   | 核心业务流程、安全相关

| | high

| 高优先级


   | 重要功能、影响用户体验

| | medium

| 中等优先级


 | 常规功能 (默认)


    |

| low

| 低优先级


   | 次要功能、边缘场景


 |

测试类型

支持类型:  - functional: 功能测试  - regression: 回归测试  - smoke_sanity: 冒烟测试  - acceptance: 验收测试  - performance: 性能测试  - security: 安全测试  - usability: 可用性测试  - compatibility: 兼容性测试  - accessibility: 可访问性测试  - destructive: 破坏性测试

Plain Text

🔬 技术实现细节

MCP (Model Context Protocol) 集成

什么是 MCP?

MCP 是一个标准化协议,用于 AI 智能体与工具之间的通信。

MCP 配置示例

# UI 测试智能体 MCP 配置client = MultiServerMCPClient({    "ui": {        "transport": "stdio",        "command": r"npx",        "args": ["playwright"]    }})
async with client.session("ui") as session:    tools = await load_mcp_tools(session)    agent = create_agent(        model=model,        tools=tools,        system_prompt=SYSTEM_PROMPT    )

Plain Text

异步上下文管理器

@asynccontextmanagerasync def make_agent() -> AsyncIterator[Pregel]:    """    创建 agent 的工厂函数,使用 asynccontextmanager 保持 MCP session 存活。
    优势:    - session 在 agent 生命周期内保持活跃    - 退出时自动清理资源    - 遵循 LangGraph API 最佳实践    """    client = MultiServerMCPClient({...})
    async with client.session("perf") as session:        tools = await load_mcp_tools(session)        agent = create_agent(...)        yield agent  # session 会保持存活

Plain Text

动态 Prompt 系统

@dynamic_promptdef dynamic_prompt_fn(request: ModelRequest) -> str:    """动态生成测试用例系统提示词"""    context = request.runtime.context
    return f"""系统提示词...
    ## 当前上下文信息    - 项目标识符: {context.project_identifier}    - 文件夹 ID: {context.folder_id}    - 模板类型: {context.template_type}    ...    """

Plain Text

文件系统后端

# 技能库后端 (只读,存储技能定义)skills_backend = FilesystemBackend(    root_dir=skills_root,    virtual_mode=True# 虚拟模式)
# 工作空间后端 (读写,存储测试产物)workspace_backend = FilesystemBackend(    root_dir=workspace_root,    virtual_mode=True)

Plain Text

中间件系统

# SkillsMiddleware - 加载技能定义skills_middleware = SkillsMiddleware(    backend=skills_backend,    sources=["/skills/generator/","/skills/healer/","/skills/planner/"])
# 创建智能体时注入中间件agent = create_agent(    model=model,    tools=tools,    middleware=[skills_middleware],    backend=workspace_backend)

Plain Text

🔄 工作流程

API 测试完整工作流

性能测试工作流

UI 测试工作流

✅ 最佳实践

API 测试最佳实践

DO:  • 使用 api_planner 一次生成完整测试计划• 启用端点验证 (validateEndpoints: true)  • 选择合适的测试类别 (testCategories)  • 从上下文使用 apiBaseUrl  • 优先使用 schemaPath 而非 schemaUrl (本地文件)
❌ DON'T:  • 重复调用 api_planner (除非用户明确要求)  • 跳过 api_project_setup (生成器必需)  • 忽略验证失败的端点  • 假设所有 API 都无需认证  • 使用硬编码的项目参数

Plain Text

性能测试最佳实践

DO:  • 从保守设置开始 (低 RPS, 短时长)  • 逐步增加负载找到系统极限  • 设置合理的 SLA 阈值  • 使用多阶段测试 (warm-up → load → cool-down)  • 生成增强 HTML 报告 (供干系人查看)
❌ DON'T:  • 直接在生产环境测试 (需授权)  • 使用过高的负载导致系统崩溃  • 忽略错误率分析  • 跳过 cool-down 阶段  • 假设性能目标 (需明确定义)

Plain Text

UI 测试最佳实践

DO:  • 优先使用 data-testid 选择器  • 使用 waitForLoadState 而非 sleep  • 编写独立的测试 (可随机执行)  • 添加详细的步骤注释  • 使用正则表达式处理动态数据
❌ DON'T:  • 使用脆弱的 CSS/XPath 选择器  • 使用固定的等待时间  • 编写依赖性测试  • 忽略错误诊断  • 询问用户问题 (应自主决策)

Plain Text

测试用例生成最佳实践

DO:  • 使用上下文参数 (project_identifier, folder_id)  • 设计全面的测试场景  • 设置合适的优先级  • 使用描述性的用例名称  • 批量创建相关用例
❌ DON'T:  • 忽略上下文参数  • 创建模糊的用例名称  • 遗漏前置条件  • 忽略边界条件  • 重复创建相同用例

Plain Text

📊 技术对比

🚀 快速开始

环境要求

Python: 3.13+Node.js: 22+PostgreSQL: 14+MongoDB: 5+

Plain Text

安装依赖

# 后端依赖cd backendpip install -r requirements.txt
# 前端/UI MCP 依赖cd uinpm install
# 全局安装 Artillerynpm install -g artillery

Plain Text

配置环境变量

# .env 文件配置DEEPSEEK_API_KEY=your_api_keyDATABASE_URL=postgresql+asyncpg://...MONGODB_URL=mongodb://...API_SKILLS_ROOT=./backend/app/agents/api/agent_skillsAPI_WORKSPACE_ROOT=./workspace/apiPERF_WORKSPACE_ROOT=./workspace/perfUI_WORKSPACE_ROOT=./workspace/ui

Plain Text

启动服务

# 启动 FastAPI 后端cd backenduvicorn app.main:app --reload # 启动前端 (如需要)cd uinpm run dev

Plain Text

🎓 学习资源

LLM 和智能体

LangChain: docs.langchain.com/oss/python/…

LangGraph: docs.langchain.com/oss/python/…

MCP 协议: modelcontextprotocol.io/

测试框架

Playwright: playwright.dev/

Jest: jestjs.io/

Artillery: www.artillery.io/

API 规范

OpenAPI 3.0: swagger.io/specificati…

GraphQL: graphql.org/learn/

📞 支持与反馈

微信: huice666/danwen668

文档版本: 2.0

最后更新: 2026-01-16

维护团队: 但问智能技术团队