如何正确使用TEST-SEAM进行单元测试?含代码场景疑问
关于check_adr方法测试的TEST-SEAM使用及IF分支处理
TEST-SEAM的使用是否正确?
用TEST-SEAM包裹SELECT语句是完全正确的做法。这段SELECT依赖数据库表ADRC,单元测试的核心是隔离外部依赖,避免真实数据库数据波动影响测试结果。通过TEST-SEAM+TEST-INJECTION,你可以在测试类中直接模拟SELECT的返回结果,精准控制测试场景。
IF语句的处理方式
IF语句属于业务逻辑分支,不需要用TEST-SEAM包裹,而是通过构造不同的测试输入和模拟的依赖返回值,覆盖所有分支场景:
- 分支1:lv_addrnum_dd为空:测试时直接将
lv_addrnum_dd设为初始值,此时代码会跳过整个IF块,验证方法是否正常执行且不修改rv_chk。 - 分支2:lv_addrnum_dd不为空,且lt_addr中存在该地址:通过TEST-INJECTION注入包含
lv_addrnum_dd的lt_addr,验证代码不会设置rv_chk,也不会提前返回。 - 分支3:lv_addrnum_dd不为空,但lt_addr中不存在该地址:注入不包含
lv_addrnum_dd的lt_addr,验证代码会将rv_chk设为abap_true并提前返回。
测试代码示例
以下是本地测试类的简化实现,覆盖上述三个场景:
CLASS ltc_check_adr DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. PRIVATE SECTION. METHODS test_no_dd_addr FOR TESTING. METHODS test_dd_addr_not_found FOR TESTING. METHODS test_dd_addr_found FOR TESTING. ENDCLASS. CLASS ltc_check_adr IMPLEMENTATION. METHOD test_dd_addr_not_found. DATA(lv_addrnum_dd) = '12345'. DATA(lv_addrnum_pbd) = '67890'. DATA(rv_chk) = abap_false. " 注入SEAM,模拟SELECT仅返回PBD地址 TEST-INJECTION selection. DATA(lt_addr) = VALUE #( ( addrnumber = lv_addrnum_pbd ) ). END-TEST-INJECTION. " 调用被测试方法 check_adr( EXPORTING iv_addrnum_dd = lv_addrnum_dd iv_addrnum_pbd = lv_addrnum_pbd IMPORTING rv_chk = rv_chk ). " 断言结果符合预期 cl_abap_unit_assert=>assert_true( EXPORTING act = rv_chk msg = 'DD地址不存在时,rv_chk应设为abap_true' ). ENDMETHOD. METHOD test_dd_addr_found. DATA(lv_addrnum_dd) = '12345'. DATA(lv_addrnum_pbd) = '67890'. DATA(rv_chk) = abap_true. " 注入SEAM,模拟SELECT返回两个地址 TEST-INJECTION selection. DATA(lt_addr) = VALUE #( ( addrnumber = lv_addrnum_dd ) ( addrnumber = lv_addrnum_pbd ) ). END-TEST-INJECTION. check_adr( EXPORTING iv_addrnum_dd = lv_addrnum_dd iv_addrnum_pbd = lv_addrnum_pbd IMPORTING rv_chk = rv_chk ). cl_abap_unit_assert=>assert_false( EXPORTING act = rv_chk msg = 'DD地址存在时,rv_chk应保持abap_false' ). ENDMETHOD. METHOD test_no_dd_addr. DATA(lv_addrnum_dd) = space. DATA(lv_addrnum_pbd) = '67890'. DATA(rv_chk) = abap_true. " 注入SEAM,模拟SELECT返回空表 TEST-INJECTION selection. DATA(lt_addr) = VALUE #( ). END-TEST-INJECTION. check_adr( EXPORTING iv_addrnum_dd = lv_addrnum_dd iv_addrnum_pbd = lv_addrnum_pbd IMPORTING rv_chk = rv_chk ). cl_abap_unit_assert=>assert_false( EXPORTING act = rv_chk msg = 'lv_addrnum_dd为空时,rv_chk应保持abap_false' ). ENDMETHOD. ENDCLASS.
内容的提问来源于stack exchange,提问作者Alexander Chebotarev
相关产品推荐
相关产品推荐

