检查点与断言
检查点与断言 (★★)
#testing #abap-basics
三种检查点类型
| 类型 | 语句 | 无条件? | 效果 |
|---|---|---|---|
| 断点 | BREAK-POINT |
是(不带 ID) | 启动调试器 |
| 断言 | ASSERT |
有条件 | 条件为假时产生转储 |
| 日志点 | LOG-POINT |
需要 ID | 记录到检查点组 |
BREAK-POINT 语句
1 | " 无条件 - 始终激活,启动调试器 |
| 形式 | 激活时机 | 可传输? |
|---|---|---|
BREAK-POINT |
始终 | 在生产中危险 |
BREAK username |
仅对用户 username |
更安全 |
BREAK-POINT ID group |
当组在 SAAB 中激活时 | 安全(可停用) |
⛔
BREAK-POINT 不带 ID 始终激活。传输到生产环境前必须移除。改用 BREAK-POINT ID group。ASSERT 语句
1 | " 简单断言 |
| 部分 | 用途 |
|---|---|
CONDITION |
要检查的布尔表达式 |
FIELDS obj1 obj2 ... |
失败时记录的数据对象 |
ID group |
用于激活控制的检查点组 |
💡
ASSERT 比等效的 IF ... ENDIF 加错误处理更简短、更易读。它直接表达意图:”此条件必须成立。”ASSERT vs 基于 IF 的检查
1 | " 基于 IF(冗长) |
LOG-POINT 语句
1 | " 基本日志点 |
| 规则 | 详情 |
|---|---|
必须有 ID |
日志点要求检查点组 |
无 CONDITION |
日志点是无条件的(激活时) |
| 记录到 | 事务 SAAB 日志 |
📌
LOG-POINT 始终需要 ID group。与断点不同,日志点不能在没有检查点组的情况下使用。检查点组(事务 SAAB)
检查点组集中控制所有三种检查点类型的激活。
激活状态
| 检查点类型 | 不活跃 | 中断 | 日志 | 中止 |
|---|---|---|---|---|
| 断点 | 无效果 | 调试器启动 | 记录 | 不适用 |
| 断言 | 无效果 | 调试器启动 | 记录 | 短转储 |
| 日志点 | 无效果 | 不适用 | 记录 | 不适用 |
1 | SAAB 激活: |
SAAB 配置
| 设置 | 选项 |
|---|---|
| 有效性 | 所有用户、特定用户或外部断点 |
| 激活 | 临时(直到注销)或持久 |
| 范围 | 整个组或特定检查点 |
💡使用检查点组将断言和日志点保留在生产代码中。仅在调试生产环境问题时激活它们。
断言 vs 异常
| 方面 | 断言 | 异常 |
|---|---|---|
| 用途 | 验证不变量 / 开发者假设 | 处理预期的错误条件 |
| 受众 | 开发者(在生产中不应失败) | 终端用户 / 调用代码 |
| 使用时机 | 前置条件、后置条件、不变量 | 业务逻辑错误、资源问题 |
| 生产环境 | 可通过 SAAB 停用 | 始终激活 |
📌断言和异常是互补的,不是替代关系。断言用于”这不应该发生”的检查,异常用于”这可能发生”的错误。
最佳实践
| 实践 | 原因 |
|---|---|
| 使用检查点组(SAAB) | 集中激活控制 |
传输前移除静态 BREAK-POINT |
防止生产环境调试器 |
在代码中保留 ASSERT ID group |
可为生产调试激活 |
使用 LOG-POINT 进行跟踪 |
比断点更轻量,不中断 |
FIELDS 附加项用于诊断 |
失败时查看相关数据 |
考试/测试模式
| 关键词 / 短语 | 答案 |
|---|---|
| “LOG-POINT 需要什么?” | 必须有 ID group(检查点组) |
| “ASSERT 条件为假时” | 短转储(或根据 SAAB 状态中断/记录) |
| “SAAB 断言状态” | 不活跃、中断、记录、中止 |
| “SAAB 日志点状态” | 不活跃、记录 |
| “BREAK-POINT 不带 ID 在生产环境” | 始终激活 – 传输前必须移除 |
| “FIELDS 附加项用途” | 检查点触发时记录数据对象内容 |
| “断言 vs 异常” | 互补:断言 = 不变量,异常 = 预期错误 |
| “断言激活控制” | 通过检查点组(事务 SAAB) |