一、Apex 单元测试入门
本单元学习目标:理解 Apex 单元测试框架;说明代码覆盖率要求;编写测试类和方法;创建测试数据并运行测试。测试在 Salesforce 上不是可选项——它是通往生产的必经之路。
Apex 单元测试
Apex 单元测试是验证其他代码的代码。为什么要测试:验证预期行为、在部署前捕获回归、满足 Salesforce 的 75% 代码覆盖率要求(生产部署必需)、为其他开发者记录预期行为、让重构更有信心。
关键测试原则:测试在隔离中运行(无 org 数据访问);每个测试方法测试一个场景;测试类用 @isTest 注解;用 Test.startTest()/Test.stopTest() 隔离 governor limits;用 System.assert() 断言预期结果。
测试在 Salesforce 上不是可选项——你的代码没有 75% 覆盖率就无法部署到生产。
代码覆盖率与测试语法
代码覆盖率(Code Coverage)是测试执行的 Apex 代码行百分比,最低要求 75%。可在 Developer Console(Tests 标签)、VS Code(运行测试后)、Setup → Apex Test Execution 查看。
测试类语法:@isTest 注解的类(不计入 org 代码限制)、@isTest 注解的 static 测试方法。测试方法遵循 Arrange-Act-Assert 模式:创建测试数据 → 执行被测代码 → 断言预期结果。Test.startTest()/Test.stopTest() 提供全新的 governor limit 上下文。
最常用的断言是 System.assertEquals(期望值, 实际值, 失败消息)——三个参数分别是预期值、实际值和可选的失败说明。
提升代码覆盖率与测试套件
提升覆盖率的策略:测试正向用例(合法输入 → 预期输出)、负向用例(非法输入 → 异常)、批量场景(200 条而非 1 条)、边界用例(null、空、边界值)、所有分支(if/else 路径、switch 分支);触发器要测试 insert、update、delete、undelete。
创建并执行测试套件(Test Suite):把相关测试分组,一次性运行。Developer Console → Test → New Suite → 添加测试类 → 运行套件查看合并结果。测试套件用于:部署前验证(全量运行)、特性专项测试(只跑相关)、CI/CD 流水线(自动执行)。覆盖率越高,越有信心。
创建测试数据
测试无法访问 org 数据,必须在测试内创建测试数据。三种模式:
- 方法内直接创建——简单、明确。
- @TestSetup——类内共享的测试数据。
- 测试工具类(factory)——可复用的测试数据创建。
测试数据应:最小化(只创建这个测试需要的)、显式(值在测试中写明)、隔离(每个测试各自的数据,互不影响)。
二、测试 Apex 触发器
本单元学习测试 Apex 触发器——通过 DML 操作验证触发器行为,并断言预期结果。
为触发器添加并运行单元测试
触发器测试模式:① 创建测试数据(会触发触发器的记录)→ ② 执行 DML 操作(insert/update/delete)→ ③ 断言触发器的预期副作用。
测试所有触发器事件:insert(创建记录 → 验证默认值)、update(修改记录 → 验证响应)、delete(删除记录 → 验证阻止或级联)。测试批量:插入 200 条记录,验证全部处理,确保 governor limit 安全。
触发器在 Test.startTest()/Test.stopTest() 内同步运行,所以 DML 之后立即断言就能看到触发器的结果。
三、为 Apex 测试创建测试数据
最后一个单元学习创建可复用的测试工具类,在所有测试中一致地生成测试数据。
测试工具类与方法
测试工具类(Test Utility Class)是可复用的测试数据工厂。用 @isTest 注解的 public 类,包含静态方法(如 createAccount()、createContacts()),每个方法创建并插入测试记录、返回结果。
好处:集中化测试数据创建、跨测试类一致、简洁(一次方法调用替代多行代码)、可维护(对象新增必填字段时,只需改工厂一处,所有测试受益)。
测试不同条件
全面测试要覆盖多种条件:单条记录、批量记录(200 条)、正向用例(合法数据、预期结果)、负向用例(非法数据、预期错误)、边界用例(null 字段、边界值)。
运行类中所有测试方法:Developer Console → Test → Run All,查看合并覆盖率和结果。用 @TestSetup 创建共享数据:每个测试类创建一次、每个测试方法后回滚、供类内所有测试方法使用,比每个测试都创建数据更高效。









