# UnitRunner **Repository Path**: ctstudio5/unit-runner ## Basic Information - **Project Name**: UnitRunner - **Description**: UnittestRunner 现代化智能接口测试平台(持续更新中,可能问题较多) - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2026-11-06 - **Last Updated**: 2026-11-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

UnittestRunner

一站式开源 API 测试智能协作平台

python version Django version Vue version Node version License


UnittestRunner 是一站式开源持续测试平台,涵盖接口测试、小程序测试、性能测试、智能助手等功能,帮助测试团队进行高度可扩展的自动化测试,加速高质量的软件交付。 ## 功能特性 - ⌨️ **接口测试** — 接口管理、用例步骤编排、测试计划与构建报告、WebSocket 调试 - 🧠 **AI 断言推荐** — 结构化输出 + 回查校验,结果按内容哈希缓存 - 🔍 **报告解读** — 失败步骤归因到「环境异常 / 用例错误 / 代码缺陷, 结果按「报告 + 失败步骤」指纹缓存 30 分钟 - 📱 **小程序测试** — 微信小程序自动化;执行计划状态由 Celery 每分钟同步 - 🖥️ **UI E2E 自动化** — Playwright MCP 驱动的浏览器任务编排、录制健壮化、执行报告;工具集 - 🧮 **性能测试** — Locust 引擎(子进程隔离),恒定并发 / 阶梯加压,TPS、RT(P50/P90/P95/P99)、成功率、错误分布、实时快照与告警规则 - 🤖 **AI 应用** — 用例生成、智能问答(DeepAgents + Skills + MCP 工具注入)、知识库、技能管理、MCP 工具集、UI E2E、缺陷预测 - 📄 **需求文档解析** — Word / PDF / 图片经 PaddleOCR 识别(doc/docx 先转 PDF),HTML / TXT / MD 直读,再交 LLM 结构化 - 📚 **知识库(RAG)** — MinerU 解析成、DashScope 向量化,查询走「意图解析 → 双路召回 → RRF 融合 → 重排 → 生成」的 LangGraph 状态机 - 🩺 **缺陷预测** — TAPD 缺陷增量同步入库,LLM 分诊判级(规则兜底)、近期缺陷主题归纳、月度预测的 AI 解读 - 🔁 **闭环任务** — 用例调试 / 计划执行的失败步骤自动派生任务与异常明细 - 📁 **项目管理 / 首页看板** — 项目列表与总览、成员与邀请链接、团队活跃度热力图;首页统计、趋势与通知一屏总览 - 👤 **个人中心** — 我的消息、闭环任务、我的成果、我的资料 - 🔌 **录制插件** — Chrome MV3 插件,DevTools 录制页面请求并下载数据,再走「接口管理 → 导入数据」入库 - ⚙️ **测试配置** — 环境管理(含环境色标)、数据库管理、内置函数、通知设置(企业微信 / 钉钉 / 飞书 / Webhook)、系统配置(TAPD 接入) - 🛡️ **系统管理** — 用户 / 部门 / 角色 / 菜单,邮箱验证码 + 图形验证码注册与找回密码 ## 系统架构 | 模块 | 说明 | 技术栈 | |------|------|--------| | **unit-web** | 前端控制台 | Vue 3 + TypeScript + Vite 8 + Element Plus + Pinia + ApexCharts + Monaco | | **unit-backend** | 主服务:REST / WebSocket、AI Agent、知识库、定时任务 | Django 6 + DRF + Celery(beat / results)+ Channels + Daphne + LangChain 1.x / DeepAgents / LangGraph;MySQL + Redis + PostgreSQL | | **unit-executor** | 接口 / 用例 / 计划执行引擎(gRPC:`RunApiDoc` / `RunCase` / `RunPlan`),启动即向 Consul 注册 | Python 3.10+ + gRPC(grpcio / protobuf)+ python-consul | | **unit-swarm** | 性能压测引擎(gRPC `MeterService`),Locust 子进程隔离执行 | Python 3.10+ + gRPC + Locust 2.37 + python-consul | | **unit-mcp** | FastMCP 提示词服务(SSE),提供 `case_generator_prompt`;另带 Playwright MCP 的 npm 启动脚本 | Python + mcp(FastMCP)+ Node(`@playwright/mcp`) | | **unit-plugin** | 浏览器请求录制插件 | Chrome Manifest V3 + Vue 3 + Vite 5 | ![架构图](unit-backend/staticfiles/images/架构图.png) ### 端口占用 | 服务 | 端口 | 说明 | |------|------|------| | unit-backend | 8000 | Daphne ASGI,HTTP + WebSocket | | unit-web | 8080 | Vite dev server | | unit-mcp | 8899 | FastMCP SSE,端口写在 `src/prompts/case_generator.py`,需与后端 `settings.McpServer` 一致 | | Playwright MCP | 8931 | 由 `unit-mcp` 的 `npm run playwright:mcp` 拉起 | | unit-executor / unit-swarm | 随机空闲端口 | 启动时 TCP bind 0,再注册到 Consul | | Consul | 8500(DNS 8600) | 服务发现 | ### 目录结构 ``` unit-runner/ ├── unit-backend/ # Django 主服务 │ ├── agent/ # AI:agents / workflows / tools / memory / prompts / eval │ ├── api/ # 业务:models / dao / views / routers / services / management │ ├── celery_worker/ # Celery worker、定时任务(小程序计划同步、TAPD 缺陷同步) │ ├── config/ # settings / urls / asgi │ ├── utils/ # 执行、IO(OCR / 消息)、缓存、安全等基础能力 │ └── staticfiles/images/# 架构图与截图 ├── unit-executor/ # 接口执行引擎(gRPC) ├── unit-swarm/ # 压测引擎(gRPC + Locust) ├── unit-mcp/ # MCP 提示词服务 + Playwright MCP 启动脚本 ├── unit-plugin/ # 浏览器录制插件 ├── unit-web/ # 前端控制台 ``` ### AI Agent 工程结构(`unit-backend/agent`) | 目录 | 职责 | |------|------| | `core/` | 配置、模型句柄(对话 / 推理 / 结构化 / 视觉)、embedding、rerank,以及第三方封装 `vendors/`(MinerU、MinIO、MCP 客户端、Markdown 切块) | | `memory/` | 长期向量记忆:Chroma 客户端与切片仓储 | | `schemas/` | 切片与重排 DTO | | `prompts/` | 26 个 `.md` 提示词,`load_prompt("name")` 直接读盘 —— 改完刷新生效,不用重启 | | `tools/` | 给模型调用的工具:9 个业务工具(统计 / 需求 / 用例查询、文档解析、用例生成)、知识库检索、MCP 工具集装配(白名单 + 命名前缀 + 版本化缓存) | | `agents/` | 业务 Agent:需求提取、用例生成、UI 用例生成、断言推荐、报告解读、缺陷分诊 / 主题归纳 / 预测解读 | | `workflows/` | 编排:UI 执行引擎、技能注册(`api/skills/*/SKILL.md`)、两张 LangGraph 图 | | `application/` | 知识库对外三个入口:`search` / `answer` / `ingest` | | `eval/` `recording/` | RAGAS 离线评测;键控录制与 pytest 导出 | **两条 LangGraph 链路**(节点失败即短路到 END,错误落 `state.error`): - 入库:`pdf_to_md → md_img_handle → md_split → text_to_embedding` - 查询:`intention_parse → kb_confirm →(embedding_search ‖ hyde_search)→ rrf_merge → web_search → chunks_rerank → result_fusion` 只出切片的场景(智能问答的工具调用、知识库检索接口)在 `chunks_rerank` 就结束 —— 答案交给外层 LLM 组织,避免同一次提问生成两遍、多付一次模型费用。 > 智能问答与技能测试的会话续接依赖 PostgreSQL(`AsyncPostgresSaver`,连接串 `DATABASE_AGENT_URL`);知识库的 Chroma 是本地持久化目录,不需要独立向量库服务。 > > WebSocket 的 Channels layer 目前是进程内的 `InMemoryChannelLayer`:Celery worker 的进度广播到不了 Daphne 进程,跨进程进度由前端轮询兜底。 ## 快速开始 ### 前置依赖 - **Python 3.13**(`unit-backend`,`pyproject` 约束 `^3.13`)与 **Python 3.10+**(`unit-executor` / `unit-swarm` / `unit-mcp`) - **Node.js 20.19+ 或 22.12+**(`unit-web` 的 Vite 8 要求)与 npm - **MySQL**(业务库)、**Redis**(列表缓存 / Celery broker 与 backend)、**Consul**(服务发现)、**PostgreSQL**(智能问答会话检查点) - **知识库凭据**:`Mineru_Token`(mineru.net,90 天有效)+ `Bailian_ApiKey`(百炼,embedding / rerank / WebSearch);MinIO 可选,未启用时图片跳过 - Windows 下可运行 `unit-backend/start_services.vbs` 一键启动 Redis、Consul 与 Playwright MCP(脚本内的本地路径需按需修改) ### 1. 配置 `unit-backend/.env` 敏感配置全部从 `.env` 读,源码里没有明文默认值;该文件已被 `.gitignore` 忽略。最小可用集合: ```ini # Django SECRET_KEY=change-me DEBUG=True # MySQL DB_NAME=easypost DB_USER=root DB_PASSWORD= DB_HOST=127.0.0.1 DB_PORT=3306 # Redis(缓存 / Celery broker / Celery backend 分库) REDIS_HOST=127.0.0.1 REDIS_PORT=6379 REDIS_PASSWORD= REDIS_CACHE_DB=2 REDIS_CELERY_BROKER_DB=1 REDIS_CELERY_BACKEND_DB=5 # 智能问答会话检查点,不配则智能问答 / 技能测试不可用 DATABASE_AGENT_URL=postgresql://postgres:password@127.0.0.1:5432/agent # AI 能力 DeepSeek_Keys= # 对话 / 推理 / 结构化(同端点同 key) Bailian_ApiKey= # text-embedding-v4 + qwen3-rerank + WebSearch Mineru_Token= # 知识库文档解析 PADDLE_OCR_ACCESS_TOKEN= # 需求文档 / 附件 OCR # 可选:知识库图片对象存储 Minio_Endpoint=localhost:9000 Minio_AccessKey= Minio_SecretKey= Minio_Bucket=rag-bucket # 可选:微信小程序测试 / 邮件通知 MINI_TEST_TOKEN= MINI_PROJECT_ID= EMAIL_HOST_USER= EMAIL_HOST_PASSWORD= ``` `CONSUL_HOST` / `CONSUL_PORT` / `McpServer` 在 `config/settings.py` 中已有默认值(`127.0.0.1:8500`、`http://127.0.0.1:8899/sse`),需要覆盖时同样写进 `.env`。 ### 2. 启动后端 ```bash cd unit-backend pip install poetry poetry install ``` ```bash # 执行迁移与初始化(首次部署) python manage.py makemigrations python manage.py migrate python manage.py initializeMenu # 菜单 python manage.py initializeDepartment # 部门 python manage.py initializeFunction # 内置函数 python manage.py initializeRecommends # 推荐数据 python manage.py createAdministrator # 初始化管理员 # 启动后端(ASGI / Daphne),默认 http://127.0.0.1:8000 python manage.py runserver ``` ```bash # 异步任务:执行、AI 生成、缺陷同步都靠 worker celery -A celery_worker.worker.celery worker --pool=solo -l INFO celery -A celery_worker.worker.celery beat -l INFO ``` ```bash # 按需 python manage.py backup # 数据备份 python manage.py sync_tapd_bugs # 手动补一次 TAPD 缺陷同步 python manage.py kb_eval --kb-id 1 # 知识库离线评测(另需 pip install ragas) ``` ### 3. 启动执行器与压测服务 两者启动时都会把自己注册到 Consul(地址读 `CONSUL_HOST` / `CONSUL_PORT`),端口由内核分配: ```bash # 接口 / 用例 / 计划执行引擎 cd unit-executor && pip install -e . && python main.py # 压测引擎 cd unit-swarm && pip install -e . && python main.py ``` ### 4. 启动前端 ```bash cd unit-web npm install npm run dev # http://localhost:8080 ``` ### 5. 启动 MCP 服务(AI 用例生成 / UI 自动化) ```bash cd unit-mcp pip install mcp loguru # FastMCP 服务端依赖 python src/main.py # http://127.0.0.1:8899/sse npm install npm run playwright:mcp # Playwright MCP:端口 8931 ``` 首次使用 UI E2E 时,还需在「AI 应用 → MCP 工具集」新增一条名称含 `playwright` 的工具集(transport 选 `sse` 或 `streamable_http`,URL 指向 8931)—— 执行器按名称回落到它。 ### 6. 构建浏览器录制插件 ```bash cd unit-plugin npm install npm run build # 产物在 dist/,Chrome 扩展管理页「加载已解压的扩展程序」 ``` ### 7. 跑测试 ```bash cd unit-backend && python manage.py test api.tests # Django TestCase,覆盖 api/tests cd unit-executor && pip install -e ".[dev]" && pytest # unitrunner/test ``` ## UI 展示
平台预览(点击可展开) #### 🍦 项目管理 ![](unit-backend/staticfiles/images/项目列表页面.png) ![](unit-backend/staticfiles/images/项目详情页面.png) ![](unit-backend/staticfiles/images/项目成员管理.png) ![](unit-backend/staticfiles/images/项目邀请.png) #### 🍦 首页 ![](unit-backend/staticfiles/images/首页.png) #### 🍦 环境管理 ![](unit-backend/staticfiles/images/环境管理.png) #### 🍦 接口管理 ![](unit-backend/staticfiles/images/接口管理页面.png) ![](unit-backend/staticfiles/images/接口详情页面.png) #### 🍦 用例管理 ![](unit-backend/staticfiles/images/用例列表页面.png) ![](unit-backend/staticfiles/images/用例详情页面.png) #### 🍦 测试计划 ![](unit-backend/staticfiles/images/计划列表.png) ![](unit-backend/staticfiles/images/计划详情.png) #### 🍦 测试报告 ![](unit-backend/staticfiles/images/测试报告.png) #### 🍦 性能测试 ![](unit-backend/staticfiles/images/性能计划.png) ![](unit-backend/staticfiles/images/性能报告01.png) ![](unit-backend/staticfiles/images/性能报告02.png) #### 🍦 智能助手 ![](unit-backend/staticfiles/images/ai助手.png) #### 🍦 用例生成 ![](unit-backend/staticfiles/images/用例生成.png) #### 🍦 技能管理 ![](unit-backend/staticfiles/images/技能管理列表.png) ![](unit-backend/staticfiles/images/技能管理详情.png) #### 🍦 MCP工具集 ![](unit-backend/staticfiles/images/MCP列表.png) ![](unit-backend/staticfiles/images/MCP详情页面.png) #### 🍦 缺陷预测 ![](unit-backend/staticfiles/images/缺陷预测-1.png) ![](unit-backend/staticfiles/images/缺陷预测-2.png) ![](unit-backend/staticfiles/images/缺陷预测-3.png) #### 🍦 知识库 ![](unit-backend/staticfiles/images/知识库列表.png) ![](unit-backend/staticfiles/images/知识库详情.png) #### 🍦 AI自动化 ![](unit-backend/staticfiles/images/UIE2E列表.png) ![](unit-backend/staticfiles/images/UIE2E详情.png) #### 🍦 我的成果 ![](unit-backend/staticfiles/images/我的成果.png) #### 🍦 我的资料 ![](unit-backend/staticfiles/images/我的资料.png)
## 文档 - [用户操作手册](https://gitee.com/xiaoxiaolulu12/unit-runner/wikis/pages) — 按菜单逐页的操作说明、常见问题与术语表 - 接口文档:启动后端后访问 `http://127.0.0.1:8000/swagger/`(drf-yasg) ## 支持作者 如果这个项目对你有帮助,欢迎去 [Gitee](https://gitee.com/xiaoxiaolulu12/unit-runner) 点个 ⭐ Star,这将是对我极大的鼓励!