美文网首页SAP 实用篇SAP
ABAP TEST-SEAM 的使用方法

ABAP TEST-SEAM 的使用方法

作者: _扫地僧_ | 来源:发表于2023-01-02 12:41 被阅读0次

    语句 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, 该测试代码得以执行。

    相关文章

      网友评论

        本文标题:ABAP TEST-SEAM 的使用方法

        本文链接:https://www.haomeiwen.com/subject/vxghcdtx.html