testcase-generator-mcp 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- testcase_generator_mcp-0.1.0/.gitignore +10 -0
- testcase_generator_mcp-0.1.0/LICENSE +21 -0
- testcase_generator_mcp-0.1.0/PKG-INFO +59 -0
- testcase_generator_mcp-0.1.0/README.md +46 -0
- testcase_generator_mcp-0.1.0/pyproject.toml +28 -0
- testcase_generator_mcp-0.1.0/testcase_generator_mcp/__init__.py +1 -0
- testcase_generator_mcp-0.1.0/testcase_generator_mcp/__main__.py +54 -0
- testcase_generator_mcp-0.1.0/testcase_generator_mcp/prompt/generate_test_case.md +208 -0
- testcase_generator_mcp-0.1.0/testcase_generator_mcp/server.py +93 -0
- testcase_generator_mcp-0.1.0/testcase_generator_mcp/tool.py +22 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 EmptyRabbit
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: testcase-generator-mcp
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Testcase Generator MCP Server for generating and managing test cases
|
|
5
|
+
Author-email: EmptyRabbit <qiuzhouxin@163.com>
|
|
6
|
+
License-File: LICENSE
|
|
7
|
+
Requires-Python: >=3.13
|
|
8
|
+
Requires-Dist: build>=1.4.0
|
|
9
|
+
Requires-Dist: mcp[cli]>=1.10.1
|
|
10
|
+
Requires-Dist: pydantic>=2.12.5
|
|
11
|
+
Requires-Dist: typer>=0.16.0
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
|
|
14
|
+
# testcase-generator-mcp
|
|
15
|
+
|
|
16
|
+
Testcase Generator MCP Server,用于生成与管理测试用例。
|
|
17
|
+
|
|
18
|
+
## 目录结构(参考 excel-mcp-server)
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
testcase-generator-mcp/
|
|
22
|
+
├── pyproject.toml
|
|
23
|
+
├── README.md
|
|
24
|
+
└── src/
|
|
25
|
+
└── testcase_generator_mcp/
|
|
26
|
+
├── __init__.py
|
|
27
|
+
├── __main__.py # CLI 入口:sse / stdio / streamable_http
|
|
28
|
+
├── exceptions.py # 异常类型
|
|
29
|
+
└── server.py # FastMCP 服务与工具定义
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## 安装与运行
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# 安装依赖(含 mcp、fastmcp、typer)
|
|
36
|
+
pip install -e .
|
|
37
|
+
|
|
38
|
+
# 以 stdio 方式启动(常用于 Cursor/IDE MCP 配置)
|
|
39
|
+
testcase-generator-mcp stdio
|
|
40
|
+
|
|
41
|
+
# 以 SSE 方式启动
|
|
42
|
+
testcase-generator-mcp sse
|
|
43
|
+
|
|
44
|
+
# 以 streamable HTTP 方式启动
|
|
45
|
+
testcase-generator-mcp streamable_http
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
或使用模块方式:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
python -m testcase_generator_mcp stdio
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 工具
|
|
55
|
+
|
|
56
|
+
- **generate_test_cases**:根据需求描述生成测试用例(当前为占位实现)。
|
|
57
|
+
- **get_server_info**:返回服务名称与版本。
|
|
58
|
+
|
|
59
|
+
日志文件默认写在项目根目录:`testcase-generator-mcp.log`。
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# testcase-generator-mcp
|
|
2
|
+
|
|
3
|
+
Testcase Generator MCP Server,用于生成与管理测试用例。
|
|
4
|
+
|
|
5
|
+
## 目录结构(参考 excel-mcp-server)
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
testcase-generator-mcp/
|
|
9
|
+
├── pyproject.toml
|
|
10
|
+
├── README.md
|
|
11
|
+
└── src/
|
|
12
|
+
└── testcase_generator_mcp/
|
|
13
|
+
├── __init__.py
|
|
14
|
+
├── __main__.py # CLI 入口:sse / stdio / streamable_http
|
|
15
|
+
├── exceptions.py # 异常类型
|
|
16
|
+
└── server.py # FastMCP 服务与工具定义
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## 安装与运行
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# 安装依赖(含 mcp、fastmcp、typer)
|
|
23
|
+
pip install -e .
|
|
24
|
+
|
|
25
|
+
# 以 stdio 方式启动(常用于 Cursor/IDE MCP 配置)
|
|
26
|
+
testcase-generator-mcp stdio
|
|
27
|
+
|
|
28
|
+
# 以 SSE 方式启动
|
|
29
|
+
testcase-generator-mcp sse
|
|
30
|
+
|
|
31
|
+
# 以 streamable HTTP 方式启动
|
|
32
|
+
testcase-generator-mcp streamable_http
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
或使用模块方式:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
python -m testcase_generator_mcp stdio
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## 工具
|
|
42
|
+
|
|
43
|
+
- **generate_test_cases**:根据需求描述生成测试用例(当前为占位实现)。
|
|
44
|
+
- **get_server_info**:返回服务名称与版本。
|
|
45
|
+
|
|
46
|
+
日志文件默认写在项目根目录:`testcase-generator-mcp.log`。
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "testcase-generator-mcp"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "Testcase Generator MCP Server for generating and managing test cases"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.13"
|
|
7
|
+
dependencies = [
|
|
8
|
+
"mcp[cli]>=1.10.1",
|
|
9
|
+
"typer>=0.16.0",
|
|
10
|
+
"pydantic>=2.12.5",
|
|
11
|
+
"build>=1.4.0",
|
|
12
|
+
]
|
|
13
|
+
[[project.authors]]
|
|
14
|
+
name = "EmptyRabbit"
|
|
15
|
+
email = "qiuzhouxin@163.com"
|
|
16
|
+
|
|
17
|
+
[project.scripts]
|
|
18
|
+
testcase-generator-mcp = "testcase_generator_mcp.__main__:app"
|
|
19
|
+
|
|
20
|
+
[build-system]
|
|
21
|
+
requires = ["hatchling"]
|
|
22
|
+
build-backend = "hatchling.build"
|
|
23
|
+
|
|
24
|
+
[tool.hatch.build.targets.wheel]
|
|
25
|
+
packages = ["src/testcase_generator_mcp"]
|
|
26
|
+
|
|
27
|
+
[tool.hatch.build]
|
|
28
|
+
packages = ["src/testcase_generator_mcp"]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.1.0"
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import typer
|
|
2
|
+
|
|
3
|
+
from .server import run_sse, run_stdio, run_streamable_http
|
|
4
|
+
|
|
5
|
+
app = typer.Typer(help="Testcase Generator MCP Server")
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@app.command()
|
|
9
|
+
def sse():
|
|
10
|
+
"""Start Testcase Generator MCP Server with SSE."""
|
|
11
|
+
try:
|
|
12
|
+
run_sse()
|
|
13
|
+
except KeyboardInterrupt:
|
|
14
|
+
print("\nShutting down server...")
|
|
15
|
+
except Exception as e:
|
|
16
|
+
print(f"\nError: {e}")
|
|
17
|
+
import traceback
|
|
18
|
+
traceback.print_exc()
|
|
19
|
+
finally:
|
|
20
|
+
print("Service stopped.")
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@app.command()
|
|
24
|
+
def streamable_http():
|
|
25
|
+
"""Start Testcase Generator MCP Server with streamable HTTP."""
|
|
26
|
+
try:
|
|
27
|
+
run_streamable_http()
|
|
28
|
+
except KeyboardInterrupt:
|
|
29
|
+
print("\nShutting down server...")
|
|
30
|
+
except Exception as e:
|
|
31
|
+
print(f"\nError: {e}")
|
|
32
|
+
import traceback
|
|
33
|
+
traceback.print_exc()
|
|
34
|
+
finally:
|
|
35
|
+
print("Service stopped.")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@app.command()
|
|
39
|
+
def stdio():
|
|
40
|
+
"""Start Testcase Generator MCP Server with stdio."""
|
|
41
|
+
try:
|
|
42
|
+
run_stdio()
|
|
43
|
+
except KeyboardInterrupt:
|
|
44
|
+
print("\nShutting down server...")
|
|
45
|
+
except Exception as e:
|
|
46
|
+
print(f"\nError: {e}")
|
|
47
|
+
import traceback
|
|
48
|
+
traceback.print_exc()
|
|
49
|
+
finally:
|
|
50
|
+
print("Service stopped.")
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
if __name__ == "__main__":
|
|
54
|
+
app()
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
## 目标
|
|
2
|
+
|
|
3
|
+
你是一个经验丰富的测试人员,现在需要根据提供的上下文信息,理解需求的逻辑,并根据要求完成核心任务
|
|
4
|
+
|
|
5
|
+
## 上下文信息
|
|
6
|
+
|
|
7
|
+
用户在对话中提供以下信息:
|
|
8
|
+
|
|
9
|
+
- 需求文档:业务需求和功能说明
|
|
10
|
+
- 技术文档:技术实现方案和接口文档
|
|
11
|
+
- 设计稿:UI设计和交互流程
|
|
12
|
+
- 历史文档:相关的历史需求和测试用例
|
|
13
|
+
- 其他资料:补充说明和参考资料
|
|
14
|
+
|
|
15
|
+
## 核心任务
|
|
16
|
+
|
|
17
|
+
所有子任务:环境检查,规划需求模块,规划需求追溯矩阵,生成 .md 测试用例文件,生成 .xmind 测试用例文件,创建TestHub测试计划
|
|
18
|
+
|
|
19
|
+
**重要:你的任务是必须严格按照以下步骤顺序执行子任务,不得跳过任何步骤。若需要用户回复,严禁在用户回复前执行任何后续步骤。**
|
|
20
|
+
|
|
21
|
+
**注意:执行过程中若没有明确指定写入文件,请不要直接写入文件。**
|
|
22
|
+
|
|
23
|
+
1. 第一步(必须执行):开始阶段 - 环境检查
|
|
24
|
+
2. 第二步(必须执行):规划阶段 - 规划需求模块
|
|
25
|
+
3. 第三步(必须执行):规划阶段 - 规划需求追溯矩阵
|
|
26
|
+
4. 第四步(必须执行):生成用例阶段 - 生成 .md 测试用例文件
|
|
27
|
+
5. 第五步(条件执行):生成用例阶段 - 生成 .xmind 测试用例文件
|
|
28
|
+
6. 第六步(条件执行):生成用例阶段 - 创建TestHub测试计划
|
|
29
|
+
|
|
30
|
+
## 子任务内容
|
|
31
|
+
|
|
32
|
+
### 1. 开始阶段 - 环境检查
|
|
33
|
+
|
|
34
|
+
- 步骤1:检查当前环境是否配置了 MCP: `feishu2md`
|
|
35
|
+
- 步骤2:当需要生成 .xmind 文件时(见第五步条件),检查当前环境是否配置了 MCP: `xmind-generator-mcp`
|
|
36
|
+
- 步骤3:如果存在未配置的 MCP,请提示用户以下内容,并**等待用户回复后,再继续后续步骤**。输出内容:
|
|
37
|
+
|
|
38
|
+
```markdown
|
|
39
|
+
**检测到环境中未配置MCP:<缺失的具体 MCP 名称>,请确认后,回复:**
|
|
40
|
+
|
|
41
|
+
1. **继续**
|
|
42
|
+
2. **终止**
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
- 步骤4:无任何 MCP 缺失,请输出内容:**环境检查通过**
|
|
46
|
+
|
|
47
|
+
### 2. 规划阶段 - 规划需求模块
|
|
48
|
+
|
|
49
|
+
- 步骤1:如果用户提供了链接,优先调用工具读取内容,分析上下文,拆解功能架构,规划需要测试的模块。
|
|
50
|
+
- **仅规划模块名称**,不要包含具体的测试点或步骤
|
|
51
|
+
- 所有模块的划分必须遵循 MECE 原则,相互独立,完全穷尽
|
|
52
|
+
- 结构支持 2-4 个层级,根据需求复杂度**自主决定层级深度**
|
|
53
|
+
- **必须体现层级归属关系**:一个父模块应包含其下所有的子模块(一对多),在表格中通过多行展示
|
|
54
|
+
- 步骤2:严格按以下格式输出步骤1的结果。**输出后立即停止,不得继续执行任何后续步骤,必须等待用户明确回复"继续"后,才能进入后续步骤
|
|
55
|
+
**。请输出内容:
|
|
56
|
+
|
|
57
|
+
```markdown
|
|
58
|
+
**模块规划结果:**
|
|
59
|
+
| 模块ID | 一级模块 | 二级模块 | 三级模块(可选)) | 四级模块(可选) |
|
|
60
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
61
|
+
| 1 | `订单管理` | `列表页` | `筛选功能` | `状态筛选` |
|
|
62
|
+
| 2 | `订单管理` | `列表页` | `筛选功能` | `时间筛选` |
|
|
63
|
+
| 3 | `订单管理` | `列表页` | `列表操作` | / |
|
|
64
|
+
| 4 | `订单管理` | `详情页` | / | / |
|
|
65
|
+
| 5 | `支付模块` | `支付流程` | `微信支付` | / |
|
|
66
|
+
|
|
67
|
+
**请对以上结果进行确认,回复:**
|
|
68
|
+
|
|
69
|
+
1. **继续**
|
|
70
|
+
2. **具体的修改建议**:例如"去除三级模块A,四级模块B名称变更为XX,新增一级模块A-二级模块B"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 3. 规划阶段 - 规划需求追溯矩阵
|
|
74
|
+
|
|
75
|
+
- 步骤1:根据模块规划结果,梳理所有模块的需求描述,在模块规划结果中补充该模块相关的需求描述,需求ID,并提炼测试点
|
|
76
|
+
- 需求ID必须是唯一的,由R+4位数字组成
|
|
77
|
+
- 需求描述必须引用上下文中的**原始内容**
|
|
78
|
+
- 需求描述若超过15字(英文字母计算为0.5个字),请将多余的文字处理成`...`(`...`必须在中间),例如:`原始内容前半段...原始内容后半段`
|
|
79
|
+
- 测试点:基于需求描述提炼的核心测试逻辑,简练概括需要验证的功能点
|
|
80
|
+
- 模块、需求描述和测试点的内容,需要用反引号``包裹
|
|
81
|
+
- 步骤2:检查是否有遗漏的需求内容,确保需求内容已被完整覆盖
|
|
82
|
+
- 步骤3:严格按以下格式,按各个一级模块,输出步骤1、步骤2的结果。*
|
|
83
|
+
*输出后立即停止,不得继续执行任何后续步骤,必须等待用户明确回复"继续"后,才能进入后续步骤**。请输出内容:
|
|
84
|
+
|
|
85
|
+
```markdown
|
|
86
|
+
**需求追溯矩阵规划结果**
|
|
87
|
+
|
|
88
|
+
**【一级模块】`订单管理`**
|
|
89
|
+
| 需求ID | 需求描述 | 测试点 | 二级模块 | 三级模块(可选) | 四级模块(可选) |
|
|
90
|
+
| :--- | :--- | :--- | :--- | :--- | :--- |
|
|
91
|
+
| R0001 | `支持按订单状态筛选` | `验证订单列表支持按状态进行筛选` | `列表页` | `筛选功能` | `状态筛选` |
|
|
92
|
+
| R0002 | `状态筛选枚举值展示A,B,C` | `验证状态筛选下拉框包含A,B,C三个选项` | `列表页` | `筛选功能` | `状态筛选` |
|
|
93
|
+
| R0003 | `支持按时间范围筛选...筛选出结果` | `验证支持按时间范围筛选订单,且结果准确` | `列表页` | `筛选功能` |
|
|
94
|
+
`时间筛选` |
|
|
95
|
+
| R0004 | `支持查看详情、取消` | `验证列表项支持查看详情及取消订单操作` | `列表页` | `列表操作` | / |
|
|
96
|
+
| R0005 | `展示订单详细信息` | `验证订单详情页信息展示完整且准确` | `详情页` | / | / |
|
|
97
|
+
|
|
98
|
+
**【一级模块】:`支付模块`**
|
|
99
|
+
| 需求ID | 需求描述 | 测试点 | 二级模块 | 三级模块(可选) | 四级模块(可选) |
|
|
100
|
+
| :--- | :--- | :--- | :--- | :--- | :--- |
|
|
101
|
+
| R0006 | `支持微信支付` | `验证支持微信支付方式且流程通畅` | `支付流程` | `微信支付` | / |
|
|
102
|
+
|
|
103
|
+
**请对以上结果进行确认,回复:**
|
|
104
|
+
|
|
105
|
+
1. **继续**
|
|
106
|
+
2. **具体的修改建议**:例如"R0002测试点理解错误,应该为XXX"
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 4. 生成用例阶段 - 生成 .md 测试用例文件
|
|
110
|
+
|
|
111
|
+
- 步骤1:了解下方附录中的 `用例设计原则` 和 `用例优先级定义` 的内容。
|
|
112
|
+
- 步骤2:根据 `用例设计原则` 和 `用例优先级定义` 的内容,结合上下文信息和需求追溯矩阵,设计和生成测试用例,并按照以下格式,写入.md文件
|
|
113
|
+
- Markdown 格式
|
|
114
|
+
```markdown
|
|
115
|
+
# 需求名
|
|
116
|
+
|
|
117
|
+
## 一级模块名
|
|
118
|
+
|
|
119
|
+
### 二级模块名
|
|
120
|
+
|
|
121
|
+
#### 三级模块名(可选)
|
|
122
|
+
|
|
123
|
+
##### 四级模块名(可选)
|
|
124
|
+
- 【P0】【用例ID】测试用例描述 # 无序列表,标明优先级
|
|
125
|
+
- 步骤1:操作步骤描述 # 子项,缩进4空格
|
|
126
|
+
- 步骤2:操作步骤描述
|
|
127
|
+
- 预期结果1:验证内容的描述
|
|
128
|
+
- 预期结果2:验证内容的描述
|
|
129
|
+
- 步骤3:操作步骤描述
|
|
130
|
+
- 预期结果3:验证内容描述 # 只有1个预期结果,也需要有编号
|
|
131
|
+
```
|
|
132
|
+
- Markdown 格式说明
|
|
133
|
+
```markdown
|
|
134
|
+
- 使用多个 `#` 表示模块层级,最多5层,即最多为 `#####`,其中第 1 层为需求名,第 2–5 层对应一级到四级模块
|
|
135
|
+
- 用例描述前标注优先级:`【P0】`、`【P1】`、`【P2】`、`【P3】`
|
|
136
|
+
- 用例ID为 TC+4位数字,例如:TC0001
|
|
137
|
+
- 步骤和结果交替排列,逻辑清晰
|
|
138
|
+
- 子项使用4个空格缩进
|
|
139
|
+
```
|
|
140
|
+
- 步骤3:检查生成的用例中是否存在重复或可合并的步骤、用例,若有则进行去重或合并
|
|
141
|
+
- 步骤4:在生成的需求追溯矩阵中新插入第一列:用例ID,将生成的用例ID,找到关联的需求后,回填到上述已输出的需求追溯矩阵中,然后重新输出需求追溯矩阵
|
|
142
|
+
- 注意:需求追溯矩阵不要写入.md文件中
|
|
143
|
+
|
|
144
|
+
### 5. 生成用例阶段 - 生成 .xmind 测试用例文件
|
|
145
|
+
|
|
146
|
+
- 步骤1:`is_need_xmind: {is_need_xmind}`当`is_need_xmind`为True时,调用`markdown_to_xmind`工具生成.xmind文件
|
|
147
|
+
|
|
148
|
+
### 6. 生成用例阶段 - 创建TestHub测试计划
|
|
149
|
+
|
|
150
|
+
- 步骤1: `idev_card_id: {idev_card_id}`当`idev_card_id`有值时,需要创建TestHub测试计划,具体步骤为:
|
|
151
|
+
- 子步骤1:根据需求上下文信息和测试用例场景,判断最有可能归属的模块:({all_module_names}),输出判断结果:"
|
|
152
|
+
判断所属模块为:[模块名]"
|
|
153
|
+
- 子步骤2:调用`markdown_to_testhub_plan`工具,创建TestHub测试计划
|
|
154
|
+
|
|
155
|
+
## 附录
|
|
156
|
+
|
|
157
|
+
### 用例设计原则
|
|
158
|
+
|
|
159
|
+
单一性
|
|
160
|
+
|
|
161
|
+
- 一个用例验证一种场景,避免一个用例验证多个功能点
|
|
162
|
+
- 每个测试用例应聚焦于特定的功能或业务规则
|
|
163
|
+
- 确保测试结果的唯一性和可追溯性
|
|
164
|
+
|
|
165
|
+
独立性
|
|
166
|
+
|
|
167
|
+
- 尽可能减少用例之间的依赖,每个用例可以独立执行
|
|
168
|
+
- 避免用例间的数据依赖和状态依赖
|
|
169
|
+
- 每个用例应具备完整的预置条件和清理机制
|
|
170
|
+
|
|
171
|
+
可重复性
|
|
172
|
+
|
|
173
|
+
- 相同的步骤和操作应该有相同的预期结果
|
|
174
|
+
- 测试用例应具备稳定的执行环境要求
|
|
175
|
+
- 确保测试结果的一致性和可重现性
|
|
176
|
+
|
|
177
|
+
正向 & 逆向验证
|
|
178
|
+
|
|
179
|
+
- 包含正常流程和异常流程的完整验证
|
|
180
|
+
- 覆盖成功场景和失败场景
|
|
181
|
+
- 验证系统的容错能力和错误处理机制
|
|
182
|
+
|
|
183
|
+
边界值验证
|
|
184
|
+
|
|
185
|
+
- 对关键参数进行边界值测试
|
|
186
|
+
- 包含最小值、最大值、临界值测试
|
|
187
|
+
- 验证系统在边界条件下的行为
|
|
188
|
+
|
|
189
|
+
多场景覆盖
|
|
190
|
+
|
|
191
|
+
- 覆盖不同用户角色、不同数据状态、不同业务场景
|
|
192
|
+
- 包含各种可能的用户操作路径
|
|
193
|
+
- 验证系统在不同环境下的表现
|
|
194
|
+
|
|
195
|
+
模块化设计
|
|
196
|
+
|
|
197
|
+
- 按功能模块组织测试用例,提高可维护性
|
|
198
|
+
- 保持用例结构的清晰性和一致性
|
|
199
|
+
- 便于用例的复用和扩展
|
|
200
|
+
|
|
201
|
+
### 用例优先级定义
|
|
202
|
+
|
|
203
|
+
| 优先级 | 名称 | 描述 | 典型场景 |
|
|
204
|
+
|:----|:---------------------------|:------------------------------------------|:-----------------------------------------|
|
|
205
|
+
| P0 | 最高 (**Blocker/Immediate**) | **必须执行,阻塞流程** | **阻塞性缺陷或核心主干场景**,必须立即执行,否则测试无法进行或产品无法发布。 |
|
|
206
|
+
| P1 | 高 (**High**) | **必须优先执行**。覆盖核心功能、高频使用路径、严重故障点、安全隐患、主干流程。 | **核心业务逻辑**,eg:用户登录、支付流程等可导致系统崩溃的用例。 |
|
|
207
|
+
| P2 | 中 (**Medium**) | **重要,但次于P1**。覆盖主要功能、常用场景、重要业务规则、主要错误处理。 | **主要功能模块的非核心路径,重要的非主干流程**,eg:部分查询功能。 |
|
|
208
|
+
| P3 | 低 (**Low**) | **可以延后执行**。覆盖次要功能、边缘场景、用户体验优化点、低频使用路径。 | **界面文案显示、非关键的错误提示、辅助性功能、极端边界值、兼容性测试等等** |
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
from typing import Annotated
|
|
4
|
+
|
|
5
|
+
from mcp.server.fastmcp import FastMCP
|
|
6
|
+
from mcp.types import ToolAnnotations
|
|
7
|
+
from pydantic import Field
|
|
8
|
+
|
|
9
|
+
from testcase_generator_mcp.tool import generate_test_case_tool
|
|
10
|
+
|
|
11
|
+
ROOT_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
12
|
+
LOG_FILE = os.path.join(ROOT_DIR, "testcase-generator-mcp.log")
|
|
13
|
+
|
|
14
|
+
logging.basicConfig(
|
|
15
|
+
level=logging.INFO,
|
|
16
|
+
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
|
17
|
+
handlers=[logging.FileHandler(LOG_FILE)],
|
|
18
|
+
)
|
|
19
|
+
logger = logging.getLogger("testcase-generator-mcp")
|
|
20
|
+
|
|
21
|
+
mcp = FastMCP(
|
|
22
|
+
"testcase-generator-mcp",
|
|
23
|
+
host=os.environ.get("FASTMCP_HOST", "0.0.0.0"),
|
|
24
|
+
port=int(os.environ.get("FASTMCP_PORT", "8018")),
|
|
25
|
+
instructions="Testcase Generator MCP Server for generating and managing test cases",
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@mcp.tool(
|
|
30
|
+
annotations=ToolAnnotations(
|
|
31
|
+
title="生成测试用例",
|
|
32
|
+
readOnlyHint=False,
|
|
33
|
+
),
|
|
34
|
+
)
|
|
35
|
+
def generate_test_case(
|
|
36
|
+
is_need_xmind: Annotated[bool, Field(description="是否需要生成Xmind思维导图文件,默认为False")] = False,
|
|
37
|
+
) -> str:
|
|
38
|
+
"""
|
|
39
|
+
根据用户提供的需求文档、技术文档、设计稿等上下文信息,生成Markdown格式的测试用例
|
|
40
|
+
|
|
41
|
+
必须优先调用的场景(按优先级排序):
|
|
42
|
+
1. 用户说"生成测试用例"、"设计测试用例"、"创建测试用例"
|
|
43
|
+
2. 用户说"保存为xmind测试用例"、"生成思维导图测试用例"、"生成xmind测试用例"
|
|
44
|
+
3. 任何涉及测试用例生成的请求
|
|
45
|
+
|
|
46
|
+
参数说明:
|
|
47
|
+
- is_need_xmind: 仅在用户明确提及"xmind"、"思维导图"等关键词时设置为True,否则必须保持默认值False
|
|
48
|
+
|
|
49
|
+
关键提醒:
|
|
50
|
+
- 当用户明确要求生成测试用例时,必须调用此工具
|
|
51
|
+
- is_need_xmind参数必须严格按照用户明确要求思维导图来决定,不能随意设置为True
|
|
52
|
+
"""
|
|
53
|
+
prompt_content = generate_test_case_tool(is_need_xmind)
|
|
54
|
+
return prompt_content
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def run_sse():
|
|
58
|
+
try:
|
|
59
|
+
logger.info("Starting Testcase Generator MCP server (SSE)")
|
|
60
|
+
mcp.run(transport="sse")
|
|
61
|
+
except KeyboardInterrupt:
|
|
62
|
+
logger.info("Server stopped by user")
|
|
63
|
+
except Exception as e:
|
|
64
|
+
logger.error(f"Server failed: {e}")
|
|
65
|
+
raise
|
|
66
|
+
finally:
|
|
67
|
+
logger.info("Server shutdown complete")
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def run_streamable_http():
|
|
71
|
+
try:
|
|
72
|
+
logger.info("Starting Testcase Generator MCP server (streamable HTTP)")
|
|
73
|
+
mcp.run(transport="streamable-http")
|
|
74
|
+
except KeyboardInterrupt:
|
|
75
|
+
logger.info("Server stopped by user")
|
|
76
|
+
except Exception as e:
|
|
77
|
+
logger.error(f"Server failed: {e}")
|
|
78
|
+
raise
|
|
79
|
+
finally:
|
|
80
|
+
logger.info("Server shutdown complete")
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def run_stdio():
|
|
84
|
+
try:
|
|
85
|
+
logger.info("Starting Testcase Generator MCP server (stdio)")
|
|
86
|
+
mcp.run(transport="stdio")
|
|
87
|
+
except KeyboardInterrupt:
|
|
88
|
+
logger.info("Server stopped by user")
|
|
89
|
+
except Exception as e:
|
|
90
|
+
logger.error(f"Server failed: {e}")
|
|
91
|
+
raise
|
|
92
|
+
finally:
|
|
93
|
+
logger.info("Server shutdown complete")
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def generate_test_case_tool(is_need_xmind: bool = False) -> str:
|
|
5
|
+
"""Load and return the prompt template for generating test cases.
|
|
6
|
+
|
|
7
|
+
Reads the template from prompt/generate_test_case.md under the same package
|
|
8
|
+
directory and replaces the placeholder {is_need_xmind} with the given value.
|
|
9
|
+
|
|
10
|
+
Args:
|
|
11
|
+
is_need_xmind: Whether to generate XMind mind map format. Defaults to False.
|
|
12
|
+
|
|
13
|
+
Returns:
|
|
14
|
+
The prompt template string with placeholders substituted.
|
|
15
|
+
"""
|
|
16
|
+
# Resolve path to prompt template file relative to this module
|
|
17
|
+
base_dir = os.path.dirname(os.path.abspath(__file__))
|
|
18
|
+
file_path = os.path.join(base_dir, "prompt", "generate_test_case.md")
|
|
19
|
+
with open(file_path, 'r', encoding='utf-8') as file:
|
|
20
|
+
content = file.read()
|
|
21
|
+
content = content.replace("{is_need_xmind}", str(is_need_xmind))
|
|
22
|
+
return content
|