语句 TEST-SEAM 引入了一个称为 seam 的测试 SEAM,它由 END-TEST-SEAM 关闭。 当前程序的测试类(test class)可以使用语句 TEST-INJECTION 将语句块 statement_block 替换为在那里定义的注入。如果没有对 test seam 执行注入,则执行原始代码。

test seam 具有以下属性:

  • 可以在单个编译单元中定义多个 test seam,但每个 test seam 必须具有唯一的名称。
  • 一般命名约定适用于名称接缝。
  • test seam 不能嵌套,这意味着 test seam 不能包含更多 test seam.
  • test seam 不能超出语句块的限制,但可以包含封闭的控制结构。
  • test seam 可以包含数据声明。 这些声明在执行注入时不会被替换,并在其上下文中保持可见。
  • test seam 可以在程序的全局声明部分定义,但不能在类的声明部分定义。
  • test seam 可以是空的,也就是说,它不包含任何语句。 取而代之的是 injection.
  • test seam 不能在测试类中定义。

test seam 的注入必须在同一个编译单元中定义。

只能在当前程序的测试包含中定义的测试类中创建注入。 测试包含目前只能在类池和函数池中使用。 这意味着 test seam 仅在类池和函数池中可行。

看个具体的例子。类 CL_DEMO_TEST_SEAMS 是生产代码。

CHANGE_PRICE 方法将数据库表 SFLIGHT 中的航班价格乘以一个系数,如果成功,则返回修改后的价格。如果数据库访问失败,将返回一个特定的无效值而不是计算后的价格。

为两个数据库访问定义了 test seam. 这使得在不访问实际数据的情况下运行单元测试成为可能。

生产类的完整源代码:

CLASS cl_demo_test_seams DEFINITIONPUBLICFINALCREATE PUBLIC .PUBLIC SECTION.METHODS change_priceIMPORTING!carrid          TYPE sflight-carrid!connid          TYPE sflight-connid!fldate          TYPE sflight-fldate!factor          TYPE iEXPORTINGVALUE(new_price) TYPE sflight-price .PROTECTED SECTION.PRIVATE SECTION.DATA subrc TYPE sy-subrc .
ENDCLASS.CLASS CL_DEMO_TEST_SEAMS IMPLEMENTATION.* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method CL_DEMO_TEST_SEAMS->CHANGE_PRICE
* +-------------------------------------------------------------------------------------------------+
* | [--->] CARRID                         TYPE        SFLIGHT-CARRID
* | [--->] CONNID                         TYPE        SFLIGHT-CONNID
* | [--->] FLDATE                         TYPE        SFLIGHT-FLDATE
* | [--->] FACTOR                         TYPE        I
* | [<---] NEW_PRICE                      TYPE        SFLIGHT-PRICE
* +--------------------------------------------------------------------------------------</SIGNATURE>METHOD change_price.DATA wa TYPE sflight.TEST-SEAM selection.SELECT SINGLE *FROM sflightWHERE carrid = @carrid ANDconnid = @connid ANDfldate = @fldateINTO @wa.subrc = sy-subrc.END-TEST-SEAM.IF subrc <> 0.new_price = -1.RETURN.ENDIF.wa-price = wa-price * factor / 100.TEST-SEAM modification.MODIFY sflight FROM @wa.subrc = sy-subrc.END-TEST-SEAM.IF subrc = 0.new_price = wa-price.ELSE.new_price = -2.ENDIF.ENDMETHOD.
ENDCLASS.

正常情况下,我们直接执行到 TEST-SEAM 定义的 selection 代码块内。

执行这个生产类的单元测试代码时,ABAP 框架执行到生产类代码的 selection 区块,检测到这个类的单元测试代码里定义了同名的 injection,于是就用测试代码 injection 区块里的代码块,替换原始的 selection 区块的代码进行执行。

如下图所示,第 16 行就是 名为 selection 的 TEST-INJECTION, 该测试代码得以执行。

