使用 ABAP 测试主控室提高代码质量
学习目标
创建 ATC 检查变式。
使用 ATC 执行静态代码检查。
静态代码检查
语法检查 - 扩展检查 - ABAP 测试主控室
ABAP 开发具有多个用于执行静态代码检查的工具。

语法检查
在激活 ABAP 代码 之前,必须执行 语法检查 。如果不手动执行语法检查,则开发环境会在激活期间隐式执行。如果存在语法错误,则无法激活。最初,ABAP 语法检查仅报告语法错误。现在,语法检查还会发出语法警告。错误和警告之间的主要区别在于警告不会阻止激活。尽管如此,您也不应该轻视警告。这样做可能会导致严重问题,包括性能问题、数据不一致甚至运行时错误。
扩展检查
由于 ABAP 的历史记录很早,可选源代码检查补充了强制语法检查。扩展检查与激活无关,并且对其没有影响。开发人员可以自由决定是否要调用扩展检查以及如何处理其结果。
注意
在 ABAP 开发工具 (ADT) 中,扩展检查不是其自己的工具。它仅作为 ABAP 测试主控室的一部分提供。
ABAP 测试主控室
当发现扩展检查对于现代 ABAP 开发而言过于受限和不灵活时,已替换为 ABAP 测试主控室 (ATC)。ATC 提供了大量检查,包括性能检查和安全检查、合规性检查、指南和编程规则。为了在新检查工具中同时提供扩展检查的功能,它将作为许多检查之一集成到 ATC 中。
ATC 检查变式
ATC 检查变式
ATC 检查的每次执行由 ATC 检查变式控制。检查变式确定执行哪些检查,并为检查的参数提供值。

执行 ATC 检查运行时,可以使用系统的全局缺省检查变式,也可以指定要使用的检查变式。这可以是现有检查变式,也可以是您自己创建的检查变式。
从技术角度来看,ATC 检查变式是 ABAP 开发对象。它们属于开发包,您可以将其传输到其他系统。
如何创建 ATC 检查变式
在此演示中,我们创建 ATC 检查变式以指定要执行的检查。
视频:本节含 SAP 官方视频(视频 ID
1_8gltbshz),需在 learning.sap.com 在线观看。
如何运行 ATC 检查并分析结果
在此演示中,您将看到如何对 ABAP 类执行 ABAP 测试主控室检查运行并分析结果。
视频:本节含 SAP 官方视频(视频 ID
1_u0d9rt7a),需在 learning.sap.com 在线观看。
伪注释和编译指示指令
伪注释和编译指示指令

