使用 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_##,其中 ## 是您的组编号)下创建新包,并将其添加到收藏包。

步骤

  1. 打开 Eclipse,切换到 ABAP 透视图并创建 ABAP Cloud 项目

注意

如果您刚刚完成了学习基本 ABAP 编程课程,并且已在 Eclipse 中打开 ABAP Cloud 项目,则可以跳过此步骤。

  1. 打开 Eclipse 并关闭所有标签。

  2. 选择 窗口透视图打开透视图其他... 。

  3. 在对话框中,双击 ABAP

  4. 选择 文件新建ABAP 云项目

  5. 在出现的新建 ABAP 云项目对话框中执行以下操作: 如果已为您提供 ABAP 服务实例 URL

  6. 将此 URL 复制并粘贴到对话框的相应字段中。

  7. 选择 下一步 。 如果已为您提供包含服务密钥的文件:

  8. 在对话框中选择 提取 链接。

  9. 选择 导入... ,然后选择具有 服务密钥 的文件。

  10. 导入后,单击 复制到剪贴板 ,复制 服务实例 URL 。

  11. 选择 关闭 。

  12. 在 ABAP 服务实例 URL:* 字段的弹出框顶部,粘贴 ABAP 服务实例 URL 以及组合键 Ctrl + V 。

  13. 选择 下一步 。

  14. 选择在浏览器中打开登录页面

  15. 系统将提示您登录系统。 输入用于注册 SAP Learning Hub 的用户名和密码。

  16. 当您看到消息您已成功登录时,请关闭浏览器窗口并返回到 Eclipse。

  17. 要完成项目创建,请选择完成

  18. 将包 /LRN/S4D401_EXERCISE 添加到收藏包列表。

  19. 在左侧的项目浏览器中,展开 ABAP Cloud 项目。

  20. 右键单击 收藏包 ,然后选择 添加包....

  21. 在搜索字段中,输入 /LRN/S4D401

  22. 从匹配项目列表中选择 /LRN/S4D401_EXERCISE然后选择确定

  23. 在 ABAP Cloud 项目中,使用以下属性创建新包。系统提示您进行传输时,请选择您所涉及的传输请求。如果未列出传输请求,则创建新请求。 | 属性 | 值 | | --- | --- | | 名称 | ZS4D401_## ,其中 ## 是您的组编号 | | 描述 | 中间 ABAP 编程 | | 添加到收藏包 | 已选中 | | 超级包 | ZSTUDENTS |

  24. 在项目浏览器中,右键单击 ABAP 云项目并选择 新建ABAP 包

  25. 输入包名称 **ZS4D401_## **其中 ## 是您的组编号。

  26. 输入描述 中间 ABAP 编程

  27. 选中添加到收藏包复选框。

  28. 输入父包 ZSTUDENTS

  29. 选择下一步

  30. 选择下一步

  31. 检查选项 从我参与的请求中选择 下是否列出了传输请求。如果是这种情况,请选择此选项。如果清单为空,请选择创建新申请选项并输入申请描述,例如**练习 S4D401 - 学生 ##** (其中 ## 是您的组编号)。

  32. 选择完成

任务 2: 复制和分析模板

创建全局类 /LRN/CL_S4D401_ATT_TEMPLATE 的副本。将副本命名为 ZCL_##_SOLUTION 并将其添加到您的包 ZS4D401_##

提示

复制模板类时,还将复制原始描述,即模板 - 起点。如果要更改已复制类的此描述,可以通过属性视图执行此操作。为此,在此视图中选择常规标签,并相应地调整描述字段的内容。不要忘记保存更改。

