Files
sap-cli-skill/docs/adt/04.检查代码-原理.md
T
吴让宇 c5905a5b1e refactor: 本仓升为唯一源(原 sap-cli 源码仓归档)
方向反转:此前 SKILL.md 是「模板渲染产物」、sap-cli 是源;现 sap-cli 归档,
sap-cli-skill 承接开发与分发,SKILL.md 回归手工维护的正本。

迁移(来自 sap-cli,共 104 文件):
- tests/           692 例测试(15 个文件的内联 sys.path 改指 assets/)
- openspec/        SDD 规格与归档变更(42 文件)
- docs/            开发文档与 ADT 原理(含 dev/CLAUDE.md、AGENTS.md)
- .claude/         rules 副本 + settings.json(供 Claude Code)
- .github/ .hermes/ .pre-commit-config.yaml .editorconfig CLAUDE.md
- scripts/ 保持仅 setup.py(pack_skill.py 已随旧仓归档,不迁)

修复(迁移暴露的真实缺陷):
- assets/pyproject.toml 的 build-backend 写作 `setuptools.backends._legacy:_Backend`,
  该模块在 setuptools 中不存在 → `pip install -e` 从来装不上。改为 build_meta。
  实测:临时 venv 安装成功,sap-cli --help 正常列出 31 个命令
- pyproject readme 指向不存在的 assets/README.md(editable 安装会失败)→ 改内联文本
- pyproject urls 改指 sap-cli-skill

机制调整:
- .github/workflows/ci.yml 适配 assets/ 布局;顶部注明该工作流仅 GitHub 执行,
  本仓在 Gitee 不会自动跑
- pre-commit 增本地测试门禁(Gitee 上真正生效的那道)
- .gitignore 合并旧仓完整规则(保留 log/ 下 md 知识库入库,只忽略运行日志)
- 大文件上限 100KB→1MB(架构图 512KB)

守卫测试 tests/unit/test_repo_guards.py(10 → 18 例):
- SKILL.md 须记录 parser 全部 CLI 命令 / 铁律 1-5 须为真实小节标题 / 示例不得违反铁律 5
- references/ 规则齐备;.claude/rules 与 references 必须一致(实测抓到一次真实漂移)
- VERSION == sapcli.__version__ == README 版本
- 仓内不得再出现 pack_skill.py / skill-src(防废弃流程回潮)

698 tests OK;editable 安装与 CLI 入口经临时 venv 实测通过。
docs/RELEASING.md 重写为单源开发流程。
2026-09-11 00:40:15 +08:00

10 KiB
Raw Blame History

title, created, tags, parent, prev, next
title created tags parent prev next
检查代码 - 原理 2026-05-18
SAP
ADT
ATC
syntax-check
code-quality
REST
sap-cli/README sap-cli/03.修改代码-原理 sap-cli/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

<?xml version="1.0" encoding="utf-8"?>
<atc:run xmlns:atc="http://www.sap.com/adt/atc"
         maximumViolations="100">
  <objectSets xmlns:adtcore="http://www.sap.com/adt/core">
    <objectSet kind="inclusive">
      <adtcore:objectReferences>
        <adtcore:objectReference
          adtcore:uri="/sap/bc/adt/oo/classes/{class_name}"/>
      </adtcore:objectReferences>
    </objectSet>
  </objectSets>
</atc:run>

获取 ATC 结果

GET /sap/bc/adt/atc/runs/{run_id}/results

响应格式

<atc:findings xmlns:atc="http://www.sap.com/adt/atc">
  <atc:finding priority="1"
               messageTitle="Possible SQL injection"
               location="ZCL_EXAMPLE=>METHOD_X line 42"
               checkId="SQL_INJECTION"/>
  <atc:finding priority="2"
               messageTitle="SELECT * should be avoided"
               location="ZCL_EXAMPLE=>METHOD_Y line 15"
               checkId="PERFORMANCE_SELECT_STAR"/>
</atc:findings>

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 实现自动化

# 完整的自动检查流程
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 编辑器中的行内错误/警告标记

🔗 相关笔记

📚 参考来源