1. 数据库测试的分层策略,Schema 验证、数据完整性、查询正确性、性能基准各自如何测试?
数据库测试如何进行分层设计?Schema 验证、数据完整性、查询正确性、性能基准这四个层次分别该用什么方法测试?
- 是否理解数据库测试的多层次模型(Schema / 数据 / 查询 / 性能)
- 各层次测试工具与验证手段的选型
- 分层与业务集成测试的关系
数据库测试应自下而上分层推进。第一层 Schema 验证:用数据库迁移工具(Flyway/Liquibase)的校验命令或 information_schema 查询,断言表、字段类型、约束、索引、默认值存在且符合预期,可用 maven-sql-plugin 或断言库验证 DDL。第二层数据完整性:用主键、唯一、外键、CHECK、NOT NULL 约束以及触发器的行为验证,插入非法数据断言被拒绝,插入合法数据断言通过。第三层查询正确性:用真实数据或受控测试数据比对查询结果,涉及 JOIN、聚合、分组、子查询、窗口函数等,可结合快照测试或结果集断言。第四层性能基准:用固定数据量、相同硬件环境下的 EXPLAIN 计划、执行耗时、内存与锁等待指标做基准,趋势对比而非单次绝对数值。各层关注点不同,应分别建立测试集,避免混为一谈。
分层的目的在于隔离关注点:Schema 错误是"建表就错了",数据问题是"数据本身不合法",查询问题是"SQL 写错",性能问题是"数据量上来后变慢"。只有分层才能快速定位缺陷归属,也便于把测试嵌入 CI 的早期阶段。
@Test
void schemaTest() {
// 验证表存在且字段类型正确
assertThat(selectOne("SELECT data_type FROM information_schema.columns " +
"WHERE table_name='orders' AND column_name='amount'"))
.isEqualTo("DECIMAL");
}
@Test
void integrityTest() {
// 违反外键约束应被拒绝
assertThatThrownBy(() -> insert("INSERT INTO orders(customer_id) VALUES (999999)"))
.isInstanceOf(SQLIntegrityConstraintViolationException.class);
}