4.9 KiB
4.9 KiB
业务规则数据生成修复总结
🎯 问题背景
在DMS合规性测试中发现了两个关键问题:
- 业务规则违反:
bsflag字段应该只能是1(正常数据)或-5(废弃数据),但测试生成的是0.0 - 代码错误:CRUD Stage中出现
NameError: name 'create_endpoint' is not defined
🔧 解决方案
方案1:业务规则感知数据生成器
创建了专门的BusinessRulesDataGenerator类,扩展原有的数据生成器:
核心特性
- 业务规则映射:为DMS系统中的关键字段定义业务规则
- 智能字段生成:根据字段名称和类型生成语义化的测试数据
- 约束验证:确保生成的数据符合业务规则
支持的业务规则
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智能数据生成功能:
工作流程
- 优先使用LLM:如果LLM服务可用,构建包含业务规则的提示
- 回退机制:LLM不可用时,使用业务规则数据生成器
- 最终保障:确保关键字段(如主键)正确设置
业务规则提示构建
def _build_business_rules_prompt(self, schema, pk_name, pk_value):
"""构建包含业务规则的LLM提示"""
# 分析schema中的业务规则
# 生成详细的约束说明
# 返回结构化的提示文本
🛠️ 代码修复
修复NameError
# 修复前(错误)
self.logger.info(f"使用LLM为CRUD Stage生成智能测试数据,端点: {create_endpoint.path}")
# 修复后(正确)
self.logger.info(f"使用LLM为CRUD Stage生成智能测试数据,端点: {create_op.path}")
集成业务规则生成器
# 在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
🎯 实现效果
修复前
{
"bsflag": 0.0, // ❌ 不符合业务规则
"siteId": "random_id",
"siteName": "random_string"
}
修复后
{
"bsflag": 1, // ✅ 符合业务规则(1或-5)
"siteId": "site_d34730c3", // ✅ 语义化ID
"siteName": "测试物探工区", // ✅ 有意义的中文名称
"dataRegion": "华北" // ✅ 真实的油田标识
}
📁 新增文件
-
ddms_compliance_suite/utils/business_rules_generator.py- 业务规则感知的数据生成器
- 支持DMS系统特定的业务约束
-
test_business_rules_generator.py- 业务规则生成器的单元测试
- 验证各种场景下的数据生成
-
test_simple_fix.py- 修复验证测试
- 确保代码语法正确和功能正常
🚀 使用方法
自动使用(推荐)
Stage测试会自动使用新的数据生成逻辑:
python run_api_tests.py --dms ./assets/doc/dms/domain.json --ignore-ssl
手动使用
from ddms_compliance_suite.utils.business_rules_generator import BusinessRulesDataGenerator
generator = BusinessRulesDataGenerator()
data = generator.generate_data_from_schema(schema)
💡 扩展建议
添加新的业务规则
# 在BusinessRulesDataGenerator中添加
self.business_rules['new_field'] = {
'type': 'enum',
'values': ['value1', 'value2'],
'description': '字段说明'
}
自定义字段生成逻辑
def _generate_semantic_string(self, field_name, field_schema):
# 根据字段名称生成合适的值
if 'custom_field' in field_name.lower():
return 'custom_value'
# ... 其他逻辑
🎉 总结
通过这次修复,我们实现了:
- 业务规则合规:生成的测试数据现在符合DMS系统的业务规则
- 代码稳定性:修复了NameError,Stage测试可以正常运行
- 智能数据生成:支持LLM和业务规则两种数据生成方式
- 可扩展性:易于添加新的业务规则和字段类型
现在DMS合规性测试工具可以生成更真实、更符合业务规则的测试数据,提高测试的有效性和准确性!