语句 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 DEFINITION  PUBLIC  FINAL  CREATE PUBLIC .  PUBLIC SECTION.    METHODS change_price      IMPORTING        !carrid          TYPE sflight-carrid        !connid          TYPE sflight-connid        !fldate          TYPE sflight-fldate        !factor          TYPE i      EXPORTING        VALUE(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 sflight             WHERE carrid = @carrid AND                   connid = @connid AND                   fldate = @fldate             INTO @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, 该测试代码得以执行。