Apex 测试:为单元测试做准备

为编写有效的 Apex 单元测试做准备:搭建 VS Code 开发环境、掌握测试方法语法与 Arrange-Act-Assert 模式、模拟失败测试错误处理,并掌握四种测试数据策略——暴力法、测试工厂、@TestSetup 方法和 CSV 数据文件,写出可维护、数据隔离的 Apex 测试。...

📅 2026/10/5 ✍️ ponybai 🏷️ salesforce, developer, apex, headless

一、准备构建 Apex 测试

本单元为编写有效的 Apex 测试做准备:搭建 VS Code 开发环境、学习测试方法语法、用 startTest/stopTest 测试类、模拟失败以测试错误处理。

学习目标与准备测试

slide_2

本单元学习目标:设置 VS Code 进行 Apex 测试;用正确语法编写测试方法;用 startTest/stopTest 测试类;模拟失败以测试错误处理。

准备测试:安装 VS Code + Salesforce Extensions → 连接 Trailhead Playground → 创建 Salesforce DX 项目 → 打开 TemperatureConverter 类。VS Code 是 Apex 开发的推荐 IDE,连接 Playground 后即可部署和测试代码。

测试方法语法与 TemperatureConverter 测试

slide_3

测试方法语法遵循 @isTest 注解 + static 方法,内部遵循 Arrange-Act-Assert(或 Given-When-Then)模式:创建测试数据 → 执行被测代码 → 断言预期结果。常用断言方法:System.assertEquals(期望, 实际, 消息)、System.assertNotEquals、System.assert(条件, 消息)。

测试 TemperatureConverter 类:用 Test.startTest()/Test.stopTest() 包住被测代码,然后 System.assertEquals 断言转换结果(如 0°C = 32°F)。在 VS Code 中点击方法上方的 Run Test 按钮执行单个测试方法,在 Output 面板查看结果。

模拟失败

slide_4

测试失败路径和测试成功路径同样重要。模拟失败的测试模式:把「应该抛异常」的代码放进 try 块,紧接着调用 System.assert(false)(这一行永远不该被走到),然后 catch 预期的异常类型,并断言异常消息。

测试要覆盖两面:合法输入产生预期输出(正向),非法输入抛预期异常(负向)。这证明你的代码「以正确的方式失败」——正确的异常类型和消息,而不只是「某种失败」。正向测试 + 负向测试 = 完整覆盖。

二、为测试获取数据

slide_5

第二单元掌握四种创建测试数据的策略:暴力法(内联)、测试工厂(可复用)、@TestSetup(共享)、CSV 文件(外部数据)。

为什么创建测试数据?

slide_6

Apex 测试无法访问 org 数据,必须创建测试需要的所有数据。隔离的重要性:测试可重复(每次结果一致)、可移植(任何 org 都能跑)、可靠(不依赖已有数据)、快速(无需清理 org 数据)。你创建的数据就是测试场景。

四种策略(按复杂度选择):暴力法(简单)、测试工厂(中等)、@TestSetup(高效)、CSV 文件(数据驱动)。每种策略服务不同的测试需求。

暴力法(Brute Force)

slide_7

暴力法:直接在测试方法里创建并插入所有需要的记录。适合简单场景、记录少的测试。优点:所有数据在一处可见、无依赖。缺点:测试间代码重复、对象需求变化时难维护。

关于 Test.startTest()/Test.stopTest():用它获得全新的 governor limits,两者之间的代码在干净的限制上下文中执行,断言放在 stopTest 之后。这样能避免「假失败」——数据 setup 触限导致被测代码失败。

测试工厂(Test Factories)

slide_8

测试工厂:用可复用的静态方法创建测试数据。用 @isTest 注解的 public 类(如 TestFactory),包含 getAccount()、generateOppsForAccount() 等方法,一次调用替代多行样板代码。

工厂的真正威力在于:一行代码创建关联对象网络。集中化、可复用、可维护——当对象新增必填字段时,只需改工厂一处,所有测试受益。这是生产测试套件的标准模式。

@TestSetup 方法

slide_9

@TestSetup:创建一次数据,供类内所有测试方法使用。平台会在每个测试方法前自动执行 @TestSetup 方法,数据在每个测试方法执行后被回滚,下一个测试从原始的 @TestSetup 数据重新开始。

好处:不用在每个测试里重复创建数据、测试执行更快(创建一次、多次使用)、为类内所有测试提供一致基线。最适合:多个测试方法共用的共享参考数据。注意:即便 @TestSetup 创建了数据,测试内仍需查询该数据。

CSV 数据文件

slide_10

CSV 文件:把测试数据放在外部 CSV 文件里,作为静态资源(Static Resource)上传,测试中用 Test.loadData() 加载。

好处:大数据集无需大量代码、数据在外部(非开发者也能创建)、无需改代码即可更新测试场景、适合多场景的数据驱动测试。最适合:数据驱动的测试——记录多或数据复杂的场景。


文章来源:Trailhead - Apex Testing: Prepare for Unit Testing