# UPDATE 和 DELETE 操作的基于属性测试
## 概述
本文档记录了为 MySQL 查询构建器的 UPDATE 和 DELETE 操作实现的基于属性测试。这些测试验证了 SQL 语句生成的正确性以及安全性保护机制。
## 实现的测试
### 1. 属性 16:UPDATE 语句生成
**测试函数**: `prop_update_statement_generation`
**验证需求**: 6.1
**测试目标**: 对于任意有效的数据对象和 WHERE 条件,调用 update() 方法时,生成的 SQL 应该是正确的 UPDATE table SET ... WHERE ... 语句
**验证内容**:
- SQL 以 UPDATE 开头
- 包含正确的表名
- 包含 SET 关键字
- 包含 WHERE 关键字
- 包含所有更新字段名
- 包含条件字段名
- 使用参数化查询(占位符数量正确)
- SQL 结构符合标准格式
**测试配置**: 100 次迭代
### 2. 属性 17:UPDATE 需要 WHERE 条件
**测试函数**: `prop_update_requires_where_clause`
**验证需求**: 6.3
**测试目标**: 对于任意没有 WHERE 条件的查询构建器,调用 update() 方法应该返回 MissingWhereClause 错误
**验证内容**:
- update() 操作返回错误
- 错误类型为 `DbError::MissingWhereClause`
- 防止意外的全表更新操作
**测试配置**: 100 次迭代
### 3. 属性 18:DELETE 语句生成
**测试函数**: `prop_delete_statement_generation`
**验证需求**: 7.1
**测试目标**: 对于任意有 WHERE 条件的查询构建器,调用 delete() 方法时,生成的 SQL 应该是正确的 DELETE FROM table WHERE ... 语句
**验证内容**:
- SQL 以 DELETE FROM 开头
- 包含正确的表名
- 包含 WHERE 关键字
- 包含条件字段名
- 使用参数化查询(占位符数量正确)
- SQL 结构符合标准格式
- WHERE 子句格式正确
**测试配置**: 100 次迭代
### 4. 属性 19:DELETE 需要 WHERE 条件
**测试函数**: `prop_delete_requires_where_clause`
**验证需求**: 7.3
**测试目标**: 对于任意没有 WHERE 条件的查询构建器,调用 delete() 方法应该返回 MissingWhereClause 错误
**验证内容**:
- delete() 操作返回错误
- 错误类型为 `DbError::MissingWhereClause`
- 防止意外的全表删除操作
**测试配置**: 100 次迭代
## 测试结果
所有 4 个新测试均已通过:
```
test property_tests::tests::prop_delete_statement_generation ... ok
test property_tests::tests::prop_delete_requires_where_clause ... ok
test property_tests::tests::prop_update_requires_where_clause ... ok
test property_tests::tests::prop_update_statement_generation ... ok
```
完整测试套件结果:**208 个测试全部通过**
## 代码质量检查
- ✅ `cargo test --lib`: 208 个测试通过
- ✅ `cargo clippy --lib -- -D warnings`: 无警告
- ✅ `cargo fmt --check`: 格式正确
## 安全性保护
这些测试验证了两个关键的安全性保护机制:
1. **防止全表更新**: UPDATE 操作必须包含 WHERE 条件,否则返回 `MissingWhereClause` 错误
2. **防止全表删除**: DELETE 操作必须包含 WHERE 条件,否则返回 `MissingWhereClause` 错误
这些保护机制确保开发者不会意外地修改或删除整个表的数据,提高了数据库操作的安全性。
## 测试覆盖范围
### UPDATE 测试覆盖
- 不同数量的更新字段(1-5 个)
- 不同数据类型(整数、字符串)
- 带 WHERE 条件的正常更新
- 无 WHERE 条件的错误处理
### DELETE 测试覆盖
- 不同的 WHERE 条件
- 不同的条件值范围
- 带 WHERE 条件的正常删除
- 无 WHERE 条件的错误处理
## 文件位置
测试代码位于:`lib_yang/crates/yang-db/src/property_tests.rs`
测试函数位于文件末尾,从第 2070 行开始。
## 相关任务
- ✅ 任务 14.3:UPDATE 语句生成测试
- ✅ 任务 14.4:UPDATE 需要 WHERE 条件测试
- ✅ 任务 15.3:DELETE 语句生成测试
- ✅ 任务 15.4:DELETE 需要 WHERE 条件测试
## 总结
本次实现成功为 UPDATE 和 DELETE 操作添加了全面的基于属性测试,验证了:
1. SQL 语句生成的正确性
2. 参数化查询的使用
3. 安全性保护机制的有效性
4. 错误处理的正确性
所有测试均通过 100 次迭代验证,确保在各种输入情况下的正确性。