ABAP TEST-SEAM 的使用方法相关推荐

  1. 在ABAP中将负号提前的方法

    在ABAP中将负号提前的方法 第一种: PERFORM. change_qty USING l_srqty CHANGING it_inv-srqty. FORM. change_qty USING ...

  2. 解除ABAP程序编辑锁的方法

    方法1:在已有SE38创建修改权限的情况下 REPORT ZUNLOCK.TABLES: TRDIR. "System table TRDIRPARAMETERS: PROGRAM LIKE ...

  3. ABAP动态取得数据的方法

    ABAP动态查询的实现:可以完全实现动态查询,每个字段都可以动态. (1)        利用宏 (2)        利用abap指针 (3)        利用FIELD-SYMBOL 具体实现: ...

  4. 最浅显易懂的 SAPGUI 里 ABAP 调试器的使用方法介绍

    本文介绍 SAPGUI 里 ABAP 调试器的用法.我们编写的 ABAP 程序,如果执行遇到问题,可以使用 ABAP 调试器,采用单步排错的方式进行调试. 我们使用下面这个简单的 ABAP 程序作为例 ...

  5. ABAP workbench API的使用方法

    该报表演示了如何用ABAP代码实现SE80事务码里的资源创建工作. REPORT ZCREATE. data: lr_tool TYPE REF TO ZCL_PRODUCT_WB_ACCESS,lr ...

  6. GS01创建信息集及其他GROUP在ABAP程序中的调用方法

    1.函数'G_SET_GET_ALL_VALUES'使用 实例 DATA: t_set_values TYPE TABLE OF rgsb4. DATA: wa_set_values LIKE LIN ...

  7. abap中ROUND 函数使用方法

    文章目录 1 Introduction 2 Code Example 1 Introduction ROUND Function is rounding up, rounding down. it i ...

  8. ABAP 行列转换的方法

    正文部分 有人问:马蹄能给个行列转换的例子吗 我:百度很多吧,找找看 回:百度来的没看懂啊 我:好吧,写个例子 很久没用在博客里发代码了,发个行列转换的例子 其实理解原理就好,就是获取到行,然后动态的 ...

  9. 面向对象的 ABAP 编程初探 - 什么是类,实例,和 Public 方法

    本教程前面的文章ABAP 如何解析 JSON 数据 我们介绍了 SAP 提供的一个工具类 /UI2/CL_JSON,用于进行 JSON 格式的数据读取. 打开事物码 SE24,这是 SAP ABAP ...

  10. 《SAP ABAP 开发入门》课程正式发布

    首先,课程还没有全部做完,这次课程采用的是连载的方式,目前已经完成第二章共计8个课时.以后打算每周至少更新2个课时,在每周三和周六必定更新.当然如果时间允许的话,我会加快课程的制作. 课程购买地址 & ...

最新文章

  1. [zz]用U盘装win7/XP系统的操作[图解]
  2. PHP写sqlserver事务,php调用sqlserver存储过程使用事务处理
  3. js 获取url多个参数
  4. java字节码运行原理_JVM 内部原理(六)— Java 字节码基础之一
  5. 挂载硬盘问题:mount: wrong fs type, bad option, bad superblock on /dev/sdb,
  6. usb连接不上 艾德克斯电源_STM32F7 电源控制器(PWR)
  7. Java 方法使用final 修饰参数的作用
  8. python3编码(encode,decode)
  9. 计算机中是如何存储图片的,电脑如何保存图片
  10. ubuntu18.04下载显卡驱动+CUDA+CUDNN
  11. 怎么把图片用手机进行压缩?来试试这两个工具
  12. Livezilla安装配置, APE(Ajax Push Engine)安装配置
  13. 测试基础知识1 》》软件测试入门
  14. html+css+js制作点名器
  15. 伪元素写竖线_[CSS] 用伪元素:after实现分割线和气泡
  16. Python:爬山法/随机重启爬山法/允许侧移的爬山法解决八皇后问题
  17. 数字电路基础知识——乘法器的设计(二)( 串行、流水线、有符号数八位乘法器)
  18. 360个人图书馆 轻松解除网页防复制
  19. Unity制作RPG游戏——战斗注视LockOn实现方法
  20. 读书感受 之 《AI·未来》

热门文章

  1. Linux C编程一些函数汇总
  2. 随机生存森林算法在生存数据中的应用
  3. matlab prefourier,用matlab求单位阶跃函数的傅立叶变换fourier变换
  4. 使用阿里大鱼发送短信
  5. android9 SystemUI-NavigationBar
  6. 郑渊洁:我从1995年起就不信任一些疫苗
  7. 有功功率、无功功率、视在功率的定义及其之间的关系计算
  8. 得物容器SRE探索与实践
  9. 聚焦用户需求,英韧推出企业级SATA主控及解决方案
  10. 【考纲】2013年信息系统项目管理师(高级)考试大纲-刘俊平