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