步骤

  1. 将类 /LRN/CL_S4D401_ATT_TEMPLATE 复制到您自己的包中的类(建议名称:ZCL_##_SOLUTION,其中 ## 代表组编号)。

  2. 打开全局类 /LRN/CL_S4D401_ATT_TEMPLATE 的源代码。

  3. 将项目浏览器视图与编辑器链接。

  4. 在项目浏览器视图中,右键单击类 /LRN/CL_S4D401_ATT_TEMPLATE 以打开上下文菜单。

  5. 从上下文菜单中,选择复制....

  6. 在包字段中输入的名称。在名称字段中,输入 ZCL_##_SOLUTION,其中 ## 代表组编号。

  7. 选择下一步

  8. 确认传输请求并选择完成

  9. 分析代码。

提示

  • 使用 ABAP 语言帮助 ( F1) 和代码元素信息 ( F2 ) 获取有关语句和代码元素的信息。- 如有必要,导航到代码元素的定义(F3 或 Strg + 左键单击)。

  1. 激活类并将其作为控制台应用执行。

提示

请耐心等待,应用程序需要一些时间才能运行。(请注意 eclipse 窗口右下角的绿色进度标识。)绩效是我们在本课程中要改进的内容之一。

  1. Ctrl + F3 激活类。

  2. F9 以控制台应用身份执行类。

使用 ABAP 测试主控室执行代码分析

您注意到代码输出不正确。特别是,尽管可用座位数大于零,但控制台为最大座位和已占用座位显示相同数量。为 ABAP 测试主控室创建检查变式并将其用于分析代码。

模板:

  • /LRN/CL_S4D401_ATT_TEMPLATE(全局类)

解决方案:

  • /LRN/S4D401_ATS_VARIANT(检查变式)

  • /LRN/CL_S4D401_ATS_CHECKED(全局类)

任务 1: 创建检查变式

在您的包中,创建新的检查变式(建议名称:Z##_VARIANT,其中 ## 是您的组编号)。配置检查变式以执行类别*为扩展程序检查 (SLIN)*的所有检查。

提示

缺省情况下,扩展程序检查 (SLIN) 仅执行可用检查的子集。

步骤

  1. 创建新的 ATC 检查变式。

  2. 在左侧的项目浏览器中,右键单击您的包并选择 新建其他 ABAP 资源库对象

  3. 在过滤器字段中,键入 atc

  4. 选择 ATC 检查变式,然后选择下一步

  5. 名称输入 Z##_VARIANT 并为描述输入**扩展程序检查**,然后选择下一步

  6. 确认传输请求并选择完成

  7. 在 ATC 检查变式中包括 ATC 检查扩展程序检查 (SLIN)

  8. ATC 检查变式左侧的 ATC 检查部分中,展开节点语法和激活

  9. 选择扩展程序检查 (SLIN)

  10. 编辑 ATC 检查扩展程序检查 (SLIN) 的参数。将参数 StandardOrCustom 的值设置为 2,并确保所有其他参数的值均为 true

  11. 左键单击扩展程序检查 (SLIN) 以在右侧的 ATC 检查详细信息部分打开此 ATC 检查。

  12. ATC 检查详细信息部分中,选择参数标签以显示此检查的参数。

  13. StandardOrCustom 参数的值从 1 更改为 2

  14. 向下滚动列表,并在必要时将其余参数的值从 false 更改为 true

  15. 激活检查变式。

  16. Ctrl + F3 激活检查变式。

任务 2: 改进代码

使用检查变式 Z##_VARIANT,对您在上一练习中创建的类 ZCL_##_SOLUTION 执行静态代码检查。分析查找结果并在必要时更正代码。

步骤

  1. 使用检查变式 Z##_VARIANT 对类 ZCL_##_SOLUTION 执行检查。

  2. 右键单击类源代码的任意位置,然后选择运行方式ABAP 测试主控室使用... 。

  3. 输入检查变式的名称 (Z##_VARIANT),然后选择确定

注意

异步执行该检查。等待右下角的绿色条消失。

  1. 选择 ABAP 编辑器下方的 ATC 问题 视图以显示检查结果。

  2. 分析结果并修复与 SEATS_OCC 字段相关的警告。

提示

您知道如果代码正确,属性 SEATS_MAX、SEATS_OCC 和 SEATS_FREE 将用于同一位置。

  1. 查找警告未执行字段 SEATS_OCC 的读取

  2. 双击警告以导航到源代码。

  3. 将光标置于属性 SEATS_MAX 上,然后从工具栏中选择获取使用位置清单。或者,您可以按 Ctrl + Shift + G

  4. 从使用位置清单中,您可以看到其中一个 APPEND 语句错误地使用 SEATS_MAX 属性,而不是 SEATS_OCC 属性。

  5. 双击调用清单中的匹配项 APPEND |Occupied Seats: { seats_max }| TO r_result. 以导航到相应的语句。

  6. 将 APPEND 语句中的 SEATS_MAX 替换为 SEATS_OCC 以修复该问题。

  7. 修复与 CURRENCY_CODE 字段相关的结果。

提示

您知道 CURRENCY_CODE 属性尚未使用,但您希望将其保留以供未来开发。因此,使用编译指示指令隐藏此警告。

  1. 返回到 ATC 问题 视图。

  2. 查找有关字段 CURRENCY_CODE 的警告未执行读取

  3. 选择警告以显示警告详细信息。

  4. 在右侧的"详细信息"部分中,找到以"查找结果可以禁止"的语句....

  5. 双击警告以导航到源代码。

  6. 按如下所示调整 DATA 语句:

DATA currency_code TYPE /dmo/currency_code ##NEEDED.
  1. 激活类并重复代码检查以验证两个警告是否已消失。

注意

目前,我们将忽略其他结果。本课程后面的部分将介绍这些内容。

  1. Ctrl + F3 激活类。

  2. 返回到 ATC 问题 视图。

  3. 右键单击任意查找结果以打开上下文菜单。

  4. 从上下文菜单中,选择重新检查