You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 06:49:56