--- 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)