# AgentTest **Repository Path**: Hello_Tester/AgentTest ## Basic Information - **Project Name**: AgentTest - **Description**: AI智能自动化测试平台 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-06-29 - **Last Updated**: 2026-06-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AI智能测试平台 *** ## 一、系统架构 ### 1.系统构成 #### 前端 - 技术栈 :Vue 3 + Vite + Element Plus + Pinia + Vue Router + Axios + CodeMirror - 核心模块 : - 用户管理(登录/注册/用户列表) - 项目选择 - 项目管理(仪表盘、模块、环境、成员) - 功能测试(需求导入、用例、AI生成用例) - 接口测试(接口导入、接口管理、接口依赖、基础用例、自动化用例、测试套件、执行计划、测试报告) #### 后端 - 技术栈 :Python + FastAPI + Tortoise ORM + MySQL + JWT - 核心模块 : - 用户管理、项目管理、测试环境、功能测试、接口测试、测试管理、测试执行 - AI工作流:功能用例生成、接口用例生成(接口基础用例生成、可执行接口用例生成) - 接口文档解析:OpenAPI解析器/Swagger解析器/AI智能解析器 - 执行引擎: api\_case\_run (BaseTestCase / TestExecute) - 外挂知识库:Lightrag ### 2.架构图 ```mermaid flowchart TB subgraph External[外部依赖] LLM[大模型服务
DeepSeek / SiliconFlow] MySQL[(MySQL 数据库)] LightRAG[LightRAG 知识库
外挂/预留] end subgraph Frontend[前端层 Vue3 + Vite] Pinia[Pinia 状态管理] Router[Vue Router] Axios[Axios HTTP请求] EP[Element Plus UI组件] CM[CodeMirror 代码编辑器] subgraph FrontendModules[前端业务模块] FM_User[用户登录/注册/管理] FM_Project[项目管理
模块/环境/成员/仪表盘] FM_Functional[功能测试
需求/用例/AI生成] FM_Api[接口测试
接口导入/接口管理/基础用例/自动化用例
依赖/套件/计划/报告] FM_UI[UI测试
用例/页面] end Pinia --> FrontendModules Router --> FrontendModules Axios -->|HTTP| BackendAPI end subgraph Backend[后端层 FastAPI + Tortoise ORM] Auth[JWT 认证] BackendAPI[REST API 路由] subgraph BackendService[业务服务模块] S_User[user 用户管理] S_Project[project 项目管理] S_Env[environment 测试环境] S_Func[functional_test 功能测试] S_Api[api_test 接口测试] S_Mgmt[test_mgmt 测试管理] S_Exec[test_execution 测试执行] end subgraph Parser[接口文档解析] OpenAPI[openai_document_parser
OpenAPI 3.0] Swagger[swagger_document_parser
Swagger 2.0] AI_Parser[ai_parser_api_document
AI解析] end subgraph AIWorkflow[AI工作流引擎 LangGraph] subgraph ApiMainFlow[接口用例生成主流程
api_case_generator_main_workflow] WF_ApiBase[api_basecase_workflow
生成基础用例] WF_ApiRun[api_run_case_workflow
生成可执行用例+预执行] end WF_CaseGen[case_generator_workflow
功能用例生成] end subgraph Prompts[提示词模板] P_Workflow[config/prompts/workflow] P_ApiCase[config/prompts/api_case_work] end subgraph Execution[测试执行引擎] Execute[execute.py 任务/套件/用例执行器] BaseCase[basecase.py 单条用例执行] DBClient[database_client.py 数据库客户端] TestResult[test_result.py 结果记录] end end BackendAPI --> BackendService BackendAPI --> Parser Parser -->|解析后的接口文档| WF_ApiBase WF_ApiBase -->|基础用例| WF_ApiRun WF_ApiRun -->|调用预执行| Execution AIWorkflow --> Prompts BackendService --> MySQL Prompts --> LLM LightRAG -.->|预留| LLM ``` ### 3.架构说明 | 层级/模块 | 说明 | | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **前端层** | 基于 Vue 3 + Vite 构建的单页应用,使用 Element Plus 作为 UI 组件库,Pinia 管理用户登录等全局状态,Axios 统一调用后端 API,CodeMirror 用于环境全局工具函数的 Python 脚本编辑。 | | **后端层** | 基于 FastAPI 提供 RESTful API,Tortoise ORM 操作 MySQL 数据库,JWT 完成认证与权限校验。 | | **业务服务模块** | 按领域拆分为用户、项目、测试环境、功能测试、接口测试、测试管理、测试执行七大模块。 | | **接口文档解析** | 提供 OpenAPI 3.0、Swagger 2.0 与 AI 智能解析三种方式,将接口文档转换为统一结构接口,供接口用例生成工作流使用。 | | **AI 工作流引擎** | 基于 LangGraph 实现。`case_generator_workflow` 负责从需求文档生成功能测试用例;`api_case_generator_main_workflow` 编排 `api_basecase_workflow`(生成基础用例)与 `api_run_case_workflow`(生成可执行用例并预执行)。 | | **提示词模板** | `config/prompts/workflow` 与 `config/prompts/api_case_work` 目录下存放各工作流节点使用的 LLM 提示词模板。 | | **测试执行引擎** | `api_case_run` 模块负责实际执行接口用例,核心包括 `TestExecute`(任务/套件/用例调度)与 `BaseTestCase`(单条用例执行、变量替换、前后置脚本、断言、数据提取)。 | | **外部依赖** | 大模型服务(DeepSeek / SiliconFlow)提供 LLM 能力;MySQL 持久化业务数据;LightRAG 作为外挂知识库预留,暂未深度集成到功能用例生成流程。 | *** ### 4.前端示例 ![图1](./img/img1.png) ![图2](./img/img2.png) *** ## 二、部分模块核心逻辑 ### 1.工作流 #### 1. 根据需求文档生成测试用例 ##### 1.1 流程图 ```mermaid flowchart TD %% 主流程 M_START([START]) --> M1[生成测试点
generator_point] M1 --> M2[生成测试用例
generate_test_case] M2 --> M3[验证测试用例覆盖率
verify_testcase_coverage] M3 -->|未覆盖全部测试点| M2 M3 -->|已覆盖全部测试点| M4[保存测试用例
save_test_cases] M4 --> M_END([END]) %% 子流程 subgraph GeneratorPointWorkflow [子工作流:测试点生成] direction TB S_START([START]) --> S1[生成测试点
generate_test_points] S1 --> S2[验证测试点覆盖率
verify_test_points_coverage] S2 --> S3{路由分发
route_dispatch} S3 -->|测试点未全部覆盖| S1 S3 -->|测试点已经全部覆盖| S4[输出所有测试点
output_all_test_points] S4 --> S_END([END]) end %% 子流程与主流程的连接 M1 -.->|进入子流程| S_START S_END -.->|返回测试点列表| M1 ``` *** ##### 1.2 测试点转功能用例 需求文档(示例) ```markdown # 功能说明文档: ## 📌 F1.1 用户注册 ### 🧩 功能背景 新用户通过注册方式创建账户,支持邮箱/用户名+密码的注册方式。 ### 🚶 主流程 1. 用户打开注册页,填写注册信息 2. 系统校验格式与唯一性(用户名、邮箱) 3. 提交注册,后台创建账户,初始状态为"正常" 4. 注册成功后自动登录并跳转首页 ### ⚠️ 异常流程 - 邮箱/用户名已被注册:提示"已存在" - 两次密码不一致:提示用户重新输入 ### 📌 状态规则 - 新用户状态为 "正常" - 注册时间记录为创建时间,头像为默认图 ### 📌 业务规则 - 用户名唯一,支持 4~20 位字母数字组合 - 密码长度不少于 06rag使用案例.py 位 - 邮箱必须符合格式 `xxx@xxx.xx` ``` 转 测试点: ```json [ { "type": "正向验证", "test_point": "输入正确的用户名和密码,成功登录" }, { "type": "正向验证", "test_point": "登录后跳转到正确的页面" }, { "type": "边界测试", "test_point": "用户名长度为最小值时登录" }, { "type": "异常处理", "test_point": "输入错误的用户名,提示\"用户名不存在\"" }, ... ] ``` 转 功能用例: ```json [ { "case_id": "用例编号", "case_name": "用例名称", "priority": "优先级", "preconditions": "前置步骤", "test_steps": "测试步骤", "test_data": "输入数据", "expected_result": "预期结果", "actual_result": "实际结果" }, ... ] ``` *** #### 2. 根据接口生成接口测试用例 ##### 2.1 流程图 ```mermaid flowchart TD %% 顶层主流程 START([START]) --> M1[生成基础用例
generator_base_case] M1 --> M2{并发生成可执行用例} M2 -->|Send / gather| R1[生成可执行用例
generate_run_api_case] R1 --> M3[保存所有用例
output_save_all_case] M3 --> END1([END]) %% 子工作流1:api_basecase_workflow subgraph SW1 [子工作流1:api_basecase_workflow 生成基础测试用例] direction TB S1_START([START]) --> S1_1[生成基础测试用例
generator_base_case] S1_1 --> S1_2[检查用例的覆盖率
check_coverage] S1_2 --> S1_3{验证覆盖率是否通过
check_coverage_is_pass} S1_3 -->|未通过| S1_4[补充基础测试用例
supplement_case] S1_4 --> S1_2 S1_3 -->|通过| S1_5[保存基础测试用例
save_base_case] S1_5 --> S1_END([END
返回 base_cases]) end %% 子工作流2:api_run_case_workflow subgraph SW2 [子工作流2:api_run_case_workflow 生成并预执行单条接口用例] direction TB S2_START([START]) --> S2_1[加载工具函数和文件列表
get_functions_and_files] S2_1 --> S2_2[生成接口用例
generator_api_case] S2_2 --> S2_3[用例预执行
api_case_run] S2_3 --> S2_4{验证用例是否可用
check_case_is_pass} S2_4 -->|不可用且未达3次| S2_2 S2_4 -->|可用 或 已重试3次| S2_5[保存用例
save_api_case] S2_5 --> S2_END([END
返回 api_case]) end %% 调用关系 M1 -.->|调用子工作流1| S1_START S1_END -.->|返回基础用例列表| M1 M2 -.->|对每条基础用例调用| S2_START S2_END -.->|返回单条可执行用例| R1 ``` *** ##### 2.2 接口文档(接口解析器解析后)转基础用例转接口用例 接口文档(示例) ```json { "path": "API路径", "method": "HTTP方法(GET/POST/PUT/DELETE等)", "summary": "接口的简要名称", "parameters": { "header": [{ "name": "参数名", "type": "参数类型", "description": "参数说明", "required": true / false }], "path": [{ "name": "参数名", "type": "参数类型", "description": "参数说明", "required": true / false }], "query": [{ "name": "参数名", "type": "参数类型", "description": "参数说明", "required": true / false }] }, "requestBody": { "content_type": "请求体类型,如 application/json,无请求体时为null", "body": [{ "name": "字段名", "type": "string|integer|boolean|number等基础类型", "description": "字段说明", "required": true / false }, { "name": "对象字段名", "type": "object", "description": "对象字段说明", "required": true / false, "nested_fields": [{ "name": "嵌套字段名", "type": "字段类型", "description": "嵌套字段说明", "required": true / false }] }, { "name": "数组字段名", "type": "array", "description": "数组字段说明", "required": true / false, "array_item_fields": [{ "name": "数组元素字段名", "type": "字段类型", "description": "数组元素字段说明", "required": true / false }] } ] }, "responses": [{ "http_code": "状态码", "description": "响应描述", "media_type": "响应内容类型,如 application/json", "response_body": { "示例响应数据": "值" } }] } ``` 转 基础用例 ```json [ { "name": "测试用例名称", "steps": [ "步骤描述1", "步骤描述2" ], "expected": [ "预期结果断言1", "预期结果断言2" ], "dependencies": ["前置条件依赖数据接口1", "前置条件依赖数据接口2"] }, ... ] ``` 转 接口用例 ```json { "name": "用例名称(简明描述本用例目标,例如:正常请求-注册成功)", "description": "用例描述(对测试场景进行简要说明,如:验证用户注册接口在输入正确参数时返回成功)", "interface": "接口名称或接口路径(与被测主接口对应,例如 /api/users/register)", "preconditions": [{ "name": "前置步骤名称(说明依赖接口的用途,例如:用户登录获取token)", "request": { "interface_id": "前置接口ID(唯一标识,可与接口文档保持一致)", "method": "HTTP方法(如:GET、POST、PUT、DELETE)", "url": "接口路径(如 /api/users/login)", "base_url": "测试环境的基础地址(固定引用环境变量,例如:${{base_url}})", "headers": { "请求头信息(必须包含Content-Type,若需鉴权则包含Authorization)" }, "params": { "查询参数(URL上的?key=value形式参数,若无则为{})" }, "body": { "请求体(application/json请求体参数,若无则为{})" }, "files": { "仅multipart/form-data时使用,文件参数需从文件列表选择,非文件参数也放在此处" }, "setup_script": "前置脚本(Python代码,用于生成动态数据并保存环境变量,禁止直接写死到body)", "teardown_script": "后置脚本(Python代码,用于清理或提取必要数据,若无则为\"\")" }, "extract": [ ["变量名", "jmespath表达式(从接口响应中提取的字段路径,例如 token 或 data.id)"] ] }], "request": { "interface_id": "主接口ID(唯一标识,用于区分不同接口)", "method": "HTTP方法(如:POST)", "url": "接口路径(例如 /api/users/register)", "base_url": "测试环境的基础地址(必须写为 ${{base_url}})", "headers": { "请求头信息(必须根据接口类型配置,例如 application/json 或 multipart/form-data)" }, "params": { "查询参数(键值对形式,若无则为{})" }, "body": { "请求体参数(所有测试数据必须用 ${{变量}} 引用,不能硬编码)" }, "files": { "当Content-Type为multipart/form-data时必填,否则固定为{}" }, "setup_script": "前置脚本(Python代码,用于生成本用例需要的动态变量,调用global_function后必须用test.save_test_env_variables保存)", "teardown_script": "后置脚本(Python代码,执行清理或额外数据提取,若无则为\"\")" }, "assertions": { "response": [{ "type": "断言类型(仅支持 equal / not_null / http_code;http_code用于断言响应状态码)", "field": "响应字段路径(jmespath表达式,例如 data.id;当 type=http_code 时,此处固定为 http_code)", "expected": "预期值(equal需与实际值一致,not_null固定为true,http_code为期望的状态码)" }] } } ``` *** ### 2. 接口用例执行器 流程图 ```mermaid flowchart TD A[execute_test_task
执行测试任务] --> B{遍历 suites_list} B --> C1[suite 1] B --> C2[suite 2] B --> C3[suite N] C1 --> D1[execute_test_suite
执行测试套件] C2 --> D2[execute_test_suite
执行测试套件] C3 --> D3[execute_test_suite
执行测试套件] D1 --> E1{遍历 cases_list} D2 --> E2{遍历 cases_list} D3 --> E3{遍历 cases_list} E1 --> F1[execute_test_case
执行单条用例] E2 --> F2[execute_test_case
执行单条用例] E3 --> F3[execute_test_case
执行单条用例] F1 --> G[创建 TestResult] F2 --> G F3 --> G G --> H{skip?} H -->|是| I[status = skip
直接返回] H -->|否| J[BaseTestCase.run
执行用例核心逻辑] J --> K[execute_preconditions
执行前置依赖] K --> L[replace_variables
变量替换] L --> M[request_api
发送请求] M --> N[extract_data
数据提取] N --> O[assert_result
断言校验] O --> P{异常类型?} P -->|无异常| Q[status = success] P -->|AssertionError| R[status = failed
记录错误信息] P -->|其他异常| S[status = error
记录 traceback] Q --> T[finally: http.aclose] R --> T S --> T T --> U[计算 duration
返回 TestResult] I --> V[汇总套件 summary] U --> V V --> W{所有套件执行完毕?} W -->|否| B W -->|是| X[汇总任务 summary
返回结果] ```