Files
sap-cli-skill/docs/adt/04.检查代码-原理.md
吴让宇 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

271 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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
<?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
```
### 响应格式
```xml
<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 实现自动化
```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)