datai/datai-scenes/datai-scene-salesforce/docs/requirements/REQ-013-3.md

102 lines
5.8 KiB
Markdown
Raw Normal View History

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