检查点与断言

检查点与断言 (★★)

#testing #abap-basics

三种检查点类型

类型 语句 无条件? 效果
断点 BREAK-POINT 是(不带 ID) 启动调试器
断言 ASSERT 有条件 条件为假时产生转储
日志点 LOG-POINT 需要 ID 记录到检查点组

BREAK-POINT 语句

1
2
3
4
5
6
7
8
" 无条件 - 始终激活,启动调试器
BREAK-POINT.

" 用户特定 - 仅对指定用户
BREAK username.

" 带检查点组 - 可通过 SAAB 激活
BREAK-POINT ID zcg_debug.
形式 激活时机 可传输?
BREAK-POINT 始终 在生产中危险
BREAK username 仅对用户 username 更安全
BREAK-POINT ID group 当组在 SAAB 中激活时 安全(可停用)
BREAK-POINT 不带 ID 始终激活。传输到生产环境前必须移除。改用 BREAK-POINT ID group

ASSERT 语句

1
2
3
4
5
6
7
8
" 简单断言
ASSERT sy-subrc = 0.

" 带检查点组(可激活)
ASSERT ID zcg_check CONDITION sy-subrc = 0.

" 带 FIELDS(失败时记录额外数据)
ASSERT ID zcg_check FIELDS lv_value lt_data CONDITION lv_value > 0.
部分 用途
CONDITION 要检查的布尔表达式
FIELDS obj1 obj2 ... 失败时记录的数据对象
ID group 用于激活控制的检查点组
💡ASSERT 比等效的 IF ... ENDIF 加错误处理更简短、更易读。它直接表达意图:”此条件必须成立。”

ASSERT vs 基于 IF 的检查

1
2
3
4
5
6
7
" 基于 IF(冗长)
IF sy-subrc <> 0.
MESSAGE 'Unexpected error' TYPE 'X'. " 或 RAISE EXCEPTION
ENDIF.

" ASSERT(简洁)
ASSERT sy-subrc = 0.

LOG-POINT 语句

1
2
3
4
5
" 基本日志点
LOG-POINT ID zcg_log.

" 带 FIELDS 记录数据
LOG-POINT ID zcg_log FIELDS lv_status lt_keys.
规则 详情
必须有 ID 日志点要求检查点组
CONDITION 日志点是无条件的(激活时)
记录到 事务 SAAB 日志
📌LOG-POINT 始终需要 ID group。与断点不同,日志点不能在没有检查点组的情况下使用。

检查点组(事务 SAAB)

检查点组集中控制所有三种检查点类型的激活。

激活状态

检查点类型 不活跃 中断 日志 中止
断点 无效果 调试器启动 记录 不适用
断言 无效果 调试器启动 记录 短转储
日志点 无效果 不适用 记录 不适用
1
2
3
4
5
6
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)

相关笔记