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 重写为单源开发流程。
This commit is contained in:
@@ -0,0 +1,270 @@
|
||||
---
|
||||
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)
|
||||
Reference in New Issue
Block a user