并非所有 ABAP 测试主控室查找结果都是关键结果,您可能会决定忽略这些结果。有些可能更仔细地看到假警报。此类错误报警的一个示例是变量的动态使用,对静态代码检查不可见。
ATC 有两种技术可以禁止查找结果:
伪注释 通过在源代码行末尾添加特定注释及查找结果,可以禁止某些 ATC 结果。在示例中,使用伪注释 "#EC NEEDED。在这种情况下,EC 代表扩展检查。 与任何其他注释一样,伪注释对 ABAP 语法检查和 ABAP 编译器不可见。我们将其称为伪注释,因为它对扩展检查和 ATC 有影响。
Pragmas 可通过将以 ## 开头的特定关键字添加到 ABAP 语句来禁止其他查找结果。这些关键字称为编译指示指令。编译指示指令位于 ABAP 语句内,而不是置于语句之后,这一点非常重要。在该示例中,使用 pragma
##needed,它位于结束 DATA 语句的句点符号之前。
注意
由于编译指示指令对语法检查可见,因此它们还用于禁止语法检查中的某些警告。对于伪注释无法执行此操作。
如果要了解是否可以禁止给定 ATC 结果,请参阅 ATC 问题 视图中的结果详细信息。在此,您还可以找到有关应使用的技术的信息。
复制和了解模板类
您想要提高 ABAP 编程技能。准备 ABAP 开发环境、创建新包并复制模板类。
模板:
/LRN/CL_S4D401_ATT_TEMPLATE(全局类)
解决方案:
无
前提条件
如果要按照本课程所述进行练习,则需要访问专用的实践练习系统。如果已为学习之旅的第一部分预订系统获取核心 ABAP 技能,则可以继续使用此系统。如果您尚未预订实践练习系统,请单击此链接获取详细信息:https://learning.sap.com/practice-systems/intermediate-abap-programming。
除了在预订流程中收到的 ABAP 服务实例 URL 外,还需要本地安装 Eclipse IDE,并在顶部安装 ABAP 开发工具插件。点击此链接获取分步说明 https://developers.sap.com/tutorials/abap-install-adt.html。
任务 1: 准备
在 Eclipse 中,创建 ABAP 云项目并将包 /LRN/S4D401_EXERCISE 添加到收藏包的列表中。在 ABAP 云项目中,在父包 ZSTUDENTS(建议名称:ZS4D401_##,其中 ## 是您的组编号)下创建新包,并将其添加到收藏包。
步骤
打开 Eclipse,切换到 ABAP 透视图并创建 ABAP Cloud 项目。
注意
如果您刚刚完成了学习基本 ABAP 编程课程,并且已在 Eclipse 中打开 ABAP Cloud 项目,则可以跳过此步骤。
打开 Eclipse 并关闭所有标签。
选择 窗口→透视图→打开透视图→其他... 。
在对话框中,双击 ABAP。
选择 文件→新建→ABAP 云项目 。
在出现的新建 ABAP 云项目对话框中执行以下操作: 如果已为您提供 ABAP 服务实例 URL:
将此 URL 复制并粘贴到对话框的相应字段中。
选择 下一步 。 如果已为您提供包含服务密钥的文件:
在对话框中选择 提取 链接。
选择 导入... ,然后选择具有 服务密钥 的文件。
导入后,单击 复制到剪贴板 ,复制 服务实例 URL 。
选择 关闭 。
在 ABAP 服务实例 URL:* 字段的弹出框顶部,粘贴 ABAP 服务实例 URL 以及组合键 Ctrl + V 。
选择 下一步 。
选择在浏览器中打开登录页面。
系统将提示您登录系统。 输入用于注册 SAP Learning Hub 的用户名和密码。
当您看到消息您已成功登录时,请关闭浏览器窗口并返回到 Eclipse。
要完成项目创建,请选择完成。
将包
/LRN/S4D401_EXERCISE添加到收藏包列表。在左侧的项目浏览器中,展开 ABAP Cloud 项目。
右键单击 收藏包 ,然后选择 添加包....
在搜索字段中,输入
/LRN/S4D401。从匹配项目列表中选择 /LRN/S4D401_EXERCISE,然后选择确定。
在 ABAP Cloud 项目中,使用以下属性创建新包。系统提示您进行传输时,请选择您所涉及的传输请求。如果未列出传输请求,则创建新请求。 | 属性 | 值 | | --- | --- | | 名称 |
ZS4D401_##,其中##是您的组编号 | | 描述 |中间 ABAP 编程| | 添加到收藏包 | 已选中 | | 超级包 |ZSTUDENTS|在项目浏览器中,右键单击 ABAP 云项目并选择 新建→ABAP 包 。
输入包名称 **
ZS4D401_## ,**其中##是您的组编号。输入描述
中间 ABAP 编程。选中添加到收藏包复选框。
输入父包
ZSTUDENTS。选择下一步。
选择下一步。
检查选项 从我参与的请求中选择 下是否列出了传输请求。如果是这种情况,请选择此选项。如果清单为空,请选择创建新申请选项并输入申请描述,例如**
练习 S4D401 - 学生 ##** (其中##是您的组编号)。选择完成。
任务 2: 复制和分析模板
创建全局类 /LRN/CL_S4D401_ATT_TEMPLATE 的副本。将副本命名为 ZCL_##_SOLUTION 并将其添加到您的包 ZS4D401_## 。
提示
复制模板类时,还将复制原始描述,即模板 - 起点。如果要更改已复制类的此描述,可以通过属性视图执行此操作。为此,在此视图中选择常规标签,并相应地调整描述字段的内容。不要忘记保存更改。
步骤
将类
/LRN/CL_S4D401_ATT_TEMPLATE复制到您自己的包中的类(建议名称:ZCL_##_SOLUTION,其中 ## 代表组编号)。打开全局类
/LRN/CL_S4D401_ATT_TEMPLATE的源代码。将项目浏览器视图与编辑器链接。
在项目浏览器视图中,右键单击类
/LRN/CL_S4D401_ATT_TEMPLATE以打开上下文菜单。从上下文菜单中,选择复制....
在包字段中输入包的名称。在名称字段中,输入
ZCL_##_SOLUTION,其中 ## 代表组编号。选择下一步。
确认传输请求并选择完成。
分析代码。
提示
使用 ABAP 语言帮助 ( F1) 和代码元素信息 ( F2 ) 获取有关语句和代码元素的信息。- 如有必要,导航到代码元素的定义(F3 或 Strg + 左键单击)。
激活类并将其作为控制台应用执行。
提示
请耐心等待,应用程序需要一些时间才能运行。(请注意 eclipse 窗口右下角的绿色进度标识。)绩效是我们在本课程中要改进的内容之一。
按
Ctrl + F3激活类。按
F9以控制台应用身份执行类。
使用 ABAP 测试主控室执行代码分析
您注意到代码输出不正确。特别是,尽管可用座位数大于零,但控制台为最大座位和已占用座位显示相同数量。为 ABAP 测试主控室创建检查变式并将其用于分析代码。
模板:
/LRN/CL_S4D401_ATT_TEMPLATE(全局类)
解决方案:
/LRN/S4D401_ATS_VARIANT(检查变式)
/LRN/CL_S4D401_ATS_CHECKED(全局类)
任务 1: 创建检查变式
在您的包中,创建新的检查变式(建议名称:Z##_VARIANT,其中 ## 是您的组编号)。配置检查变式以执行类别*为扩展程序检查 (SLIN)*的所有检查。
提示
缺省情况下,扩展程序检查 (SLIN) 仅执行可用检查的子集。
步骤
创建新的 ATC 检查变式。
在左侧的项目浏览器中,右键单击您的包并选择 新建→其他 ABAP 资源库对象 。
在过滤器字段中,键入
atc。选择 ATC 检查变式,然后选择下一步。
为名称输入
Z##_VARIANT并为描述输入**扩展程序检查**,然后选择下一步。确认传输请求并选择完成。
在 ATC 检查变式中包括 ATC 检查扩展程序检查 (SLIN)。
在 ATC 检查变式左侧的 ATC 检查部分中,展开节点语法和激活。
选择扩展程序检查 (SLIN) 。
编辑 ATC 检查扩展程序检查 (SLIN) 的参数。将参数 StandardOrCustom 的值设置为
2,并确保所有其他参数的值均为true。左键单击扩展程序检查 (SLIN) 以在右侧的 ATC 检查详细信息部分打开此 ATC 检查。
在 ATC 检查详细信息部分中,选择参数标签以显示此检查的参数。
将 StandardOrCustom 参数的值从
1更改为2。向下滚动列表,并在必要时将其余参数的值从
false更改为true。激活检查变式。
按
Ctrl + F3激活检查变式。
任务 2: 改进代码
使用检查变式 Z##_VARIANT,对您在上一练习中创建的类 ZCL_##_SOLUTION 执行静态代码检查。分析查找结果并在必要时更正代码。
步骤
使用检查变式 Z##_
VARIANT对类ZCL_##_SOLUTION执行检查。右键单击类源代码的任意位置,然后选择运行方式→ABAP 测试主控室使用... 。
输入检查变式的名称 (
Z##_VARIANT),然后选择确定。
注意
异步执行该检查。等待右下角的绿色条消失。
选择 ABAP 编辑器下方的 ATC 问题 视图以显示检查结果。
分析结果并修复与 SEATS_OCC 字段相关的警告。
提示
您知道如果代码正确,属性 SEATS_MAX、SEATS_OCC 和 SEATS_FREE 将用于同一位置。
查找警告未执行字段 SEATS_OCC 的读取。
双击警告以导航到源代码。
将光标置于属性
SEATS_MAX上,然后从工具栏中选择获取使用位置清单。或者,您可以按Ctrl + Shift + G。从使用位置清单中,您可以看到其中一个 APPEND 语句错误地使用
SEATS_MAX属性,而不是SEATS_OCC属性。双击调用清单中的匹配项
APPEND |Occupied Seats: { seats_max }| TO r_result.以导航到相应的语句。将 APPEND 语句中的
SEATS_MAX替换为SEATS_OCC以修复该问题。修复与 CURRENCY_CODE 字段相关的结果。
提示
您知道 CURRENCY_CODE 属性尚未使用,但您希望将其保留以供未来开发。因此,使用编译指示指令隐藏此警告。
返回到 ATC 问题 视图。
查找有关字段 CURRENCY_CODE 的警告未执行读取。
选择警告以显示警告详细信息。
在右侧的"详细信息"部分中,找到以"查找结果可以禁止"的语句....
双击警告以导航到源代码。
按如下所示调整 DATA 语句:
DATA currency_code TYPE /dmo/currency_code ##NEEDED.
激活类并重复代码检查以验证两个警告是否已消失。
注意
目前,我们将忽略其他结果。本课程后面的部分将介绍这些内容。
按
Ctrl + F3激活类。返回到 ATC 问题 视图。
右键单击任意查找结果以打开上下文菜单。
从上下文菜单中,选择重新检查。