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