# 1. 数据库测试的分层策略,Schema 验证、数据完整性、查询正确性、性能基准各自如何测试? A 性能测试可在数据量很小的开发库上直接得出可靠结论 B 分层的目的是隔离关注点,便于快速定位缺陷归属并嵌入 CI 早期阶段 ✓ 正确答案 C 查询正确性测试只需验证主表数据,无需关心 JOIN 与聚合 D Schema 验证只需关注业务表,忽略索引和约束
# 2. 数据库迁移(Migration)测试,如何验证 Flyway/Liquibase 迁移脚本的正确性、可回滚性和幂等性? A 迁移脚本只需在生产环境验证一次即可保证可靠 B checksum 校验失败不影响迁移测试 C 验证可回滚性需先 apply 再 rollback,并断言结构数据恢复到迁移前状态 ✓ 正确答案 D 幂等性指同一个迁移脚本可被任意多次执行并每次都产生新效果
# 3. Testcontainers 在数据库集成测试中的应用,如何为每个测试用例启动隔离的数据库实例? A 类级共享容器配合事务回滚可在隔离与性能间取得平衡 ✓ 正确答案 B 每个用例启动独立容器是唯一可接受的隔离方式 C Testcontainers 只能用于测试内存数据库 D H2 嵌入式数据库与真实数据库行为完全一致,可直接替代
# 4. 数据库事务测试,如何验证 ACID 属性在并发场景下的正确性?如何测试死锁检测和回滚行为? A 原子性测试只需验证正常提交成功即可 B 隔离级别改变不会影响并发读的行为 C 持久性测试无需重启数据库即可验证 D 死锁可通过两个事务按相反顺序锁同一批资源稳定重现 ✓ 正确答案
# 5. 数据一致性测试,跨表外键约束、触发器、存储过程在边界条件下的行为验证? A 外键约束测试只需验证正常插入成功 B 触发器测试应验证其副作用并确认异常时主操作是否回滚 ✓ 正确答案 C 存储过程只需测试正常输入路径 D 自引用外键与触发器递归无需特殊关注
# 6. 如何对慢 SQL 优化做回归测试,用 EXPLAIN 计划快照对比还是耗时基线对比? A EXPLAIN 计划快照对数据量变化不敏感,适合做快速回归门禁 ✓ 正确答案 B 耗时基线比 EXPLAIN 计划更稳定,应单独使用 C 变量(数据量、硬件)稳定后耗时基线必然可靠 D 性能测试无需控制数据量规模
# 7. 数据库性能测试,如何设计覆盖索引命中、全表扫描、锁竞争的 SQL 基准测试? A 锁竞争基准与并发数无关,单线程即可模拟 B 全表扫描只需在数据量恒定时测试一次即可 C 覆盖索引命中应断言 EXPLAIN 中出现 Using index 且无回表 ✓ 正确答案 D 基准测试结果无需多次运行取中位数
# 8. 数据库测试数据管理,如何生成符合业务约束的合成数据(如外键关系、唯一约束、CHECK 约束)? A 应先按依赖顺序生成父表再生成子表,并保证外键与唯一、CHECK 约束成立 ✓ 正确答案 B 只需生成子表数据,外键由数据库自动补齐 C 测试数据无需可复现,随机即可 D 生成数据无需考虑 NULL 与默认值约束
# 9. 分库分表场景的测试,如何验证路由规则、跨分片查询和数据迁移的正确性? A 只需验证分片键的常规取值,边界值无需关注 B 跨分片查询可用不分片时的参照实现比对结果来验证正确性 ✓ 正确答案 C 数据迁移后无需全量对账 D 分片键缺失不影响路由正确性
# 10. ORM 与原生 SQL 的测试差异,如何验证 ORM 生成的 SQL 符合预期(如 N+1 查询检测)? A 一级缓存与脏检查属于原生 SQL 的测试范畴 B ORM 测试只需验证最终结果,无需关注生成的 SQL C 原生 SQL 测试需覆盖懒加载与对象级联行为 D N+1 问题可通过捕获执行 SQL 并断言语句数量来检测 ✓ 正确答案
# 11. 数据库备份恢复测试,如何定期验证备份的完整性和恢复流程的可靠性? A 只要备份文件存在且大小合理就说明备份可用 B 定期恢复演练(恢复到隔离环境并校验)比只验证备份文件更可靠 ✓ 正确答案 C 恢复演练只需做一次即可保证长期可靠 D RTO 指标与备份恢复无关
# 12. 数据库事务的并发测试(脏读/幻读/死锁)如何在测试环境稳定复现? A 用同步屏障(如 CountDownLatch)固定时序可使复现变得确定性 ✓ 正确答案 B 随机并发多线程即可稳定复现死锁 C 隔离级别对并发复现没有任何影响 D H2 与真实数据库的锁行为完全一致
# 13. 测试数据中的时间敏感数据(如 "now"、时区)如何做确定性处理? A 直接调用 LocalDateTime.now() 即可保证测试确定性 B 边界时间(闰年、夏令时)无需专门测试 C 时区差异不影响时间断言 D 注入可固定的时钟(Clock)可让 "now" 返回确定值 ✓ 正确答案
# 14. 数据库连接池的可靠性测试,连接数上限、获取超时、连接泄漏与回收机制如何验证,池参数对并发的影响? A 连接数上限无需验证,数据库会自动扩容 B 获取超时异常无需测试,正常等待即可 C maximumPoolSize 越大并发性能一定越好 D 设置 leakDetectionThreshold 可检测连接未归还的泄漏 ✓ 正确答案
# 15. 字符集与排序规则测试,四字节字符、大小写与重音排序、不同 collation 下的查询与唯一约束行为如何覆盖? A MySQL 的 utf8 即可存储任意四字节字符 B VARCHAR 长度恒按字符计算,与字符集无关 C 大小写与重音排序与 collation 无关 D 在 _ci(忽略大小写)collation 下 a 与 A 被视为重复,唯一约束会冲突 ✓ 正确答案
# 16. 时序数据库(InfluxDB/TimescaleDB)的测试特殊性,时间窗口聚合、降采样和数据保留策略如何验证? A 降采样需验证聚合值按窗口重算一致且刷新滞后下行为正确 ✓ 正确答案 B 时间窗口聚合只需验证无空桶的情况 C 数据保留策略无需验证,过期数据自动清理即可 D 时区与乱序写入不影响时序测试
# 17. 图数据库(Neo4j)的测试,图遍历查询的正确性和性能如何验证? A 图遍历测试只需验证 1 跳深度的路径 B 图数据库无需索引即可高效查询 C 图查询性能与路径深度无关 D 用已知图结构手工推导结果可锚定遍历查询的正确性 ✓ 正确答案
# 18. 递归查询与窗口函数测试,CTE 递归深度限制、窗口函数分区排序的正确性与性能边界如何验证? A 递归 CTE 无需考虑成环与深度限制 B RANK 与 DENSE_RANK 在并列值下结果完全相同 C 窗口函数在大量数据下性能恒定,无需优化 D 窗口函数测试需验证并列值、NULL 排序与分区边界 ✓ 正确答案