datai/datai-scenes/datai-scene-salesforce/docs/decisions/2026-02-02-002-03-ADR-测试执行技术选型.md

6.0 KiB
Raw Permalink Blame History

ADR-002-03: 测试执行技术选型

状态

已接受

日期

2026-02-02

背景

测试执行功能需要选择合适的技术方案,包括数据库表设计策略、测试结果存储策略、并发控制策略和 Flow 覆盖率支持策略。这些决策将影响系统的数据一致性、查询性能、存储成本和功能完整性。

需求约束

  1. 支持多种测试执行方式(全部、按类、按包、按方法)
  2. 详细记录测试结果(成功、失败、覆盖率)
  3. 支持代码覆盖率和 Flow 覆盖率分析
  4. 确保多线程安全和数据一致性
  5. 与 002-02Apex 代码编译和执行)功能的数据模型兼容

决策

决策 1数据库表设计策略

选择方案 1复用 + 新建混合策略

  • 复用 002-02 的 3 张表ApexTestResult、ApexTestFailure、ApexCodeCoverage
  • 新建 2 张表ApexTestSuccess、ApexFlowCoverage

理由:

  1. 数据一致性ApexTestResult、ApexTestFailure、ApexCodeCoverage 在 002-02 中已经定义,复用可避免数据冗余和不一致
  2. 功能完整性002-02 的 compileAndTest 功能也会产生测试结果,使用相同的表结构便于统一查询
  3. 维护成本低:减少数据库表数量,降低维护复杂度
  4. 扩展性:新建 ApexTestSuccess 和 ApexFlowCoverage 表支持测试执行特有的功能

决策 2测试结果存储策略

选择方案 1完整存储策略

  • 保存所有测试成功详情ApexTestSuccess 表)
  • 保存所有测试失败详情ApexTestFailure 表)
  • 保存所有代码覆盖率详情ApexCodeCoverage 表)
  • 保存所有 Flow 覆盖率详情ApexFlowCoverage 表)

理由:

  1. 审计需求:完整的测试历史记录支持审计和追溯
  2. 分析需求:详细的测试数据支持后续的分析和报表生成
  3. 调试需求:测试失败详情和堆栈跟踪有助于问题定位
  4. 覆盖率趋势:历史覆盖率数据支持趋势分析和质量改进

决策 3并发控制策略

选择方案 1ReentrantLock

  • 使用 ReentrantLock 保证测试执行的多线程安全
  • 与 002-02 的并发控制策略保持一致

理由:

  1. 一致性:与 002-02 使用相同的并发控制机制,保持代码一致性
  2. 灵活性ReentrantLock 比 synchronized 更灵活,支持公平锁、可中断锁等特性
  3. 性能ReentrantLock 在高并发场景下性能更好
  4. 可维护性:统一的并发控制策略便于维护和问题排查

决策 4Flow 覆盖率支持策略

选择方案 1支持 Flow 覆盖率

  • 新建 ApexFlowCoverage 表存储 Flow 覆盖率数据
  • 在 RunTestsResultVo 中包含 Flow 覆盖率信息

理由:

  1. 完整性Salesforce Apex API 支持 Flow 覆盖率,我们应该完整支持
  2. 业务需求Flow 是 Salesforce 的重要功能,测试 Flow 覆盖率有助于保证 Flow 的质量
  3. 扩展性:支持 Flow 覆盖率为后续功能扩展奠定基础
  4. 成本可控:只增加 1 张表,存储成本增加有限

后果

正面影响

  1. 数据一致性:复用 002-02 的数据库表,确保测试结果数据的一致性
  2. 功能完整性:完整存储测试详情和覆盖率数据,满足审计和分析需求
  3. 性能保证ReentrantLock 保证多线程安全,避免并发问题
  4. 扩展性:支持 Flow 覆盖率,为后续功能扩展奠定基础
  5. 维护性:统一的技术方案便于维护和问题排查

负面影响

  1. 存储成本:完整存储策略会增加存储成本,但增长可控
  2. 查询性能:大量测试数据可能影响查询性能,需要通过索引优化
  3. 复杂度:复用 + 新建的混合策略增加了一定的复杂度

替代方案

数据库表设计策略 - 方案 2完全独立的数据库表

  • 描述:创建 5 张全新的数据库表,不与 002-02 共享任何表
  • 优点
    • 完全独立,不受 002-02 影响
    • 表结构可以根据测试执行功能的需求定制
  • 缺点
    • 数据冗余compileAndTest 和 runTests 产生的测试结果存储在不同的表中
    • 查询复杂:需要查询多个表才能获取完整的测试历史
    • 维护成本高:需要维护两套相似的数据库表结构
  • 适用场景:测试执行功能与编译执行功能完全独立,不需要共享数据

测试结果存储策略 - 方案 2精简存储策略

  • 描述:只保存测试结果的摘要信息(测试数量、失败数量、总时间),不保存详细的成功/失败/覆盖率信息
  • 优点
    • 存储成本低
    • 查询性能好
  • 缺点
    • 无法满足审计需求
    • 无法支持详细的分析和报表
    • 无法定位测试失败的具体原因
  • 适用场景:对存储成本敏感,且不需要详细测试历史的场景

并发控制策略 - 方案 2数据库乐观锁

  • 描述使用数据库乐观锁version 字段)控制并发
  • 优点
    • 分布式环境下也能保证一致性
    • 不需要在代码中显式加锁
  • 缺点
    • 与 002-02 的并发控制策略不一致
    • 需要修改数据库表结构,增加 version 字段
    • 冲突时需要重试,增加复杂度
  • 适用场景:分布式部署,需要跨 JVM 的并发控制

Flow 覆盖率支持策略 - 方案 2不支持 Flow 覆盖率

  • 描述:不存储 Flow 覆盖率数据,只支持代码覆盖率
  • 优点
    • 减少 1 张数据库表
    • 降低存储成本
    • 简化代码逻辑
  • 缺点
    • 功能不完整
    • 无法满足需要 Flow 覆盖率的业务场景
    • 后续添加需要修改代码和数据库
  • 适用场景:业务场景不需要 Flow 覆盖率分析

相关文档