# auto-testcase-gen **Repository Path**: tim1sun/auto-testcase-gen ## Basic Information - **Project Name**: auto-testcase-gen - **Description**: 测试设计辅助系统,基于测试方法论,进行测试建模,根据测试模型自动生成测试用例。 旨在提升测试设计效率和提高测试用例质量。 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-07-26 - **Last Updated**: 2026-09-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 测试用例生成器 一个基于 Flask 的测试用例自动生成工具,支持多种黑盒测试技术的输入解析、用例生成与导出。 ## 功能特性 | 测试技术 | 输入格式 | 生成策略 | |---------|---------|---------| | **XMind** | `.xmind` | 叶子节点 / 带优先级标记的节点 → 测试用例,前置条件沿路径继承 | | **GraphML · 场景流** | `.graphml` | DFS 枚举起点到终点的所有简单路径,每条路径 = 一条端到端用例 | | **GraphML · 状态机** | `.graphml` | 每条有向状态转换(边)= 一条核心转换用例,支持 `事件 / 动作` 分离 | | **GraphML · 因果图** | `.graphml` | 枚举所有原因的 2ⁿ 布尔组合,AND/OR/NOT 门控评估结果 | | **决策表** | `.xlsx` / `.csv` | 按表头前缀(条件-/动作-)分类,每行规则生成一条用例 | | **正交表** | `.xlsx` / `.csv` / `.txt` | 随机采样正交子集(退化时取半量)或全组合(笛卡尔积) | **导出格式**:JSON · Markdown · Excel ## 快速开始 ```bash # 1. 克隆仓库 git clone cd testcase-generator # 2. 创建虚拟环境并安装依赖 python3 -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate pip install -r requirements.txt # 3. 启动服务 ./start.sh dev # 开发模式(Flask 内置服务器,debug 前台运行) # 或 ./start.sh # 生产模式(Gunicorn,后台 daemon) ``` 服务启动后: - 前端页面:http://localhost:8080/ - API 文档(Swagger UI):http://localhost:8080/apidocs/ 启动脚本还支持以下命令: ```bash ./start.sh prod fg # 生产模式 + 前台运行(Docker / systemd 场景) ./start.sh stop # 停止服务(优雅 SIGTERM → 超时强制 kill) ./start.sh status # 查看当前运行状态 # 环境变量临时覆盖 BIND=0.0.0.0:9090 WORKERS=4 ./start.sh ``` ## 生产部署(Gunicorn) 开发用 `python run.py`(Flask 内置服务器),生产环境推荐 Gunicorn: ```bash pip install -r requirements.txt # gunicorn 已包含在内 # 默认启动(0.0.0.0:8080,worker 数 = CPU*2+1) gunicorn -c gunicorn.conf.py run:app # 或通过环境变量覆盖关键参数 GUNICORN_BIND="127.0.0.1:8080" GUNICORN_WORKERS=4 gunicorn -c gunicorn.conf.py run:app ``` Gunicorn 配置要点(详见 `gunicorn.conf.py`): | 配置项 | 默认值 | 说明 | |-------|-------|-----| | `bind` | `0.0.0.0:8080` | 监听地址 | | `workers` | CPU×2+1 | worker 进程数,动态计算 | | `worker_class` | `gthread` | 多线程 worker,适合 I/O 密集(文件上传、XML 解析) | | `threads` | `4` | 每个 worker 的线程数 | | `timeout` | `120s` | 单次请求超时(大文件解析可能较慢) | | `max_requests` | `2000` | worker 处理 N 个请求后自动重启,防止内存泄漏 | 推荐配合 Nginx 做反向代理(静态文件 + 请求缓冲): ```nginx server { listen 80; server_name your-domain.com; client_max_body_size 32m; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_request_buffering off; # 大文件上传,边传边转发 } } ``` ## 项目结构 ``` testcase-generator/ ├── start.sh # 统一启动脚本(dev / prod / stop / status) ├── run.py # 开发入口(也供 Gunicorn 的 run:app 引用) ├── gunicorn.conf.py # Gunicorn 生产配置 ├── requirements.txt ├── .gitignore ├── app/ │ ├── __init__.py # Flask app 工厂 + Swagger 配置 │ ├── config.py # 全局配置(上传大小、密钥) │ ├── routes/ │ │ ├── main.py # 首页路由 │ │ ├── api.py # /api/generate、/api/export │ │ └── templates.py # /api/template/ 动态模板生成 │ ├── services/ │ │ ├── xmind.py # XMind 解析与生成 │ │ ├── graphml.py # GraphML 解析 + 三种子模式生成 │ │ ├── decision_table.py # 决策表解析与生成 │ │ ├── orthogonal.py # 正交表 / 全组合生成 │ │ └── exporter.py # JSON / Markdown / Excel 导出 │ ├── templates/ │ │ └── index.html # 前端 SPA 模板 │ └── static/ │ ├── css/style.css # 前端样式(从 index.html 提取) │ ├── js/app.js # 前端脚本(从 index.html 提取) │ └── img/ │ ├── logo.png # Header logo(占位,可替换) │ └── favicon.ico # 浏览器标签页图标(占位,可替换) └── .venv/ ``` ## API 说明 所有接口均以 `/api` 为前缀,详细参数和响应结构可在 Swagger UI 中查看。 ### POST /api/generate 根据输入文件和模式生成测试用例。 | 参数 | 类型 | 必填 | 说明 | |-----|------|-----|-----| | `mode` | string | ✅ | `xmind` / `graphml` / `decision_table` / `orthogonal` | | `file` | file | ✅ | 上传的输入文件 | | `graph_mode` | string | graphml 必填 | `scene_flow` / `state_machine` / `cause_effect` | | `ortho_mode` | string | orthogonal 可选 | `orthogonal`(默认)/ `full` | **返回示例**: ```json { "count": 3, "cases": [ { "module": "核心转换", "case_name": "「未登录」--登录成功-->「已登录」", "priority": "P1", "steps": [ {"action": "预置条件:系统处于「未登录」状态", "expected": "当前状态为 未登录"}, {"action": "触发事件「登录成功」", "expected": "事件 登录成功 被正确接收"}, {"action": "执行动作「写入session」", "expected": "动作 写入session 正常执行"}, {"action": "检查当前状态", "expected": "系统进入「已登录」状态"} ] } ] } ``` ### POST /api/export 将前端回传的用例列表导出为文件。 | 参数 | 类型 | 必填 | 说明 | |-----|------|-----|-----| | `format` | string | ✅ | `json` / `md` / `excel` | | `cases` | array | ✅ | 用例数组(结构同 generate 返回) | ### GET /api/template/{tpl_type} 动态生成并下载示例模板:`xmind` · `graphml_scene` · `graphml_state` · `graphml_cause` · `decision_table` · `orthogonal` · `orthogonal_txt` ## 各技术输入约定 ### XMind - 根节点末尾字符可指定层级分隔符,如 `登录测试 &` → 用例名中用 ` & ` 拼接 - `#` / `!` / `!` 开头的节点会被忽略 - `priority-1/2/3` 标记 → `P1/P2/P3` 优先级 - 叶子节点或带优先级标记的节点 = 测试用例 - 步骤节点的第一个子节点 = 预期结果 - 节点 Note = 前置条件(沿路径继承到子节点) ### GraphML - 可使用 yED 等工具编辑后导出 - **状态机**:边标签支持 `事件 / 动作` 或 `事件:动作` 格式;双向边标签用 SandwichEdgeLabelModel + top/bottom 物理分离 - **因果图**:节点标签使用 `C:` / `原因-` 前缀标记原因,`E:` / `结果-` 前缀标记结果;AND/OR/NOT 节点按入边标签推断 ### 决策表 - 支持 `.xlsx` / `.csv` - 表头以 `条件-` / `condition` / `c` 开头 = 条件列,以 `动作-` / `action` / `预期` / `expected` 开头 = 动作列 - 无前缀时自动对半分 - `Y/N/-` 等缩写自动翻译为「满足/不满足/任意」 ### 正交表 - 支持 `.xlsx` / `.csv` / `.txt` 三种格式 - TXT 格式:`参数名: 值1, 值2, 值3`,`#` 开头为注释 - 正交模式下随机采样尝试构造 L(k²) 规模子集,失败时退化为半量随机采样 ## 日志 应用启动时通过 `logging.basicConfig` 统一配置日志格式: ``` 2026-09-20 11:37:14 [INFO] app: Flask app created (MAX_CONTENT_LENGTH=32MB) 2026-09-20 11:37:14 [INFO] app: Swagger UI registered at /apidocs 2026-09-20 11:37:14 [INFO] services.graphml: graphml[state_machine]: 4 nodes, 5 edges -> 5 cases ``` | 级别 | 使用场景 | |-----|---------| | INFO | 业务入口的关键结果(模式、输入规模、输出用例数) | | WARNING | 非预期但可恢复的情况(未知 mode、不支持文件格式、正交采样退化) | | EXCEPTION | 未捕获异常时的堆栈(仅在 500 分支) | | DEBUG | 解析细节、兜底分支,默认不输出 | ## 配置 配置通过**环境变量**注入,按以下优先级生效(高 → 低): 1. 进程环境变量(shell `export` / Gunicorn `-e` / Docker `-e`) 2. 项目根目录 `.env` 文件(通过 python-dotenv 自动加载) 3. `app/config.py` 中的默认值 所有可配置项都在 `.env.example` 中列出,实际使用时: ```bash cp .env.example .env # 编辑 .env,生产环境务必替换 SECRET_KEY ``` | 变量 | 默认值 | 说明 | |-----|-------|-----| | `SECRET_KEY` | `testcase-generator-secret` | Flask session 签名密钥(生产用 `openssl rand -hex 32` 生成) | | `MAX_CONTENT_LENGTH` | `33554432` (32MB) | 单个请求最大体积,单位 bytes | | `GUNICORN_BIND` | `0.0.0.0:8080` | Gunicorn 监听地址 | | `GUNICORN_WORKERS` | CPU×2+1 | Gunicorn worker 数 | | `GUNICORN_THREADS` | `4` | 每个 worker 的线程数 | | `GUNICORN_TIMEOUT` | `120` | Gunicorn 请求超时(秒) | | `GUNICORN_LOGLEVEL` | `info` | Gunicorn 日志级别 | > `.env` 已加入 `.gitignore`,不会被提交。`.env.example` 是模板,提交到仓库供部署参考。 ## 技术栈 - **后端**:Flask 3 · lxml · openpyxl · xmindparser · flask-swagger-ui - **前端**:原生 HTML / CSS / JS(SPA,位于 `app/templates/index.html`) - **Swagger**:OpenAPI 3.0 + flask-swagger-ui,规范内联于 `app/__init__.py` ## License MIT