用途
该技能用于将 Salesforce 遗留触发器重构为 handler 模式,同时提供自动化测试生成与部署能力。适合以下场景:
- 现代化改造循环中执行 DML/SOQL 的遗留触发器
- 重构缺乏明确关注点分离的触发器
- 在既有触发器代码中实现批量安全模式
- 为重构后的触发器生成全面的测试覆盖
前置条件
使用前需要确保:
- 已安装 Salesforce CLI 并完成对目标 org 的认证
- 已安装 Python 3.9 或更高版本
- 已部署基线触发器(参见设置部分)
设置
先将基线反模式触发器部署到 org,供分析和重构使用。资料中给出的反模式示例把所有逻辑堆积在触发器中,并在循环内执行 DML/SOQL,例如在 after update 循环内插入 Task。该示例覆盖 before insert、before update、after update 三个上下文。
部署命令:
sf project deploy start --source-dir force-app/main/default/triggers
主要能力
步骤 1:分析触发器
运行分析脚本识别反模式并生成报告:
python scripts/analyze_trigger.py OpportunityTrigger
脚本会输出:循环中的 DML 位置(行号)、循环中的 SOQL 位置(行号)、缺失的批量化区域、复杂度评分(1-10)、推荐方案(基于触发器上下文建议 handler 模式)。分析报告应在重构前审阅。
步骤 2:审阅 handler 模式
参考 handler 模式文档,了解单一职责 handler(每个触发器上下文一个 handler 类)、统一 handler 方案(单个 handler 配合上下文方法)、批量集合策略(如何在循环外聚合 DML/SOQL)、最佳实践(错误处理、测试边界、部署顺序)。根据触发器复杂度和团队约定选择合适模式。
步骤 3:重构触发器
创建 handler 类并提取逻辑:将逻辑提取到具有描述性名称的 handler 方法中,为 DML 操作实现批量安全集合,使用 try-catch 或 Database 方法添加错误处理,更新触发器使其仅做委托并传递 Trigger 上下文变量,同时保持行为一致。重构后触发器应简化为简单委托,例如根据 Trigger.isBefore/isInsert、isBefore/isUpdate、isAfter/isUpdate 分别调用 handler 的 beforeInsert、beforeUpdate、afterUpdate 方法。
步骤 4:生成测试
使用 assets/test_template.apex 中的测试模板搭建测试类:复制模板并按 handler 重命名;实现 setup 方法创建测试数据;为每个 handler 方法编写单元测试,覆盖正向用例、负向用例和边界条件;添加 200 条以上记录的批量测试以验证批量化;测试仅有部分记录符合逻辑的混合场景。所需测试覆盖要求:每个 handler 方法至少 2 个测试方法(正向 + 负向);至少一个 200 条以上记录的批量测试;整体代码覆盖率必须达到 100%。
步骤 5:部署与验证
部署重构后的触发器、handler 和测试:
部署所有组件
sf project deploy start --source-dir force-app/main/default
运行测试
sf apex test run --class-names OpportunityTriggerHandlerTest --result-format human --code-coverage
验证无回归
sf apex test run --test-level RunLocalTests --result-format human
验证清单:所有新测试通过且覆盖率 100%;调试日志中没有新的 governor limit 警告;既有功能保持不变;生产部署已规划回滚策略。
使用方式
按分析、选择模式、重构、生成测试、部署验证五步推进。每一步的脚本命令和部署命令均在该技能的文档中给出。
常见问题排查
- 测试失败并报 “System.LimitException: Too many DML statements”:确保 handler 方法收集 DML 操作并在循环外执行。
- 代码覆盖率低于 100%:添加负向测试用例,并验证所有条件分支均已测试。
- 行为与原始触发器不同:检查 Trigger 上下文变量(new、old、oldMap)是否正确传递给 handler。
后续步骤
重构成功后:在团队 wiki 中记录新的 handler 模式;更新代码审查清单,要求新触发器强制使用 handler 模式;使用该技能识别其他待重构的遗留触发器;如果管理大量触发器,可考虑实现触发器框架。
限制
该技能依赖 Salesforce CLI 与 Python 3.9+ 环境,要求已部署基线触发器;重构需保持行为一致并达到 100% 覆盖率;资料中未提供收费、价格、平台范围或实际效果数据。