适配业务
This commit is contained in:
@@ -0,0 +1,179 @@
|
||||
# 业务规则数据生成修复总结
|
||||
|
||||
## 🎯 问题背景
|
||||
|
||||
在DMS合规性测试中发现了两个关键问题:
|
||||
|
||||
1. **业务规则违反**:`bsflag`字段应该只能是1(正常数据)或-5(废弃数据),但测试生成的是0.0
|
||||
2. **代码错误**:CRUD Stage中出现`NameError: name 'create_endpoint' is not defined`
|
||||
|
||||
## 🔧 解决方案
|
||||
|
||||
### 方案1:业务规则感知数据生成器
|
||||
|
||||
创建了专门的`BusinessRulesDataGenerator`类,扩展原有的数据生成器:
|
||||
|
||||
#### 核心特性
|
||||
- **业务规则映射**:为DMS系统中的关键字段定义业务规则
|
||||
- **智能字段生成**:根据字段名称和类型生成语义化的测试数据
|
||||
- **约束验证**:确保生成的数据符合业务规则
|
||||
|
||||
#### 支持的业务规则
|
||||
```python
|
||||
business_rules = {
|
||||
'bsflag': {
|
||||
'type': 'enum',
|
||||
'values': [1, -5],
|
||||
'description': '删除标识:1=正常数据,-5=废弃数据'
|
||||
},
|
||||
'dataSource': {
|
||||
'type': 'enum',
|
||||
'values': ['DMS', 'LEGACY_SYSTEM', 'IMPORT', 'MANUAL']
|
||||
},
|
||||
'dataRegion': {
|
||||
'type': 'enum',
|
||||
'values': ['华北', '华东', '华南', '西北', '西南', '东北']
|
||||
}
|
||||
# ... 更多规则
|
||||
}
|
||||
```
|
||||
|
||||
### 方案2:LLM智能数据生成(可选)
|
||||
|
||||
为Stage测试添加了LLM智能数据生成功能:
|
||||
|
||||
#### 工作流程
|
||||
1. **优先使用LLM**:如果LLM服务可用,构建包含业务规则的提示
|
||||
2. **回退机制**:LLM不可用时,使用业务规则数据生成器
|
||||
3. **最终保障**:确保关键字段(如主键)正确设置
|
||||
|
||||
#### 业务规则提示构建
|
||||
```python
|
||||
def _build_business_rules_prompt(self, schema, pk_name, pk_value):
|
||||
"""构建包含业务规则的LLM提示"""
|
||||
# 分析schema中的业务规则
|
||||
# 生成详细的约束说明
|
||||
# 返回结构化的提示文本
|
||||
```
|
||||
|
||||
## 🛠️ 代码修复
|
||||
|
||||
### 修复NameError
|
||||
```python
|
||||
# 修复前(错误)
|
||||
self.logger.info(f"使用LLM为CRUD Stage生成智能测试数据,端点: {create_endpoint.path}")
|
||||
|
||||
# 修复后(正确)
|
||||
self.logger.info(f"使用LLM为CRUD Stage生成智能测试数据,端点: {create_op.path}")
|
||||
```
|
||||
|
||||
### 集成业务规则生成器
|
||||
```python
|
||||
# 在CRUD Stage中集成
|
||||
from ddms_compliance_suite.utils.business_rules_generator import BusinessRulesDataGenerator
|
||||
|
||||
# 使用业务规则生成器
|
||||
business_generator = BusinessRulesDataGenerator(logger_param=self.logger)
|
||||
generated_data = business_generator.generate_data_from_schema(create_schema)
|
||||
```
|
||||
|
||||
## 📊 测试验证
|
||||
|
||||
### 业务规则生成测试
|
||||
```
|
||||
第1次生成: bsflag: -5 (✅)
|
||||
第2次生成: bsflag: -5 (✅)
|
||||
第3次生成: bsflag: 1 (✅)
|
||||
第4次生成: bsflag: 1 (✅)
|
||||
第5次生成: bsflag: 1 (✅)
|
||||
|
||||
成功率: 5/5 (100.0%)
|
||||
```
|
||||
|
||||
### 代码修复验证
|
||||
- ✅ 语法错误已修复
|
||||
- ✅ 移除所有`create_endpoint`引用
|
||||
- ✅ 正确使用`create_op.path`
|
||||
|
||||
## 🎯 实现效果
|
||||
|
||||
### 修复前
|
||||
```json
|
||||
{
|
||||
"bsflag": 0.0, // ❌ 不符合业务规则
|
||||
"siteId": "random_id",
|
||||
"siteName": "random_string"
|
||||
}
|
||||
```
|
||||
|
||||
### 修复后
|
||||
```json
|
||||
{
|
||||
"bsflag": 1, // ✅ 符合业务规则(1或-5)
|
||||
"siteId": "site_d34730c3", // ✅ 语义化ID
|
||||
"siteName": "测试物探工区", // ✅ 有意义的中文名称
|
||||
"dataRegion": "华北" // ✅ 真实的油田标识
|
||||
}
|
||||
```
|
||||
|
||||
## 📁 新增文件
|
||||
|
||||
1. **`ddms_compliance_suite/utils/business_rules_generator.py`**
|
||||
- 业务规则感知的数据生成器
|
||||
- 支持DMS系统特定的业务约束
|
||||
|
||||
2. **`test_business_rules_generator.py`**
|
||||
- 业务规则生成器的单元测试
|
||||
- 验证各种场景下的数据生成
|
||||
|
||||
3. **`test_simple_fix.py`**
|
||||
- 修复验证测试
|
||||
- 确保代码语法正确和功能正常
|
||||
|
||||
## 🚀 使用方法
|
||||
|
||||
### 自动使用(推荐)
|
||||
Stage测试会自动使用新的数据生成逻辑:
|
||||
```bash
|
||||
python run_api_tests.py --dms ./assets/doc/dms/domain.json --ignore-ssl
|
||||
```
|
||||
|
||||
### 手动使用
|
||||
```python
|
||||
from ddms_compliance_suite.utils.business_rules_generator import BusinessRulesDataGenerator
|
||||
|
||||
generator = BusinessRulesDataGenerator()
|
||||
data = generator.generate_data_from_schema(schema)
|
||||
```
|
||||
|
||||
## 💡 扩展建议
|
||||
|
||||
### 添加新的业务规则
|
||||
```python
|
||||
# 在BusinessRulesDataGenerator中添加
|
||||
self.business_rules['new_field'] = {
|
||||
'type': 'enum',
|
||||
'values': ['value1', 'value2'],
|
||||
'description': '字段说明'
|
||||
}
|
||||
```
|
||||
|
||||
### 自定义字段生成逻辑
|
||||
```python
|
||||
def _generate_semantic_string(self, field_name, field_schema):
|
||||
# 根据字段名称生成合适的值
|
||||
if 'custom_field' in field_name.lower():
|
||||
return 'custom_value'
|
||||
# ... 其他逻辑
|
||||
```
|
||||
|
||||
## 🎉 总结
|
||||
|
||||
通过这次修复,我们实现了:
|
||||
|
||||
1. **业务规则合规**:生成的测试数据现在符合DMS系统的业务规则
|
||||
2. **代码稳定性**:修复了NameError,Stage测试可以正常运行
|
||||
3. **智能数据生成**:支持LLM和业务规则两种数据生成方式
|
||||
4. **可扩展性**:易于添加新的业务规则和字段类型
|
||||
|
||||
现在DMS合规性测试工具可以生成更真实、更符合业务规则的测试数据,提高测试的有效性和准确性!
|
||||
@@ -0,0 +1,261 @@
|
||||
# 正确的多主键删除逻辑实现
|
||||
|
||||
## 🎯 问题分析
|
||||
|
||||
您指出了一个关键问题:我之前的实现逻辑是错误的。
|
||||
|
||||
### ❌ 错误的逻辑(之前)
|
||||
```
|
||||
基于schema的items.type判断:
|
||||
- items.type == "string" → 单主键(字符串数组)
|
||||
- items.type == "object" → 多主键(对象数组)
|
||||
```
|
||||
|
||||
### ✅ 正确的逻辑(现在)
|
||||
```
|
||||
基于identityId列表长度判断:
|
||||
- len(identityId) == 1 → 单主键(字符串数组)
|
||||
- len(identityId) > 1 → 多主键(对象数组)
|
||||
```
|
||||
|
||||
## 🔧 实现修正
|
||||
|
||||
### 1. DMSEndpoint增强
|
||||
|
||||
添加了`identity_id_list`属性来存储完整的identityId配置:
|
||||
|
||||
```python
|
||||
class DMSEndpoint(BaseEndpoint):
|
||||
def __init__(self, ..., identity_id_list: Optional[List[str]] = None):
|
||||
# ...
|
||||
self.identity_id_list = identity_id_list or []
|
||||
```
|
||||
|
||||
### 2. DMS API解析增强
|
||||
|
||||
在解析DMS API时,根据identityId长度自动生成正确的删除schema:
|
||||
|
||||
```python
|
||||
# 获取identityId列表
|
||||
identity_id_list = model.get("identityId")
|
||||
|
||||
if isinstance(identity_id_list, list) and len(identity_id_list) > 1:
|
||||
# 多主键:生成对象数组schema
|
||||
delete_request_body_schema = {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"version": {"type": "string"},
|
||||
"data": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {pk1: schema1, pk2: schema2, ...},
|
||||
"required": [pk1, pk2, ...]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else:
|
||||
# 单主键:生成字符串数组schema
|
||||
delete_request_body_schema = {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"data": {
|
||||
"type": "array",
|
||||
"items": {"type": "string"}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. CRUD Stage逻辑修正
|
||||
|
||||
删除请求体构建现在直接基于identityId列表:
|
||||
|
||||
```python
|
||||
def _build_delete_request_body(self, scenario, pk_name, pk_value, create_payload):
|
||||
delete_op = scenario.get('delete')
|
||||
identity_id_list = getattr(delete_op, 'identity_id_list', [])
|
||||
|
||||
if len(identity_id_list) > 1:
|
||||
# 多主键:使用对象列表
|
||||
return self._build_multi_key_delete_body(identity_id_list, pk_name, pk_value, create_payload)
|
||||
else:
|
||||
# 单主键:使用字符串列表
|
||||
return {"data": [pk_value]}
|
||||
```
|
||||
|
||||
## 📊 支持的配置和格式
|
||||
|
||||
### 配置示例
|
||||
|
||||
#### 单主键配置
|
||||
```json
|
||||
{
|
||||
"identityId": ["proppantId"]
|
||||
}
|
||||
```
|
||||
|
||||
**生成的删除格式**:
|
||||
```json
|
||||
{
|
||||
"data": ["proppant_001", "proppant_002"]
|
||||
}
|
||||
```
|
||||
|
||||
#### 双主键配置
|
||||
```json
|
||||
{
|
||||
"identityId": ["projectId", "surveyId"]
|
||||
}
|
||||
```
|
||||
|
||||
**生成的删除格式**:
|
||||
```json
|
||||
{
|
||||
"version": "1.0.0",
|
||||
"data": [
|
||||
{"projectId": "项目1_ID", "surveyId": "工区1_ID"},
|
||||
{"projectId": "项目2_ID", "surveyId": "工区2_ID"}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
#### 三主键配置
|
||||
```json
|
||||
{
|
||||
"identityId": ["wellId", "layerId", "sampleId"]
|
||||
}
|
||||
```
|
||||
|
||||
**生成的删除格式**:
|
||||
```json
|
||||
{
|
||||
"version": "1.0.0",
|
||||
"data": [
|
||||
{"wellId": "井001", "layerId": "层001", "sampleId": "样本001"},
|
||||
{"wellId": "井002", "layerId": "层002", "sampleId": "样本002"}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## 🎯 核心改进
|
||||
|
||||
### 1. 准确的业务逻辑
|
||||
- 直接基于DMS的identityId配置
|
||||
- 不再依赖schema结构推测
|
||||
- 准确反映业务意图
|
||||
|
||||
### 2. 自动schema生成
|
||||
- 解析器根据identityId自动生成正确的删除schema
|
||||
- 单主键自动生成字符串数组schema
|
||||
- 多主键自动生成对象数组schema
|
||||
|
||||
### 3. 智能字段处理
|
||||
- 从创建负载中自动提取相关主键
|
||||
- 为缺失的主键字段生成默认值
|
||||
- 支持批量删除(生成多个对象)
|
||||
|
||||
### 4. 优雅回退
|
||||
- 当identityId为空时回退到简单格式
|
||||
- 确保删除操作始终可以执行
|
||||
|
||||
## 🔄 工作流程
|
||||
|
||||
```
|
||||
1. DMS API解析
|
||||
↓
|
||||
2. 读取identityId配置
|
||||
↓
|
||||
3. 判断主键数量
|
||||
├─ len(identityId) == 1 → 生成字符串数组schema
|
||||
└─ len(identityId) > 1 → 生成对象数组schema
|
||||
↓
|
||||
4. 创建DMSEndpoint(包含identity_id_list)
|
||||
↓
|
||||
5. CRUD Stage执行
|
||||
↓
|
||||
6. 根据identity_id_list长度构建删除请求体
|
||||
├─ 单主键 → {"data": ["key1", "key2"]}
|
||||
└─ 多主键 → {"version": "1.0.0", "data": [{"key1": "val1", "key2": "val2"}]}
|
||||
```
|
||||
|
||||
## 📝 测试验证
|
||||
|
||||
所有测试场景均通过:
|
||||
- ✅ 单主键删除(identityId长度=1)
|
||||
- ✅ 多主键删除(identityId长度=2)
|
||||
- ✅ 三主键删除(identityId长度=3)
|
||||
- ✅ 空identityId回退处理
|
||||
- ✅ 缺失字段自动生成
|
||||
|
||||
## 💡 使用示例
|
||||
|
||||
### DMS配置
|
||||
```json
|
||||
{
|
||||
"name": "projectSurvey",
|
||||
"model": {
|
||||
"identityId": ["projectId", "surveyId"],
|
||||
"properties": {
|
||||
"projectId": {"type": "string"},
|
||||
"surveyId": {"type": "string"},
|
||||
"relationName": {"type": "string"}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 自动生成的删除端点
|
||||
```json
|
||||
{
|
||||
"path": "/api/dms/test/v1/projectSurvey",
|
||||
"method": "DELETE",
|
||||
"requestBody": {
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"version": {"type": "string"},
|
||||
"data": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"projectId": {"type": "string"},
|
||||
"surveyId": {"type": "string"}
|
||||
},
|
||||
"required": ["projectId", "surveyId"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 生成的删除请求
|
||||
```json
|
||||
{
|
||||
"version": "1.0.0",
|
||||
"data": [
|
||||
{"projectId": "项目1_ID", "surveyId": "工区1_ID"},
|
||||
{"projectId": "项目1_ID", "surveyId": "工区2_ID"}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## 🎉 总结
|
||||
|
||||
通过这次修正,DMS合规性测试工具现在能够:
|
||||
|
||||
1. **正确理解业务配置**:基于identityId而不是schema推测
|
||||
2. **自动生成正确格式**:单主键用字符串数组,多主键用对象数组
|
||||
3. **支持任意主键组合**:1个、2个、3个或更多主键
|
||||
4. **智能处理缺失字段**:自动生成默认值
|
||||
5. **提供批量删除支持**:生成多个删除对象
|
||||
|
||||
这确保了测试数据完全符合DMS系统的实际业务规则和API设计!
|
||||
@@ -0,0 +1,235 @@
|
||||
# 多主键删除功能增强总结
|
||||
|
||||
## 🎯 问题背景
|
||||
|
||||
原有的删除接口只支持单个主键的简单数组格式:
|
||||
```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合规性测试能够覆盖更多真实的业务场景,提高测试的准确性和有效性!
|
||||
Reference in New Issue
Block a user