236 lines
5.4 KiB
Markdown
236 lines
5.4 KiB
Markdown
# 多主键删除功能增强总结
|
||
|
||
## 🎯 问题背景
|
||
|
||
原有的删除接口只支持单个主键的简单数组格式:
|
||
```json
|
||
{"data": ["siteId1", "siteId2"]}
|
||
```
|
||
|
||
但实际的DMS业务场景中,很多删除操作需要支持多主键组合的对象列表格式:
|
||
```json
|
||
{
|
||
"version": "1.0.0",
|
||
"data": [
|
||
{"projectId": "项目1 ID", "surveyId": "工区1 ID"},
|
||
{"projectId": "项目2 ID", "surveyId": "工区2 ID"}
|
||
]
|
||
}
|
||
```
|
||
|
||
## 🔧 解决方案
|
||
|
||
### 核心改进
|
||
|
||
1. **智能Schema检测**:自动分析删除操作的请求体schema
|
||
2. **多格式支持**:根据schema自动选择合适的删除格式
|
||
3. **主键提取**:从创建负载中自动提取相关主键字段
|
||
4. **默认值生成**:为缺失的必需字段生成合理的默认值
|
||
5. **批量删除**:支持生成多个删除对象用于批量操作
|
||
6. **优雅回退**:当无法解析schema时回退到简单格式
|
||
|
||
### 实现逻辑
|
||
|
||
#### 1. 删除请求体构建流程
|
||
```python
|
||
def _build_delete_request_body(self, scenario, pk_name, pk_value, create_payload):
|
||
# 1. 获取删除操作的schema
|
||
# 2. 分析data字段的结构
|
||
# 3. 判断是简单数组还是对象数组
|
||
# 4. 根据类型构建相应的删除请求体
|
||
```
|
||
|
||
#### 2. 多主键对象构建
|
||
```python
|
||
def _build_multi_key_delete_body(self, items_schema, primary_pk_name, primary_pk_value, create_payload):
|
||
# 1. 设置主要主键
|
||
# 2. 从创建负载中提取其他主键
|
||
# 3. 为缺失的必需字段生成默认值
|
||
# 4. 支持批量删除(生成多个对象)
|
||
```
|
||
|
||
#### 3. 默认值生成策略
|
||
```python
|
||
def _generate_default_key_value(self, field_name, field_schema):
|
||
# 根据字段名和类型生成语义化的默认值
|
||
# 例如:projectId -> "项目xxxx"
|
||
# surveyId -> "工区xxxx"
|
||
```
|
||
|
||
## 📊 支持的删除格式
|
||
|
||
### 格式1:简单主键数组
|
||
**适用场景**:单主键删除
|
||
```json
|
||
{
|
||
"data": ["siteId1", "siteId2", "siteId3"]
|
||
}
|
||
```
|
||
|
||
**Schema特征**:
|
||
```json
|
||
{
|
||
"type": "object",
|
||
"properties": {
|
||
"data": {
|
||
"type": "array",
|
||
"items": {"type": "string"}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 格式2:多主键对象数组
|
||
**适用场景**:复合主键删除
|
||
```json
|
||
{
|
||
"version": "1.0.0",
|
||
"data": [
|
||
{
|
||
"projectId": "项目1_ID",
|
||
"surveyId": "工区1_ID"
|
||
},
|
||
{
|
||
"projectId": "项目2_ID",
|
||
"surveyId": "工区2_ID"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
**Schema特征**:
|
||
```json
|
||
{
|
||
"type": "object",
|
||
"properties": {
|
||
"version": {"type": "string"},
|
||
"data": {
|
||
"type": "array",
|
||
"items": {
|
||
"type": "object",
|
||
"properties": {
|
||
"projectId": {"type": "string"},
|
||
"surveyId": {"type": "string"}
|
||
},
|
||
"required": ["projectId", "surveyId"]
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
## 🎯 功能特性
|
||
|
||
### ✅ 自动检测
|
||
- 根据删除操作的schema自动判断使用哪种格式
|
||
- 无需手动配置,完全自动化
|
||
|
||
### ✅ 主键提取
|
||
- 自动从创建负载中提取相关的主键字段
|
||
- 支持复杂的主键组合
|
||
|
||
### ✅ 智能生成
|
||
- 为缺失的必需字段生成语义化的默认值
|
||
- 根据字段名生成合适的值(如projectId -> "项目xxxx")
|
||
|
||
### ✅ 批量支持
|
||
- 自动生成多个删除对象
|
||
- 支持批量删除测试场景
|
||
|
||
### ✅ 优雅回退
|
||
- 当schema解析失败时,自动回退到简单格式
|
||
- 确保删除操作始终可以执行
|
||
|
||
## 🔄 工作流程
|
||
|
||
1. **Schema分析**
|
||
```
|
||
删除操作 → 获取请求体schema → 分析data字段类型
|
||
```
|
||
|
||
2. **格式判断**
|
||
```
|
||
items.type == "string" → 简单数组格式
|
||
items.type == "object" → 对象数组格式
|
||
```
|
||
|
||
3. **数据构建**
|
||
```
|
||
对象格式 → 提取主键 → 生成默认值 → 构建删除对象
|
||
```
|
||
|
||
4. **批量生成**
|
||
```
|
||
单个对象 → 复制并修改 → 生成多个对象 → 支持批量删除
|
||
```
|
||
|
||
## 📝 使用示例
|
||
|
||
### 代码中的使用
|
||
```python
|
||
# 在CRUD Stage的before_stage方法中
|
||
delete_request_body = self._build_delete_request_body(
|
||
current_scenario,
|
||
pk_name,
|
||
pk_value,
|
||
create_payload
|
||
)
|
||
stage_context["delete_request_body"] = delete_request_body
|
||
```
|
||
|
||
### 生成的删除请求体示例
|
||
|
||
**单主键场景**:
|
||
```json
|
||
{"data": ["site_001"]}
|
||
```
|
||
|
||
**多主键场景**:
|
||
```json
|
||
{
|
||
"version": "1.0.0",
|
||
"data": [
|
||
{"projectId": "项目1_ID", "surveyId": "工区1_ID"},
|
||
{"projectId": "项目1_ID", "surveyId": "工区1_ID_2"}
|
||
]
|
||
}
|
||
```
|
||
|
||
## 🎉 测试验证
|
||
|
||
所有测试场景均通过:
|
||
- ✅ 单主键删除格式
|
||
- ✅ 多主键删除格式
|
||
- ✅ 缺失字段的默认值生成
|
||
- ✅ 各种回退场景处理
|
||
|
||
## 💡 扩展性
|
||
|
||
### 添加新的字段类型支持
|
||
```python
|
||
def _generate_default_key_value(self, field_name, field_schema):
|
||
# 可以轻松添加新的字段类型处理逻辑
|
||
if 'well' in field_name.lower():
|
||
return f"井{uuid.uuid4().hex[:4]}"
|
||
# ... 更多字段类型
|
||
```
|
||
|
||
### 自定义删除格式
|
||
```python
|
||
def _build_multi_key_delete_body(self, items_schema, ...):
|
||
# 可以根据具体业务需求调整删除对象的结构
|
||
# 例如添加时间戳、操作人等字段
|
||
```
|
||
|
||
## 🚀 总结
|
||
|
||
通过这次增强,DMS CRUD Stage现在能够:
|
||
|
||
1. **智能适应**不同的删除接口格式
|
||
2. **自动构建**符合业务规则的删除请求体
|
||
3. **支持复杂**的多主键删除场景
|
||
4. **提供批量**删除测试能力
|
||
5. **确保兼容性**,不破坏现有功能
|
||
|
||
这使得DMS合规性测试能够覆盖更多真实的业务场景,提高测试的准确性和有效性!
|