---
title: 检查代码 - 原理
created: 2026-05-18
tags:
- SAP
- ADT
- ATC
- syntax-check
- code-quality
- REST
parent: "[[sap-cli/README|SAP ADT 学习笔记总览]]"
prev: "[[sap-cli/03.修改代码-原理|03.修改代码 - 原理]]"
next: "[[sap-cli/05.提交与传输-原理|05.提交与传输 - 原理]]"
---
# 检查代码 — 原理
> [!abstract] 概述
> ADT 提供三层代码检查能力:**语法检查 (Syntax Check)**、**ABAP Test Cockpit (ATC)** 静态分析** 和 **单元测试执行**。检查结果通过 REST API 返回,在 Eclipse 中以结构化问题列表展示。
## 1. 三层代码检查体系
```
┌──────────────────────────────────────────────────────┐
│ Level 3: 单元测试 (ABAP Unit) │
│ • 执行实际的测试代码 │
│ • 验证运行时行为 │
│ • REST: /sap/bc/adt/oo/classes/{name}/testruns │
├──────────────────────────────────────────────────────┤
│ Level 2: ATC 质量检查 (ABAP Test Cockpit) │
│ • 静态代码分析(功能/性能/安全) │
│ • 可在激活时自动触发 │
│ • REST: /sap/bc/adt/atc/runs │
├──────────────────────────────────────────────────────┤
│ Level 1: 语法检查 (Syntax Check) │
│ • 编译期错误检测 │
│ • 激活前必须通过 │
│ • REST: 集成在 activation 端点中 │
└──────────────────────────────────────────────────────┘
```
## 2. 语法检查 (Syntax Check)
### 原理
语法检查是 **最低级别** 的代码检查,验证 ABAP 代码是否能够成功编译。它作为激活流程的一部分自动执行,也可以手动触发。
### 触发时机
| 场景 | 自动/手动 | 说明 |
|------|----------|------|
| 激活对象前 | 自动 | 激活框架首先执行语法检查 |
| 编辑器中保存后 | 可配置 | 可设置为保存时自动检查 |
| 手动触发 | 手动 | Ctrl+F2 或菜单 |
### 工作流程
```
1. 客户端触发语法检查请求
↓
2. ADT Framework 调用 ABAP 编译器 (ABAP Compiler)
↓
3. 编译器分析源代码:
├── 关键字拼写检查
├── 类型兼容性检查
├── 接口实现完整性检查
└── 引用对象存在性检查
↓
4. 返回检查结果:
├── Errors (错误) — 阻止激活
├── Warnings (警告) — 不阻止但建议修复
└── Information (信息) — 代码改进建议
↓
5. Eclipse 在编辑器中以标记形式展示
(红色波浪线 = Error,黄色 = Warning)
```
### 与 SAP GUI 的对比
| ADT 语法检查 | SAP GUI 等效 |
|-------------|-------------|
| 自动检查 + 编辑器标记 | `SE38` → Check (Ctrl+F2) |
| 保存时可自动检查 | 需要手动触发 |
| 实时错误提示 | 无实时检查 |
## 3. ABAP Test Cockpit (ATC)
### 原理
ATC 是 SAP 的 **标准化代码质量检查工具**,提供比语法检查更深入的静态分析能力,涵盖功能正确性、性能优化和安全合规。
### REST API 调用
#### 创建 ATC 运行
```
POST /sap/bc/adt/atc/runs
Content-Type: application/xml
```
#### 获取 ATC 结果
```
GET /sap/bc/adt/atc/runs/{run_id}/results
```
### 响应格式
```xml
```
### ATC 检查类别
| 类别 | 说明 | 示例检查项 |
|------|------|-----------|
| **功能检查** | 逻辑错误、空引用 | 未处理的异常、未使用的变量 |
| **性能检查** | 性能反模式 | SELECT *、嵌套 SELECT、缺少索引 |
| **安全检查** | 安全漏洞 | SQL 注入、权限检查缺失 |
| **编程规范** | 编码标准 | 命名规范、注释要求 |
| **Cloud Readiness** | 云兼容性 | 不允许的语句/对象 |
### ATC 运行模式
```
┌──────────────────────────────────────────────────────────┐
│ 模式 1: 手动检查 │
│ 开发者右键 → Run ATC Check │
│ → 立即执行,结果展示在 ATC Results 视图中 │
├──────────────────────────────────────────────────────────┤
│ 模式 2: 激活时自动检查 │
│ 配置 Preferences → ABAP → ATC │
│ → 每次激活时自动触发 ATC │
│ → 发现问题时提示开发者 │
├──────────────────────────────────────────────────────────┤
│ 模式 3: 传输发布时检查 │
│ 传输发布前自动运行 ATC │
│ → 基于 Baseline 只检查新增/修改的代码 │
│ → 确保不会将质量问题引入生产环境 │
├──────────────────────────────────────────────────────────┤
│ 模式 4: 远程代码分析 (Remote Code Analysis) │
│ 在中央 ATC 系统上分析代码 │
│ → 使用最新检查规则 │
│ → 跨系统的代码质量监控 │
└──────────────────────────────────────────────────────────┘
```
### ATC Baseline 概念
> [!info] Baseline 的作用
> Baseline 允许团队将现有代码标记为"已接受",只对**新增或修改的代码**运行检查。这避免了在遗留代码上产生大量已知问题。
```
首次使用:
1. 对整个仓库运行 ATC → 生成 Baseline
2. Baseline 记录所有已知问题
3. 后续检查只报告 Baseline 之后新增的问题
传输检查:
1. 传输发布时运行 ATC
2. 与 Baseline 比对
3. 只有新增问题会阻止传输发布
```
## 4. ABAP Unit 测试
### 原理
ABAP Unit 是 ABAP 的内置单元测试框架。测试方法使用 `FOR TESTING` 标记,在专门的测试会话中执行。
### REST API 调用
```
POST /sap/bc/adt/oo/classes/{test_class_name}/testruns
```
### 后端执行流程
```
1. ADT 接收测试执行请求
↓
2. ABAP Runtime 创建测试隔离环境
↓
3. 执行标记为 FOR TESTING 的方法
↓
4. 收集测试结果:
├── Passed (通过)
├── Failed (失败) + 失败原因
└── Error (错误) + 异常信息
↓
5. 返回结果给客户端
```
## 5. 代码检查与 CI/CD 集成
### 自动化检查流水线
```
代码修改 → 语法检查 → ATC 检查 → ABAP Unit → 传输发布
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
保存成功 无错误 无严重问题 全部通过 发布到目标系统
```
### 通过 REST API 实现自动化
```python
# 完整的自动检查流程
def automated_code_check(client, object_uri):
# 1. 语法检查(通过激活预检)
activation_result = activate_object(client, object_uri)
if activation_result.get("errors"):
return "BLOCKED: Syntax errors"
# 2. ATC 检查
atc_result = run_atc_check(client, object_uri)
critical_findings = [f for f in atc_result["findings"]
if f["priority"] == "1"]
if critical_findings:
return "BLOCKED: Critical ATC findings"
# 3. 单元测试
test_result = run_unit_tests(client, test_class_uri)
if test_result["failed"] > 0:
return "BLOCKED: Unit test failures"
return "PASSED: All checks green"
```
## 6. Eclipse 中的检查结果展示
| 视图 | 说明 |
|------|------|
| **Problems View** | 语法检查和编译错误 |
| **ATC Results View** | ATC 检查发现,按严重级别分组 |
| **ABAP Unit Results** | 单元测试执行结果 |
| **Editor Markers** | 编辑器中的行内错误/警告标记 |
## 🔗 相关笔记
- [[sap-cli/03.修改代码-原理|03.修改代码 - 原理]] — 激活流程中集成语法检查
- [[sap-cli/05.提交与传输-原理|05.提交与传输 - 原理]] — 传输发布时触发 ATC
## 📚 参考来源
- [SAP Help Portal - Checking Quality of ABAP Code with ATC](https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/checking-quality-of-abap-code-with-atc)
- [Remote Code Analysis in ATC](https://community.sap.com/t5/application-development-and-automation-blog-posts/remote-code-analysis-in-abap-test-cockpit-atc-faq/ba-p/13320130)
- [End-to-End SAP Automation with ADT REST Services](https://medium.com/@onuryz.itu/end-to-end-sap-automation-with-adt-rest-services-and-ai-a-modern-alternative-to-gui-scripting-343ea86064ea)