6.0 KiB
6.0 KiB
ADR-002-03: 测试执行技术选型
状态
已接受
日期
2026-02-02
背景
测试执行功能需要选择合适的技术方案,包括数据库表设计策略、测试结果存储策略、并发控制策略和 Flow 覆盖率支持策略。这些决策将影响系统的数据一致性、查询性能、存储成本和功能完整性。
需求约束
- 支持多种测试执行方式(全部、按类、按包、按方法)
- 详细记录测试结果(成功、失败、覆盖率)
- 支持代码覆盖率和 Flow 覆盖率分析
- 确保多线程安全和数据一致性
- 与 002-02(Apex 代码编译和执行)功能的数据模型兼容
决策
决策 1:数据库表设计策略
选择方案 1:复用 + 新建混合策略
- 复用 002-02 的 3 张表:ApexTestResult、ApexTestFailure、ApexCodeCoverage
- 新建 2 张表:ApexTestSuccess、ApexFlowCoverage
理由:
- 数据一致性:ApexTestResult、ApexTestFailure、ApexCodeCoverage 在 002-02 中已经定义,复用可避免数据冗余和不一致
- 功能完整性:002-02 的 compileAndTest 功能也会产生测试结果,使用相同的表结构便于统一查询
- 维护成本低:减少数据库表数量,降低维护复杂度
- 扩展性:新建 ApexTestSuccess 和 ApexFlowCoverage 表支持测试执行特有的功能
决策 2:测试结果存储策略
选择方案 1:完整存储策略
- 保存所有测试成功详情(ApexTestSuccess 表)
- 保存所有测试失败详情(ApexTestFailure 表)
- 保存所有代码覆盖率详情(ApexCodeCoverage 表)
- 保存所有 Flow 覆盖率详情(ApexFlowCoverage 表)
理由:
- 审计需求:完整的测试历史记录支持审计和追溯
- 分析需求:详细的测试数据支持后续的分析和报表生成
- 调试需求:测试失败详情和堆栈跟踪有助于问题定位
- 覆盖率趋势:历史覆盖率数据支持趋势分析和质量改进
决策 3:并发控制策略
选择方案 1:ReentrantLock
- 使用 ReentrantLock 保证测试执行的多线程安全
- 与 002-02 的并发控制策略保持一致
理由:
- 一致性:与 002-02 使用相同的并发控制机制,保持代码一致性
- 灵活性:ReentrantLock 比 synchronized 更灵活,支持公平锁、可中断锁等特性
- 性能:ReentrantLock 在高并发场景下性能更好
- 可维护性:统一的并发控制策略便于维护和问题排查
决策 4:Flow 覆盖率支持策略
选择方案 1:支持 Flow 覆盖率
- 新建 ApexFlowCoverage 表存储 Flow 覆盖率数据
- 在 RunTestsResultVo 中包含 Flow 覆盖率信息
理由:
- 完整性:Salesforce Apex API 支持 Flow 覆盖率,我们应该完整支持
- 业务需求:Flow 是 Salesforce 的重要功能,测试 Flow 覆盖率有助于保证 Flow 的质量
- 扩展性:支持 Flow 覆盖率为后续功能扩展奠定基础
- 成本可控:只增加 1 张表,存储成本增加有限
后果
正面影响
- 数据一致性:复用 002-02 的数据库表,确保测试结果数据的一致性
- 功能完整性:完整存储测试详情和覆盖率数据,满足审计和分析需求
- 性能保证:ReentrantLock 保证多线程安全,避免并发问题
- 扩展性:支持 Flow 覆盖率,为后续功能扩展奠定基础
- 维护性:统一的技术方案便于维护和问题排查
负面影响
- 存储成本:完整存储策略会增加存储成本,但增长可控
- 查询性能:大量测试数据可能影响查询性能,需要通过索引优化
- 复杂度:复用 + 新建的混合策略增加了一定的复杂度
替代方案
数据库表设计策略 - 方案 2:完全独立的数据库表
- 描述:创建 5 张全新的数据库表,不与 002-02 共享任何表
- 优点:
- 完全独立,不受 002-02 影响
- 表结构可以根据测试执行功能的需求定制
- 缺点:
- 数据冗余:compileAndTest 和 runTests 产生的测试结果存储在不同的表中
- 查询复杂:需要查询多个表才能获取完整的测试历史
- 维护成本高:需要维护两套相似的数据库表结构
- 适用场景:测试执行功能与编译执行功能完全独立,不需要共享数据
测试结果存储策略 - 方案 2:精简存储策略
- 描述:只保存测试结果的摘要信息(测试数量、失败数量、总时间),不保存详细的成功/失败/覆盖率信息
- 优点:
- 存储成本低
- 查询性能好
- 缺点:
- 无法满足审计需求
- 无法支持详细的分析和报表
- 无法定位测试失败的具体原因
- 适用场景:对存储成本敏感,且不需要详细测试历史的场景
并发控制策略 - 方案 2:数据库乐观锁
- 描述:使用数据库乐观锁(version 字段)控制并发
- 优点:
- 分布式环境下也能保证一致性
- 不需要在代码中显式加锁
- 缺点:
- 与 002-02 的并发控制策略不一致
- 需要修改数据库表结构,增加 version 字段
- 冲突时需要重试,增加复杂度
- 适用场景:分布式部署,需要跨 JVM 的并发控制
Flow 覆盖率支持策略 - 方案 2:不支持 Flow 覆盖率
- 描述:不存储 Flow 覆盖率数据,只支持代码覆盖率
- 优点:
- 减少 1 张数据库表
- 降低存储成本
- 简化代码逻辑
- 缺点:
- 功能不完整
- 无法满足需要 Flow 覆盖率的业务场景
- 后续添加需要修改代码和数据库
- 适用场景:业务场景不需要 Flow 覆盖率分析