This commit is contained in:
gongwenxin
2025-06-16 14:49:49 +08:00
parent adc1a0053f
commit df90a5377f
210 changed files with 323584 additions and 12804 deletions
+63
View File
@@ -0,0 +1,63 @@
# 活动上下文
## 当前工作焦点
我们正在维护和改进DDMS合规性测试工具,该工具用于自动化API合规性测试。目前系统已经具备基本功能,支持通过Web界面和命令行方式使用。用户可以提供API规范文件(YAPI或Swagger格式),指定目标服务的Base URL,并配置自定义测试用例目录和报告输出位置等参数。
### 优先任务
1. **功能完善**:确保所有核心功能正常工作,包括API规范解析、测试用例执行和报告生成。
2. **Bug修复**:解决测试过程中可能出现的错误和异常情况。
3. **性能优化**:提高测试执行效率,特别是对于大型API规范文件和复杂测试场景。
4. **用户体验改进**:优化Web界面,提供更友好的操作流程和反馈。
5. **文档更新**:确保用户手册和开发文档与最新代码保持同步。
## 最近变更
### 代码变更
- 实现了用户认证系统,使用SQLite存储用户信息
- 添加了LLM集成功能,支持使用大模型生成测试数据
- 改进了测试报告格式,提供更详细的API调用信息
- 优化了错误处理逻辑,提高了系统稳定性
- 增强了Web界面的响应性和用户体验
- 新增了数值越界错误处理测试用例 (TC-ERROR-4002),用于验证API在接收到超出范围的数值参数时是否按预期返回特定业务错误码。
### 架构调整
- 重构了测试编排器(APITestOrchestrator),提高了代码可维护性
- 引入了更灵活的插件机制,便于扩展测试用例和测试阶段
- 改进了API规范解析器,增强了对不同格式的兼容性
- 优化了测试用例注册表的设计,支持更精确的用例筛选
-`schema_utils.py` 中添加了可复用的辅助函数,用于从描述中解析数值范围,以简化相关测试用例的编写。
## 活动决策和考虑
### 当前决策
1. **LLM集成策略**:决定使用兼容OpenAI API的通义千问大模型作为测试数据生成的后端,同时保留传统的基于Schema的数据生成方法作为备选。
2. **测试报告格式**:采用JSON格式作为摘要报告,Markdown格式作为详细报告,平衡了机器可读性和人类可读性。
3. **用户认证方案**:使用基于Flask session的简单认证系统,结合SQLite数据库存储用户信息,避免过度复杂化。
4. **部署模式**:支持本地部署,使用简单的Python命令启动,不依赖复杂的容器或云服务。
### 开放问题
1. **多线程执行**:是否应该支持并行执行测试用例以提高性能?需要权衡速度提升与稳定性风险。
2. **测试用例覆盖度**:如何确保测试用例能全面覆盖各种API合规性要求?考虑引入测试覆盖率分析。
3. **LLM依赖性**:如何处理LLM服务不可用或响应缓慢的情况?需要实现更强大的回退机制。
4. **安全性增强**:当前的认证机制是否足够安全?考虑加入更多安全措施如CSRF保护和API密钥轮换。
## 下一步计划
### 短期目标 (1-2周)
- 修复已知的bug和稳定性问题
- 完善用户文档和开发指南
- 优化Web界面的响应速度和用户体验
- 增加更多预定义的测试用例
### 中期目标 (1-2个月)
- 实现测试结果的历史记录和比较功能
- 添加API端点的搜索和过滤功能
- 改进LLM参数生成的质量和效率
- 支持更复杂的测试场景和数据依赖
### 长期目标 (3+个月)
- 开发更强大的测试报告分析工具
- 支持团队协作和测试结果共享
- 集成CI/CD流程,实现自动化测试
- 开发更高级的测试用例编辑器,降低编写自定义测试用例的门槛
+420
View File
@@ -0,0 +1,420 @@
# API规范解析框架设计
## 背景与需求
当前系统需要处理多种API规范格式,包括YAPI、Swagger/OpenAPI 2.0和OpenAPI 3.0等。目前的实现在`BaseAPITestCase`类中包含了针对不同格式的特定处理逻辑,这导致:
1. 代码重复和维护困难
2. 处理逻辑分散在多个地方
3. 添加新格式支持需要修改多处代码
4. 测试用例需要了解底层规范格式的细节
我们需要一个统一的解析框架,将不同格式的API规范转换为一致的内部表示,使测试用例能够以统一的方式访问API规范信息,而不必关心原始格式的差异。
## 设计目标
1. **统一接口**:提供一套统一的接口来访问API规范信息,无论原始格式如何
2. **可扩展性**:易于添加新的API规范格式支持
3. **完全解析**:在解析阶段处理所有的引用和格式特定的细节
4. **一致性**:确保不同格式的规范被转换为相同的内部表示
5. **性能优化**:减少重复解析和处理
## 架构设计
### 1. 核心组件
#### 1.1 统一解析器接口 (`APISpecParser`)
```python
from abc import ABC, abstractmethod
from typing import Dict, Any, Optional
class APISpecParser(ABC):
"""API规范解析器的抽象基类"""
@abstractmethod
def parse(self, spec_content: Dict[str, Any]) -> Dict[str, Any]:
"""
解析API规范内容,返回统一格式的内部表示
Args:
spec_content: 原始API规范内容
Returns:
统一格式的API规范内部表示
"""
pass
@abstractmethod
def detect_format(self, spec_content: Dict[str, Any]) -> str:
"""
检测API规范的格式
Args:
spec_content: 原始API规范内容
Returns:
规范格式的标识符,如 'yapi', 'openapi2', 'openapi3'
"""
pass
```
#### 1.2 格式特定的解析器实现
```python
class YAPIParser(APISpecParser):
"""YAPI格式解析器"""
def parse(self, spec_content: Dict[str, Any]) -> Dict[str, Any]:
# YAPI特定的解析逻辑
# 转换为统一的内部表示
pass
def detect_format(self, spec_content: Dict[str, Any]) -> str:
# 检测是否为YAPI格式
if self._is_yapi_format(spec_content):
return 'yapi'
return ''
def _is_yapi_format(self, spec_content: Dict[str, Any]) -> bool:
# 判断是否为YAPI格式的逻辑
pass
class OpenAPI2Parser(APISpecParser):
"""OpenAPI 2.0 (Swagger)格式解析器"""
def parse(self, spec_content: Dict[str, Any]) -> Dict[str, Any]:
# OpenAPI 2.0特定的解析逻辑
pass
def detect_format(self, spec_content: Dict[str, Any]) -> str:
# 检测是否为OpenAPI 2.0格式
if self._is_openapi2_format(spec_content):
return 'openapi2'
return ''
def _is_openapi2_format(self, spec_content: Dict[str, Any]) -> bool:
# 判断是否为OpenAPI 2.0格式的逻辑
pass
class OpenAPI3Parser(APISpecParser):
"""OpenAPI 3.0格式解析器"""
def parse(self, spec_content: Dict[str, Any]) -> Dict[str, Any]:
# OpenAPI 3.0特定的解析逻辑
pass
def detect_format(self, spec_content: Dict[str, Any]) -> str:
# 检测是否为OpenAPI 3.0格式
if self._is_openapi3_format(spec_content):
return 'openapi3'
return ''
def _is_openapi3_format(self, spec_content: Dict[str, Any]) -> bool:
# 判断是否为OpenAPI 3.0格式的逻辑
pass
```
#### 1.3 解析器工厂 (`APISpecParserFactory`)
```python
class APISpecParserFactory:
"""API规范解析器工厂,用于创建适合特定规范格式的解析器"""
def __init__(self):
self.parsers = [
YAPIParser(),
OpenAPI2Parser(),
OpenAPI3Parser()
]
def get_parser(self, spec_content: Dict[str, Any]) -> Optional[APISpecParser]:
"""
根据规范内容自动选择合适的解析器
Args:
spec_content: 原始API规范内容
Returns:
适合处理该规范的解析器实例,如果没有找到则返回None
"""
for parser in self.parsers:
format_type = parser.detect_format(spec_content)
if format_type:
return parser
return None
def register_parser(self, parser: APISpecParser):
"""
注册新的解析器
Args:
parser: 解析器实例
"""
self.parsers.append(parser)
```
#### 1.4 统一API规范管理器 (`UnifiedAPISpecManager`)
```python
class UnifiedAPISpecManager:
"""统一API规范管理器,负责解析和提供统一的API规范访问接口"""
def __init__(self):
self.parser_factory = APISpecParserFactory()
self.cached_specs = {} # 缓存已解析的规范
def parse_spec(self, spec_content: Dict[str, Any], spec_id: str = None) -> Dict[str, Any]:
"""
解析API规范,返回统一格式的内部表示
Args:
spec_content: 原始API规范内容
spec_id: 规范的唯一标识符,用于缓存
Returns:
统一格式的API规范内部表示
"""
if spec_id and spec_id in self.cached_specs:
return self.cached_specs[spec_id]
parser = self.parser_factory.get_parser(spec_content)
if not parser:
raise ValueError("无法识别的API规范格式")
parsed_spec = parser.parse(spec_content)
if spec_id:
self.cached_specs[spec_id] = parsed_spec
return parsed_spec
def register_custom_parser(self, parser: APISpecParser):
"""
注册自定义解析器
Args:
parser: 自定义解析器实例
"""
self.parser_factory.register_parser(parser)
```
### 2. 统一内部表示格式
所有解析器都应该将原始规范转换为一个统一的内部表示格式,该格式应该包含以下核心元素:
```python
{
"info": {
"title": "API标题",
"version": "API版本",
"description": "API描述"
},
"paths": {
"/path/to/resource": {
"get": {
"summary": "操作摘要",
"description": "操作描述",
"parameters": [...], # 统一格式的参数列表
"requestBody": {...}, # 统一格式的请求体定义
"responses": {
"200": {
"description": "成功响应",
"content": {
"application/json": {
"schema": {...} # 统一格式的响应schema
}
}
}
}
}
}
},
"components": {
"schemas": {...}, # 统一格式的schema定义
"parameters": {...}, # 统一格式的参数定义
"responses": {...} # 统一格式的响应定义
}
}
```
### 3. 解析过程中的标准化处理
在解析过程中,需要进行以下标准化处理:
1. **路径标准化**:确保所有路径格式一致
2. **参数标准化**:将不同格式的参数定义转换为统一格式
3. **响应标准化**:根据HTTP方法添加适当的默认状态码
4. **Schema标准化**:解析所有的`$ref`引用
5. **数据类型标准化**:确保数据类型表示一致
### 4. 与测试框架的集成
#### 4.1 更新 `BaseAPITestCase` 类
```python
class BaseAPITestCase:
# ... 现有代码 ...
def __init__(self, endpoint_spec: Dict[str, Any], global_api_spec: Dict[str, Any], json_schema_validator: Optional[Any] = None, llm_service: Optional[Any] = None):
"""
初始化测试用例。
Args:
endpoint_spec: 当前被测API端点的详细定义 (已转换为统一格式)。
global_api_spec: 完整的API规范文档 (已转换为统一格式)。
json_schema_validator: APITestOrchestrator 传入的 JSONSchemaValidator 实例 (可选)。
llm_service: APITestOrchestrator 传入的 LLMService 实例 (可选)。
"""
self.endpoint_spec = endpoint_spec
self.global_api_spec = global_api_spec
self.logger = logging.getLogger(f"testcase.{self.id}")
self.json_schema_validator = json_schema_validator
self.llm_service = llm_service
self.logger.debug(f"Test case '{self.id}' initialized for endpoint: {self.endpoint_spec.get('method', '')} {self.endpoint_spec.get('path', '')}")
# 简化的方法,不再需要处理不同格式的差异
def _get_request_body_schema(self) -> Optional[Dict[str, Any]]:
"""获取请求体schema"""
request_body = self.endpoint_spec.get("requestBody", {})
return request_body.get("schema")
def _get_response_schema(self, status_code: str) -> Optional[Dict[str, Any]]:
"""获取指定状态码的响应schema"""
responses = self.endpoint_spec.get("responses", {})
response = responses.get(status_code)
if response:
return response.get("schema")
return None
```
#### 4.2 更新 `APITestOrchestrator` 类
```python
class APITestOrchestrator:
# ... 现有代码 ...
def __init__(self, config: Dict[str, Any]):
# ... 现有代码 ...
self.spec_manager = UnifiedAPISpecManager()
def load_api_spec(self, spec_file_path: str) -> Dict[str, Any]:
"""
加载并解析API规范文件
Args:
spec_file_path: API规范文件路径
Returns:
统一格式的API规范内部表示
"""
with open(spec_file_path, 'r', encoding='utf-8') as f:
spec_content = json.load(f)
return self.spec_manager.parse_spec(spec_content, spec_id=spec_file_path)
def execute_tests(self, api_spec: Dict[str, Any], base_url: str):
"""
执行测试用例
Args:
api_spec: 统一格式的API规范内部表示
base_url: API基础URL
"""
# ... 现有代码 ...
for path, path_item in api_spec["paths"].items():
for method, operation in path_item.items():
# 使用统一格式的operation创建测试用例
self._execute_tests_for_endpoint(operation, path, method, base_url)
```
## 实现计划
### 阶段1:基础框架搭建
1. 创建核心接口和基类
- `APISpecParser` 抽象基类
- `APISpecParserFactory` 工厂类
- `UnifiedAPISpecManager` 管理器类
2. 实现格式检测逻辑
- 为YAPI、OpenAPI 2.0和OpenAPI 3.0实现格式检测方法
### 阶段2:解析器实现
1. 实现YAPI解析器
- 分析YAPI特有的结构
- 实现转换为统一格式的逻辑
2. 实现OpenAPI 2.0解析器
- 分析Swagger特有的结构
- 实现转换为统一格式的逻辑
3. 实现OpenAPI 3.0解析器
- 分析OpenAPI 3.0特有的结构
- 实现转换为统一格式的逻辑
### 阶段3:标准化处理
1. 实现路径标准化
2. 实现参数标准化
3. 实现响应标准化
4. 实现Schema标准化
5. 实现数据类型标准化
### 阶段4:框架集成
1. 更新`BaseAPITestCase`
- 简化API规范访问方法
- 移除格式特定的处理逻辑
2. 更新`APITestOrchestrator`
- 集成`UnifiedAPISpecManager`
- 使用统一格式的API规范
3. 更新测试用例
- 修改现有测试用例以使用新的API
### 阶段5:测试与验证
1. 编写单元测试
- 测试各个解析器
- 测试标准化处理
2. 编写集成测试
- 测试完整的解析流程
- 测试与测试框架的集成
3. 性能测试
- 测试解析大型API规范的性能
- 测试缓存机制的有效性
## 扩展性考虑
### 添加新格式支持
要添加对新的API规范格式的支持,只需:
1. 创建一个新的解析器类,继承自`APISpecParser`
2. 实现`parse``detect_format`方法
3. 通过`UnifiedAPISpecManager.register_custom_parser`注册新的解析器
### 自定义处理逻辑
对于特定的标准化需求,可以:
1. 创建专门的处理器类
2. 在解析过程中调用这些处理器
3. 通过配置控制处理器的行为
## 结论
通过实现这个统一的API规范解析框架,我们可以:
1. 使测试用例代码更加简洁、可维护
2. 轻松支持新的API规范格式
3. 确保所有测试用例使用一致的API规范表示
4. 提高解析性能和可靠性
这个框架将为DDMS合规性测试工具提供一个坚实的基础,使其能够适应各种API规范格式,并且易于扩展和维护。
+54
View File
@@ -0,0 +1,54 @@
# 已实现的测试用例列表
本文档列出了合规性测试工具中当前已实现的所有测试用例,按类别分组。
## 基本检查
| ID | 名称 | 描述 | 严重程度 |
| ------------- | ------------------- | ---------------------------------- | -------- |
| TC-STATUS-001 | 基本状态码 200 检查 | 验证 API 响应状态码是否为 200 OK。 | 严重 |
## 核心功能检查
| ID | 名称 | 描述 | 严重程度 |
| ---------------- | ------------------------------------ | ------------------------------------------------- | -------- |
| TC-CORE-FUNC-001 | Response Body JSON Schema Validation | 验证API响应体是否符合API规范中定义的JSON Schema。 | 严重 |
## 错误处理检查
| ID | 名称 | 描述 | 严重程度 |
| ------------------- | ------------------------ | ----------------------------------------------------------------------------------------- | -------- |
| TC-ERROR-4001-QUERY | 查询参数类型不匹配检查 | 测试当发送的查询参数数据类型与API规范定义不符时,API是否按预期返回code=4001的错误。 | 中 |
| TC-ERROR-4001-BODY | 请求体字段类型不匹配检查 | 测试当发送的请求体中字段的数据类型与API规范定义不符时,API是否按预期返回code=4001的错误。 | 中 |
| TC-ERROR-4002 | 数值参数越界检查 | 测试当发送的数值参数超出范围限制时,API是否按预期返回code=4002的错误。 | 中 |
| TC-ERROR-4003-QUERY | 缺失必填查询参数检查 | 测试当请求中缺少API规范定义的必填查询参数时,API是否按预期返回code=4003的错误。 | 高 |
| TC-ERROR-4003-BODY | 缺失必填请求体字段检查 | 测试当请求体中缺少API规范定义的必填字段时,API是否按预期返回code=4003的错误。 | 高 |
| TC-ERROR-4006 | 非法枚举值检查 | 测试当发送的参数值不在指定的枚举范围内时,API是否按预期返回code=4006的错误。 | 中 |
## 安全检查
| ID | 名称 | 描述 | 严重程度 |
| --------------- | ---------------- | ------------------------------------------------------------------ | -------- |
| TC-SECURITY-001 | HTTPS强制检查 | 验证API端点是否通过HTTPS提供服务,以及HTTP请求是否被拒绝或重定向。 | 严重 |
| TC-SECURITY-002 | 敏感字段加密检查 | 验证API响应中的敏感字段(如坐标、位置)是否已加密,而非明文。 | 高 |
## 规范性检查
| ID | 名称 | 描述 | 严重程度 |
| -------------------------------------- | -------------------------------- | ------------------------------------------------------------------- | -------- |
| TC-NORMATIVE-URL-LLM-COMPREHENSIVE-001 | 合URL规范与RESTful风格检查 (LLM) | 使用LLM统一评估API路径是否符合命名、结构、版本和RESTful风格等规范。 | 中 |
| TC-NORMATIVE-001 | HTTP方法使用规范检查 | 验证API是否恰当使用HTTP方法(例如,GET用于检索,POST用于创建)。 | 中 |
## 设置与环境检查 (Setup Checks)
| ID | 名称 | 描述 | 严重程度 |
| -------------------------------- | -------------------- | ------------------------------------------------------------------------------- | -------- |
| TC-HEADER-001 | 必需请求头Schema验证 | 验证API规范中是否包含必需的请求头 (X-Tenant-ID, X-Data-Domain, Authorization)。 | 严重 |
## 注意事项
1. 测试用例的严重程度级别包括:严重(CRITICAL)、高(HIGH)、中(MEDIUM)、低(LOW)和信息(INFO)。
2. 所有测试用例都继承自 `BaseAPITestCase` 基类,可以通过自定义子类进行扩展。
3. 测试用例通过 `TestCaseRegistry` 进行注册和发现,根据API端点特征自动选择适用的测试用例。
+27
View File
@@ -0,0 +1,27 @@
# 产品上下文
## 产品背景
API合规性验证是确保API实现符合相关规范和标准的关键步骤。在DDMS(数据管理系统)这样的复杂系统中,确保API的一致性和合规性尤为重要。传统的手动测试方法往往耗时且容易出错,难以覆盖所有可能的测试场景。
## 问题陈述
1. **手动测试效率低下**:手动验证API实现是否符合规范需要大量的时间和人力投入。
2. **测试覆盖不全面**:人工测试难以覆盖所有边缘情况和错误处理路径。
3. **测试结果不一致**:不同测试人员可能采用不同的测试方法和标准,导致结果不一致。
4. **难以重复执行**:当API有更新时,需要重复执行所有测试,缺乏自动化机制。
5. **测试数据准备困难**:为不同的API端点和测试场景准备有效的测试数据是一项挑战。
## 解决方案
合规性测试工具通过自动化API测试流程,解决了上述问题:
1. **自动化测试执行**:根据API规范文件自动发现并执行测试用例,大幅提高测试效率。
2. **全面的测试覆盖**:通过预定义和自定义测试用例,覆盖各种正常和异常场景。
3. **标准化测试流程**:所有测试遵循统一的标准和流程,确保结果一致性。
4. **易于重复执行**:API更新后,可以快速重新执行所有测试,确保持续符合规范。
5. **智能测试数据生成**:利用大语言模型自动生成符合API规范的测试数据,减轻数据准备负担。
## 用户体验目标
1. **简单易用**:提供直观的Web界面和命令行接口,降低使用门槛。
2. **清晰的测试报告**:生成详细且易于理解的测试报告,帮助快速定位问题。
3. **灵活可配置**:支持自定义测试用例和测试阶段,适应不同测试需求。
4. **可扩展性**:框架设计支持添加新的测试类型和功能,以满足未来需求。
5. **快速反馈**:测试过程中提供实时日志输出,让用户及时了解测试进展。
+100
View File
@@ -0,0 +1,100 @@
# 项目进度
## 已完成功能
### 核心功能
- ✅ 命令行接口 (run_api_tests.py)
- ✅ Web界面 (flask_app.py)
- ✅ API规范解析器 (支持YAPI和Swagger/OpenAPI)
- ✅ 测试用例注册表和发现机制
- ✅ API调用器和请求/响应处理
- ✅ 测试编排器 (APITestOrchestrator)
- ✅ 基本测试报告生成 (JSON和Markdown格式)
- ✅ 用户认证系统 (基于Flask和SQLite)
### 增强功能
- ✅ LLM集成 (支持通过大模型生成测试数据)
- ✅ 自定义测试用例支持 (基于BaseAPITestCase)
- ✅ 自定义测试阶段支持 (基于BaseAPIStage)
- ✅ 详细的API调用信息记录
- ✅ Web界面的高级配置选项
- ✅ 基于标签/分类的API端点筛选
- ✅ 实现了多种错误处理场景的测试用例(如类型不匹配、缺失必填字段、数值越界等)
### 文档和支持
- ✅ 用户手册 (MANUAL.md)
- ✅ 框架和测试用例编写指南 (Framework_And_TestCase_Guide.md)
- ✅ 命令行帮助文档
- ✅ Web界面内置使用说明
- ✅ 实现了项目中所有测试用例的列表和描述 (implemented_test_cases.md)
## 正在进行的工作
### 核心功能改进
- 🔄 改进错误处理和异常恢复机制
- 🔄 优化大型API规范文件的解析性能
- 🔄 增强测试用例执行的稳定性
- 🔄 改进测试报告的可视化展示
### 新功能开发
- 🔄 测试结果历史记录和比较功能
- 🔄 更多预定义测试用例的开发
- 🔄 支持更复杂的测试场景和数据依赖
- 🔄 API端点搜索和过滤功能
## 待完成工作
### 功能增强
- ⏳ 多线程/并行测试执行支持
- ⏳ 测试覆盖率分析工具
- ⏳ 更强大的LLM回退和缓存机制
- ⏳ 安全性增强 (CSRF保护, 更强的认证)
- ⏳ API密钥管理和轮换机制
### 用户体验改进
- ⏳ 更现代化的Web界面设计
- ⏳ 实时测试进度可视化
- ⏳ 交互式测试报告浏览器
- ⏳ 测试用例编辑器
- ⏳ 自定义仪表板和报告模板
### 集成和部署
- ⏳ CI/CD集成支持
- ⏳ Docker容器化部署
- ⏳ 团队协作和结果共享功能
- ⏳ 与常见API管理平台的集成
## 已知问题
### 严重问题
- 🐛 大型API规范文件解析可能导致内存占用过高
- 🐛 某些复杂的JSON Schema验证可能不准确
### 中等问题
- 🐛 LLM服务不可用时缺乏足够友好的错误提示
- 🐛 Web界面在处理大量并发请求时可能变慢
- 🐛 测试报告可能变得过大,影响加载速度
### 轻微问题
- 🐛 部分UI元素在移动设备上显示不佳
- 🐛 某些错误消息不够明确
- 🐛 文档中的少量拼写和格式问题
## 里程碑计划
### 里程碑1:稳定基础版本 (完成)
- 实现所有核心功能
- 发布基本用户文档
- 完成初步测试和bug修复
### 里程碑2:增强功能版本 (进行中)
- 添加LLM集成
- 改进用户界面和体验
- 增加更多预定义测试用例
- 优化性能和稳定性
### 里程碑3:企业就绪版本 (计划中)
- 实现高级安全特性
- 添加团队协作功能
- 支持CI/CD集成
- 提供全面的部署选项
+24
View File
@@ -0,0 +1,24 @@
# 项目简介:合规性测试工具
## 项目概述
这是一个用于测试API是否符合特定规范(如DDMS规范)的合规性测试工具。该工具能够根据API规范文件(YAPI或Swagger/OpenAPI格式)自动执行一系列测试用例,检查API的实现是否符合预期的标准和规范。
## 核心需求
1. 支持通过YAPI或Swagger/OpenAPI规范文件解析API定义
2. 自动执行预定义和自定义的测试用例
3. 生成详细的测试报告,包括成功/失败统计和详细的API调用信息
4. 提供Web界面和命令行两种使用方式
5. 支持大语言模型(LLM)辅助生成测试参数
## 关键目标
1. 提高API合规性测试的效率和全面性
2. 降低手动测试的工作量和出错率
3. 提供清晰的测试结果和报告,帮助开发团队快速定位问题
4. 支持可扩展的测试用例编写,满足不同合规性测试需求
## 技术栈
- Python Flask (Web界面)
- Python测试框架
- SQLite (用户认证)
- 大语言模型API集成
- Markdown和JSON格式的报告生成
+89
View File
@@ -0,0 +1,89 @@
# 系统架构与设计模式
## 系统架构概览
合规性测试工具采用了模块化的分层架构,主要由以下核心组件构成:
```mermaid
flowchart TD
CLI[命令行接口\nrun_api_tests.py] --> Orch[测试编排器\nAPITestOrchestrator]
Web[Web界面\nflask_app.py] --> Orch
Orch --> Parser[API规范解析器\nInputParser]
Orch --> Registry[测试用例注册表\nTestCaseRegistry]
Orch --> Caller[API调用器\nAPICaller]
Orch --> LLM[LLM服务\nLLMService]
Registry --> TestCases[测试用例\nBaseAPITestCase子类]
Orch --> Reporter[测试报告生成器]
```
## 关键技术决策
1. **模块化设计**:系统被分解为多个独立的模块,每个模块负责特定功能,便于维护和扩展。
2. **插件式架构**:测试用例和测试阶段采用插件式设计,允许用户自定义和扩展。
3. **配置驱动**:系统行为通过配置文件和命令行参数控制,无需修改代码即可调整。
4. **双重接口**:同时提供Web界面和命令行接口,满足不同使用场景的需求。
5. **LLM集成**:集成大语言模型API,实现智能测试数据生成。
## 设计模式应用
### 1. 工厂模式
- **应用**`InputParser`根据输入类型(YAPI/Swagger)创建对应的解析器。
- **好处**:封装创建逻辑,客户端代码无需关心具体实现细节。
### 2. 策略模式
- **应用**:不同的测试用例实现相同的接口(`BaseAPITestCase`),但有不同的验证逻辑。
- **好处**:允许在运行时选择不同的算法,增强系统灵活性。
### 3. 观察者模式
- **应用**:测试执行过程中的日志和进度更新通过事件通知机制传递给界面。
- **好处**:解耦核心测试逻辑和界面展示,提高代码可维护性。
### 4. 模板方法模式
- **应用**`BaseAPITestCase`定义测试用例的基本流程和钩子方法,子类只需实现特定步骤。
- **好处**:重用代码,确保所有测试用例遵循统一的执行流程。
### 5. 装饰器模式
- **应用**Web应用中的`@login_required`装饰器用于保护需要认证的路由。
- **好处**:以非侵入方式为函数添加额外功能,如安全检查。
## 组件关系
### 测试编排器 (APITestOrchestrator)
- **角色**:系统的核心控制器,协调各组件工作。
- **职责**:初始化组件、解析API规范、筛选端点、执行测试用例、汇总结果。
- **依赖**:依赖于`InputParser``TestCaseRegistry``APICaller`和可选的`LLMService`
### 测试用例注册表 (TestCaseRegistry)
- **角色**:发现和管理测试用例类。
- **职责**:扫描指定目录、加载测试用例类、根据端点特征筛选适用的测试用例。
- **依赖**:依赖于`BaseAPITestCase`的子类实现。
### API规范解析器 (InputParser)
- **角色**:解析API定义文件。
- **职责**:读取并解析YAPI或Swagger/OpenAPI格式的API规范文件,转换为内部数据结构。
- **依赖**:无外部依赖。
### API调用器 (APICaller)
- **角色**:执行HTTP请求。
- **职责**:根据测试用例生成的请求数据发送HTTP请求,收集响应信息。
- **依赖**:依赖于HTTP客户端库(如`requests`)。
### LLM服务 (LLMService)
- **角色**:智能生成测试数据。
- **职责**:根据API规范生成符合要求的请求参数和请求体。
- **依赖**:依赖于外部LLM API服务。
## 数据流
1. 用户通过Web界面或命令行提供API规范文件和配置。
2. 测试编排器使用InputParser解析API规范文件,获取API端点信息。
3. 测试编排器根据配置筛选需要测试的端点。
4. 对每个端点,测试编排器从TestCaseRegistry获取适用的测试用例。
5. 测试用例生成请求数据(可能使用LLMService)。
6. 测试编排器使用APICaller发送请求并收集响应。
7. 测试用例验证响应是否符合预期。
8. 测试编排器汇总所有测试结果,生成报告。
9. 用户通过Web界面或输出文件查看测试结果。
+88
View File
@@ -0,0 +1,88 @@
# 技术上下文
## 技术栈概览
合规性测试工具基于以下技术栈构建:
| 类别 | 技术 | 版本 | 用途 |
|------|------|------|------|
| 核心语言 | Python | 3.8+ | 主要开发语言 |
| Web框架 | Flask | 2.0+ | Web界面实现 |
| 数据库 | SQLite | 3.0+ | 用户认证和会话管理 |
| HTTP客户端 | Requests | 2.0+ | 发送API请求 |
| AI集成 | LLM API (兼容OpenAI) | - | 智能测试数据生成 |
| 前端 | HTML/CSS/JavaScript | - | Web界面展示 |
| 报告格式 | JSON, Markdown | - | 测试报告生成 |
## 开发环境设置
### 必要组件
- Python 3.8+
- pip (Python包管理器)
- 支持Python的IDE (如PyCharm, VS Code)
- Git (版本控制)
### 项目安装步骤
1. 克隆代码仓库:`git clone <仓库URL>`
2. 安装依赖:`pip install -r requirements.txt`
3. 初始化数据库:`flask --app flask_app init-db`
4. 运行Web服务:`python flask_app.py`
5. 运行命令行测试:`python run_api_tests.py [参数]`
### 关键依赖项
项目的`requirements.txt`文件包含以下主要依赖:
- FlaskWeb框架
- WerkzeugWSGI实用工具库
- requestsHTTP客户端
- PyYAMLYAML解析
- jsonschemaJSON Schema验证
- pydantic:数据验证和设置管理
- openaiOpenAI API客户端
- Flask-Cors:处理跨域请求
## 技术约束
### 1. 性能考量
- 测试执行过程可能涉及大量HTTP请求,需要考虑超时处理和重试机制
- LLM API调用可能较慢,需要实现缓存机制避免重复生成
- 测试报告可能很大,需要优化生成和展示方式
### 2. 安全考虑
- 用户认证使用密码哈希存储,避免明文密码
- API密钥等敏感信息需要安全存储
- 上传的API规范文件需要验证格式和安全性
### 3. 兼容性要求
- 支持解析YAPI和Swagger/OpenAPI规范(JSON/YAML格式)
- 支持不同版本的OpenAPI规范(2.0/3.0
- 支持不同API认证方式(Basic, Bearer Token, API Key等)
### 4. 扩展性设计
- 测试用例通过类继承机制支持自定义扩展
- 测试阶段支持插件式扩展
- LLM提供商可配置,支持不同模型
### 5. 网络依赖
- 需要网络连接才能访问目标API服务
- 使用LLM功能需要访问外部AI服务API
## 开发工作流
1. **代码组织**
- `flask_app.py`Web界面入口
- `run_api_tests.py`:命令行入口
- `ddms_compliance_suite/`:核心测试框架
- `custom_testcases/`:自定义测试用例
- `custom_stages/`:自定义测试阶段
- `test_reports/`:测试报告输出
2. **开发流程**
- 使用Git进行版本控制
- 遵循PEP 8 Python编码规范
- 编写单元测试验证核心功能
- 文档驱动开发,保持代码和文档同步
3. **调试技巧**
- 使用日志记录关键信息
- Flask调试模式提供详细错误信息
- 测试用例可以单独运行进行调试