系统概述
系统定位
但问智能测试管理系统是一个基于 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
维护团队: 但问智能技术团队