# TestOracle **Repository Path**: aiagentdemo/test-oracle ## Basic Information - **Project Name**: TestOracle - **Description**: 构建的智能测试Agent,能够自动分析需求文档,生成手工测试用例,分析代码仓库调用链路,并生成接口自动化用例和UI自动化用例。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-07-24 - **Last Updated**: 2026-09-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 🧪 TestOracle - AI驱动测试Agent

需求分析 → 手工用例生成 → 代码分析 → 自动化用例生成

TestOracle 是一个基于 **Python + Vue3** 构建的智能测试Agent,能够自动分析需求文档,生成手工测试用例,分析代码仓库调用链路,并生成接口自动化用例和UI自动化用例。 ## 界面预览 ![TestOracle](screenshort.png) ## 🌟 核心功能 ### 1️⃣ 需求管理 - **上传需求文档**:支持上传 PDF、Word、Markdown、TXT 等格式 - **手动输入需求**:支持直接输入需求文本 - **关联代码仓库**:支持绑定 Git 仓库地址和分支 ### 2️⃣ 智能需求分析 - **功能点提取**:自动识别需求的原子功能点,含分类和优先级 - **影响分析**:分析需求影响的功能模块及影响级别 - **风险识别**:自动识别技术、业务、安全、性能等多维风险 - **复杂度评估**:评估需求的复杂度和预估工作量 ### 3️⃣ 手工测试用例生成 - **全维度覆盖**:正向流程、异常流程、边界条件、权限验证、数据完整性 - **结构化用例**:含前置条件、测试数据、测试步骤、预期结果 - **优先级标注**:自动标注用例优先级和风险等级 - **批量确认**:用例确认后自动进入代码分析阶段 ### 4️⃣ 代码分析 - **调用链路分析**:分析页面→组件→API→服务→数据库的完整调用链 - **页面地图**:生成前端页面路由和组件依赖图 - **API接口清单**:提取所有API端点及其参数 - **变更文件追踪**:识别代码变更影响范围 ### 5️⃣ 自动化测试生成 - **API自动化用例**:基于接口定义生成请求参数、断言脚本 - **UI自动化用例**:基于页面元素生成操作步骤和断言脚本 - **脚本导出**:支持生成 Playwright 等测试框架脚本 ### 6️⃣ 插件与Skill系统 - **Tool插件**:注册外部工具(代码分析器、文档解析器等) - **Skill技能**:通过Prompt模板增强Agent特定领域能力 - `security_check`:安全审查技能 - `performance_check`:性能评估技能 - `compatibility_check`:兼容性审查技能 - **GitHub安装**:支持从GitHub仓库安装插件 ## 🏗️ 技术架构 ``` testoracle/ ├── backend/ # Python后端 │ ├── app/ │ │ ├── core/ # 核心配置 │ │ ├── models/ # SQLAlchemy数据模型 │ │ ├── schemas/ # Pydantic Schema │ │ ├── services/ # 业务逻辑层 │ │ │ ├── llm_service.py # LLM交互服务 │ │ │ ├── analyzer.py # 需求分析引擎 │ │ │ ├── code_repo.py # 代码仓库分析 │ │ │ ├── test_generator.py # 测试用例生成 │ │ │ └── plugin_manager.py # 插件管理器 │ │ └── routers/ # API路由 │ ├── main.py # 应用入口 │ └── run.py # 启动脚本 │ ├── frontend/ # Vue3前端 │ └── src/ │ ├── api/ # API接口层 │ ├── stores/ # Pinia状态管理 │ ├── views/ # 页面视图 │ ├── components/ # 公共组件 │ └── router/ # 路由配置 │ └── README.md ``` ## 🚀 快速开始 ### 环境要求 - Python 3.10+ - Node.js 18+ - npm 或 yarn ### 后端启动 ```bash # 1. 进入后端目录 cd testoracle/backend # 2. 创建虚拟环境 python3 -m venv venv source venv/bin/activate # macOS/Linux # venv\Scripts\activate # Windows # 3. 安装依赖 pip install -r requirements.txt # 4. 配置环境变量 cp .env.example .env # 编辑 .env 文件,填入 LLM_API_KEY # 5. 启动服务 python run.py # 服务运行在 http://localhost:8000 # API文档: http://localhost:8000/docs ``` ### 前端启动 ```bash # 1. 进入前端目录 cd testoracle/frontend # 2. 安装依赖 npm install # 3. 启动开发服务器 npm run dev # 运行在 http://localhost:5173 ``` ### 配置LLM 编辑 `backend/.env` 文件: ```env # 使用 OpenAI LLM_API_KEY=sk-your-api-key LLM_BASE_URL=https://api.openai.com/v1 LLM_MODEL=gpt-4o-mini # 或使用其他兼容API # LLM_BASE_URL=https://api.deepseek.com/v1 # LLM_MODEL=deepseek-chat ``` ## 📋 API 接口 | 分组 | 端点 | 说明 | |------|------|------| | 需求管理 | `POST /api/requirements` | 创建需求 | | | `GET /api/requirements` | 需求列表 | | | `GET /api/requirements/:id` | 需求详情 | | | `POST /api/requirements/:id/analyze` | 分析需求 | | 测试用例 | `POST /api/testcases/:id/generate-manual` | 生成手工用例 | | | `POST /api/testcases/:id/confirm-manual` | 确认手工用例 | | | `POST /api/testcases/:id/generate-auto` | 生成自动化用例 | | | `GET /api/testcases/export/:id` | 导出用例(json/markdown/csv/python) | | | `GET /api/testcases/:id/execute-api-stream` | 执行 API 用例(SSE) | | | `GET /api/testcases/:id/execute-ui-stream` | 执行 UI 用例(SSE) | | 执行记录 | `GET /api/executions?requirement_id=` | 执行记录列表 | | | `GET /api/executions/:id` | 执行记录详情 | | 分析 | `GET /api/analysis/requirement/:id` | 获取需求分析 | | | `GET /api/analysis/code/:id` | 获取代码分析 | | 插件 | `GET/POST /api/plugins` | 插件列表/创建 | | | `PATCH/DELETE /api/plugins/:id` | 更新/删除插件 | | 技能 | `GET/POST /api/skills` | 技能列表/创建 | | | `PATCH/DELETE /api/skills/:id` | 更新/删除技能 | ## 🎯 工作流程 ``` 用户输入需求 │ ▼ ┌─────────────┐ │ 需求分析 │ ← 提取功能点、影响范围、风险点 └──────┬──────┘ │ ▼ ┌─────────────┐ │ 生成手工用例 │ ← 正向/异常/边界/权限/数据 └──────┬──────┘ │ 用户确认 │ ▼ ┌─────────────┐ │ 代码分析 │ ← 调用链路、页面地图、API清单 └──────┬──────┘ │ ▼ ┌─────────────┐ │ 自动化用例 │ ← API测试脚本 + UI测试脚本 └─────────────┘ ``` ## 🔌 插件开发 ### 创建自定义插件 1. 在 `插件管理` 页面点击「添加插件」 2. 填写插件信息(名称、类型、入口等) 3. 如果是Python脚本插件,确保入口文件存在 ### 创建自定义Skill 1. 在 `技能管理` 页面点击「添加技能」 2. 编写Prompt模板,Agent分析时会自动注入 3. 可选关联依赖的工具插件 ### 示例:自定义安全审查Skill ```json { "name": "custom_security", "display_name": "自定义安全审查", "skill_type": "prompt_enhancer", "prompt_template": "请从以下安全角度审查:\n1. 认证方式是否安全\n2. 会话管理是否完善\n3. 敏感数据是否脱敏\n4. 是否存在CSRF风险" } ``` ## 📦 项目文件结构 ``` testoracle/ ├── backend/ │ ├── app/ │ │ ├── __init__.py │ │ ├── main.py # FastAPI 主入口 │ │ ├── database.py # 数据库配置 │ │ ├── core/ │ │ │ └── config.py # 配置管理 │ │ ├── models/ │ │ │ ├── requirement.py # 需求模型 │ │ │ ├── testcase.py # 测试用例模型 │ │ │ ├── analysis.py # 分析结果模型 │ │ │ └── plugin.py # 插件/Skill模型 │ │ ├── schemas/ │ │ │ └── schemas.py # Pydantic Schema │ │ ├── services/ │ │ │ ├── llm_service.py # LLM交互 │ │ │ ├── analyzer.py # 分析引擎 │ │ │ ├── code_repo.py # 代码仓库 │ │ │ ├── test_generator.py # 测试生成 │ │ │ └── plugin_manager.py # 插件管理 │ │ └── routers/ │ │ ├── requirement.py # 需求路由 │ │ ├── testcase.py # 用例路由 │ │ ├── analysis.py # 分析路由 │ │ └── plugin.py # 插件路由 │ ├── requirements.txt │ ├── run.py │ └── .env.example │ ├── frontend/ │ ├── src/ │ │ ├── App.vue # 主应用壳 │ │ ├── main.ts # 入口 │ │ ├── api/ │ │ │ ├── requirement.ts # 需求API │ │ │ ├── testcase.ts # 用例API │ │ │ └── plugin.ts # 插件API │ │ ├── stores/ │ │ │ ├── requirement.ts # 需求状态 │ │ │ └── plugin.ts # 插件状态 │ │ ├── views/ │ │ │ ├── HomeView.vue # 仪表盘 │ │ │ ├── RequirementUpload.vue # 上传需求 │ │ │ ├── RequirementDetail.vue # 需求详情 │ │ │ ├── RequirementAnalysis.vue # 需求分析 │ │ │ ├── ManualTestCases.vue # 手工用例 │ │ │ ├── AutoTestCases.vue # 自动化用例 │ │ │ ├── PluginManager.vue # 插件管理 │ │ │ └── SkillManager.vue # 技能管理 │ │ ├── router/index.ts # 路由 │ │ ├── types/index.ts # 类型定义 │ │ └── utils/request.ts # HTTP客户端 │ ├── package.json │ └── vite.config.ts │ └── README.md ``` ## 📄 许可证 MIT License --- ## 🚦 用例执行(对接外部执行服务) 接口/UI 自动化用例在主平台**生成**,实际**执行**委托给一个独立的 Python 执行服务。 主平台负责把用例派发过去、轮询拉取结果、并把每条用例的通过/失败状态写回。 ### 工作流程 ``` 前端点「执行用例」 │ (SSE: /api/testcases/{id}/execute-api-stream | execute-ui-stream) ▼ 主平台创建执行记录 → POST 派发到执行服务 → 拿到 job_id │ ▼ 按 EXECUTOR_POLL_INTERVAL 轮询 GET 执行服务 /jobs/{job_id} 直到终态 │ ▼ 结果写回 TestExecution + 每条 TestCase.last_run_* → 前端展示通过/失败/错误 ``` ### 配置(backend/.env) ```env # 执行服务地址(默认 8100) EXECUTOR_BASE_URL=http://127.0.0.1:8100 # 被测系统地址:执行用例时脚本访问的目标环境(注入为用例 BASE_URL) EXECUTOR_TARGET_BASE_URL=http://127.0.0.1:8000 EXECUTOR_TIMEOUT=30 # 单次请求超时(秒) EXECUTOR_POLL_INTERVAL=2.0 # 轮询间隔(秒) EXECUTOR_MAX_POLL_SECONDS=1800 # 轮询最长等待(秒) ``` ### 执行服务需要实现的接口契约 **1) 派发作业** `POST {EXECUTOR_BASE_URL}/jobs` 请求体: ```json { "requirement_id": 12, "case_type": "api", "env": { "base_url": "http://test-env:8000", "timeout": 10 }, "cases": [ { "case_id": "API-001", "title": "登录接口", "script": "", "precondition": "POST /login", "expected_result": "200", "priority": "high" } ] } ``` 返回:`{ "job_id": "xxxx", "status": "pending" }` **2) 查询作业** `GET {EXECUTOR_BASE_URL}/jobs/{job_id}` 返回: ```json { "status": "completed", "summary": { "total": 3, "passed": 2, "failed": 1, "error": 0 }, "results": [ { "case_id": "API-001", "status": "passed", "duration": 0.5, "message": "", "log": "..." } ] } ``` - `status`:`pending` / `running` / `completed` / `failed` - 每条 `results` 的 `status`:`passed` / `failed` / `error` / `skipped` > 💡 导出的 Python 脚本里每条用例的函数名即 `test_`, > 执行服务用 `pytest --junitxml` 或 `pytest-json-report` 跑完后, > 报告里的 testcase 名能直接反解析回 `case_id`,逐条写回状态。 ### 接口形态不一样怎么办? 所有与执行服务的交互都封装在 **`backend/app/services/executor_client.py`**。 若你的服务路径/字段名不同,只需改这三处适配函数,调用方无需改动: - `_build_payload()`:内部用例 → 执行服务请求体 - `_parse_dispatch()`:派发返回 → `job_id` - `_parse_poll()`:查询返回 → 归一化 `{status, results, summary}` (`_parse_poll` 已兼容 `result`/`caseId`/`elapsed`/`output` 等常见别名。) --- ## ⚙️ 大模型配置说明 TestOracle 支持任何 **OpenAI 兼容格式** 的大模型API。 ### 配置你的公司模型 编辑 `backend/.env` 文件: ```env # 你的公司内部API(示例) LLM_BASE_URL=http://wanqing.internal/api/agent/v1/apps LLM_API_KEY=${WQ_API_KEY} # 支持从环境变量读取 LLM_MODEL=app-7yqw09-1781058516503761661 ``` > **URL拼接规则**: SDK会自动将 `LLM_BASE_URL` 与 `/chat/completions` 拼接。 > 例如 `http://xxx/apps` + `/chat/completions` = `http://xxx/apps/chat/completions` ### 环境变量引用 `LLM_API_KEY` 支持 `${VAR_NAME}` 语法从系统环境变量读取密钥, 避免将密钥硬编码在 `.env` 文件中。 ```env # 从环境变量读取(推荐) LLM_API_KEY=${WQ_API_KEY} # 或直接填写(不推荐,有安全风险) LLM_API_KEY=sk-your-key-here ``` ### 切换到其他模型 只需修改 `.env` 中的三个配置项即可切换模型: ```env # 切换到 DeepSeek LLM_BASE_URL=https://api.deepseek.com LLM_API_KEY=sk-your-deepseek-key LLM_MODEL=deepseek-chat # 切换到 OpenAI LLM_BASE_URL=https://api.openai.com/v1 LLM_API_KEY=sk-your-openai-key LLM_MODEL=gpt-4o-mini # 切换到阿里通义千问 LLM_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1 LLM_API_KEY=sk-your-dashscope-key LLM_MODEL=qwen-turbo ```