6.9 KiB
6.9 KiB
Apex 单元测试与覆盖率统计需求
元数据
- 需求编号:013-3
- 父需求:013
- 创建时间:2026-01-26
- 创建人:SSOT 架构师
- 状态:已完成
- 优先级:高
- 关联设计:Apex单元测试与覆盖率统计设计
- 关联代码:
com.sforce.soap.apex.RunTestsRequestcom.sforce.soap.apex.RunTestsResultcom.sforce.soap.apex.TestsNodecom.sforce.soap.apex.CodeCoverageResultcom.sforce.soap.apex.CodeLocationcom.sforce.soap.apex.RunTestSuccesscom.sforce.soap.apex.RunTestFailure
需求概述
封装 Salesforce Apex 单元测试运行接口,支持同步运行测试用例(按类、按方法、按包),并获取详细的测试结果、日志 ID 和代码覆盖率数据。
目标
- 灵活运行测试:支持多种粒度的测试运行方式(所有、指定类、指定方法、指定包)。
- 结构化结果:将复杂的 SOAP 响应转换为清晰的 Java VO 对象。
- 覆盖率分析:提供精确到行级的代码覆盖率统计,支持 Class 和 Trigger。
- 执行控制:支持设置最大失败次数等控制参数。
功能需求
1. 运行单元测试 (Run Tests)
- 功能描述:封装
SoapConnection.runTests方法。 - 接口定义:
TestRunResult runTests(TestOptions options); - 输入参数 (
TestOptions):boolean allTests: 是否运行组织内的所有测试。List<String> classes: 要运行的测试类名列表(对应 SOAPclasses)。List<String> packages: 要运行的测试包名列表(对应 SOAPpackages)。List<TestCase> tests: 指定类和方法运行(对应 SOAPtests字段,类型为TestsNode[])。TestCaseVO 包含classId,className和testMethods(List)。
String namespace: 指定命名空间。int maxFailedTests: 允许的最大失败测试数,超过则停止(对应 SOAPmaxFailedTests,默认 -1 表示不限制)。boolean skipCodeCoverage: 是否跳过代码覆盖率统计(对应 SOAPskipCodeCoverage,默认 false)。
- 处理逻辑:
- 构建
RunTestsRequest对象。 - 根据
options填充allTests,classes,packages,namespace,maxFailedTests,skipCodeCoverage。 - 如果提供了
tests,将其转换为TestsNode数组。 - 调用
connection.runTests(request)。
- 构建
2. 测试结果解析 (Test Result Parsing)
- 功能描述:解析
RunTestsResult对象。 - 输出对象 (
TestRunResult):String apexLogId: 本次测试执行生成的调试日志 ID(对应 SOAPapexLogId)。Summary summary:int numTestsRun: 运行总数。int numFailures: 失败总数。double totalTime: 总耗时。
List<TestSuccess> successes: 成功用例列表。- 字段:
id,name(类名),methodName,time,namespace,seeAllData。
- 字段:
List<TestFailure> failures: 失败用例列表。- 字段:
id,name,methodName,message,stackTrace,type(异常类型),time,namespace,seeAllData。
- 字段:
3. 代码覆盖率统计 (Code Coverage)
- 功能描述:解析
RunTestsResult中的覆盖率数据。 - 输出对象:包含在
TestRunResult中。List<CodeCoverage> coverages:- 字段:
String id: 覆盖率记录 ID。String name: 类或触发器名称。String namespace: 命名空间。String type: 类型(Class 或 Trigger,对应 SOAPtype)。int numLocations: 总可执行行数。int numLocationsNotCovered: 未覆盖行数。List<Location> locationsNotCovered: 未覆盖的具体位置。Location:line(行号),column(列号),numExecutions(执行次数),time(执行时间)。
double percentage: 覆盖率百分比 (计算值:(numLocations - numLocationsNotCovered) / numLocations)。
- 字段:
List<String> warnings: 覆盖率警告信息(对应 SOAPcodeCoverageWarnings)。List<FlowCoverage> flowCoverages: 流程覆盖率数据(对应 SOAPflowCoverage)。List<String> flowWarnings: 流程覆盖率警告信息(对应 SOAPflowCoverageWarnings)。
关键代码映射 (Source Code Mapping)
SOAP 对象映射
| 逻辑概念 | SOAP 类名 | 关键字段 |
|---|---|---|
| 请求参数 | RunTestsRequest |
allTests, classes, packages, tests (TestsNode[]), maxFailedTests, skipCodeCoverage |
| 指定方法 | TestsNode |
classId, className, testMethods |
| 响应结果 | RunTestsResult |
numTestsRun, numFailures, totalTime, apexLogId, successes, failures, codeCoverage, codeCoverageWarnings, flowCoverage, flowCoverageWarnings |
| 成功详情 | RunTestSuccess |
id, name, methodName, time, namespace, seeAllData |
| 失败详情 | RunTestFailure |
id, name, methodName, message, stackTrace, type, time, namespace, seeAllData |
| 覆盖率 | CodeCoverageResult |
id, name, namespace, type, numLocations, numLocationsNotCovered, locationsNotCovered |
| 代码位置 | CodeLocation |
line, column, numExecutions, time |
验证与测试
- 全量测试:设置
allTests=true,验证能触发所有测试并返回统计。 - 指定类测试:设置
classes=['MyTest'],验证只运行指定类。 - 指定方法测试:设置
tests=[{className='MyTest', testMethods=['testMethod1']}],验证只运行指定方法。 - 失败处理:运行一个必定失败的测试,验证
failures列表中包含正确的message和stackTrace。 - 覆盖率验证:运行测试后,检查返回的
coverages列表,验证locationsNotCovered包含预期的未覆盖行号。 - 日志 ID:验证返回的
apexLogId不为空(当有日志生成时)。
非功能需求
- 性能优化:覆盖率数据(
locationsNotCovered)可能非常大,建议在TestOptions中增加boolean skipCoverage选项(虽然 SOAP API 不直接支持跳过,但可以在客户端解析时选择性忽略)。 - 超时处理:由于
runTests是同步调用,对于大量测试可能会超时,需在文档中注明建议对于大规模测试使用异步 API (7.0 以后版本考虑,当前需求仅关注同步)。