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