尝试将ABAP单元测试添加到全局类中,但可以提供一些帮助

2020-08-26 19:01发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


人们好,

有些人知道我是挣扎与很多ABAP OO有关,因此,我很高兴我至少设法在沙盒系统中创建了一个应该执行的全局类,即 在将DDIC对象添加到传输之前执行一些检查。 这是该类及其方法的概述:

我现在想做的是添加一个测试类,以便对类中的各种方法进行单元测试。 所以,是的,我没有通过TDD创建代码,因为由于我与OO的基本争执而无法顺利完成,因为由于我仍然不了解和感到困惑,它会增加太多的复杂性。 但是,由于逻辑将位于非常重要的中心位置,因此我确实看到进行单元测试以确保将来的更改不会破坏代码的优点。

对于某些方法,这应该非常简单,因为它们仅需要验证导入参数并根据其内容返回abap_false或abap_true依赖项。 我认为(希望吗?)我可以借助在线找到的各种文档(例如 Joachim Rees 博客文章 James E. McDonough 和其他人的几篇文章和书籍(例如保罗·哈迪(Paul Hardy)的第5章,从ABAP到《未来》第3版。 后者也解释了为什么引入FRIENDS以便允许对私有方法进行单元测试是完全可以的,我对此表示完全同意! 我已经尝试确保方法通过导入参数而不是直接从sy-uname,sy-sysid和SYST中的其他字段中获取参数来获取所需的所有信息,以便单元测试可以使用除这些值之外的其他值(或 根本不需要吗?)。

我正在努力的是如何处理读取TADIR(GET_SRCSYSTEM_FROM_TADIR)和Z表(ENTRY_EXISTS_ZBC_DDIC_CHECK)的两个例程。 我知道我将不得不以某种方式"欺骗"单元测试以使用提供的数据进行播放,而不是实际读取表,但是我受制于如何正确地调整我的代码来做到这一点。

从阅读Paul的章节开始,我认为第一步是将这两种方法移入它们自己的全局类中,然后将它们公开而不是私有。 我迷路的地方在于决定在什么地方以及为什么要定义/编写代码。 那么,测试类中发生了什么?我该如何重写生产代码以允许"模拟"(或任何正确的用语)? 我认为我最困惑的是,全局类的接口定义在哪里可以进行测试。 这是"必须拥有"还是仅仅是"很高兴"?如果是前者,我需要在何处以及在何处进行?

不确定要回答这些问题需要哪些代码段,因此这里有一些TADIR SELECT的示例:

私人定义:

专用部分。
     ......
     方法source_system_okay_for_ddic
       输入
         i_transport_objects TYPE tr_objects
         i_sysid类型sy-sysid
       出口
         e_message TYPE bapiret2
       正在返回
         VALUE(r_correct_source_system)TYPE abap_bool。
     .....
     方法get_srcsystem_from_tadir
       输入
         i_transport_object类型e071
       正在返回
         VALUE(r_srcsystem)TYPE tadir-srcsystem。

从主例程开始

"现在检查DDIC系统是否是通过TADIR传输的所有对象的源系统
 如果source_system_okay_for_ddic(导出i_transport_objects = i_transport_objects
                                           i_sysid = i_sysid
                                 正在导入e_message = message)。
   "所有物品和运输都可以与物品一起保存
 其他。
   "传输中的至少一个对象尚未迁移到DDIC系统,并且消息
   "信息相应地填写了方法
   将消息添加到r_message。
 ENDIF。

来自SOURCE_SYSTEM_OKAY_FOR_DDIC

 METHOD source_system_okay_for_ddic。
     " -------------------------------------------------  ---------------------
     "方法SOURCE_SYSTEM_OKAY_FOR_DDIC(私有)
     " -------------------------------------------------  ---------------------
     "导入i_transport_objects TYPE tr_objects
     " i_sysid TYPE sy-sysid
     "导出e_message TYPE bapiret2
     "返回值(r_correct_source_system)类型abap_bool
     " -------------------------------------------------  ---------------------
     "默认的假设是该系统可以进行DDIC维护
     r_correct_source_system = abap_true。
     清除e_message。

     循环i_transport_objects到DATA(transport_object)。
       .....
       DATA(lv_srcsystem)= get_srcsystem_from_tadir(transport_object)。

       IF lv_srcsystem网元空间。
         ....
       万一。

     结局。

   ENDMETHOD。
 METHOD get_srcsystem_from_tadir。
     " -------------------------------------------------  ---------------------
     "方法ENTRY_EXISTS_ZBC_DDIC_CHECK(私有)
     " -------------------------------------------------  ---------------------
     "导入i_transport_object类型e071
     "返回值(r_srcsystem)TYPE tadir-srcsystem
     " -------------------------------------------------  ---------------------
     清除r_srcsystem。
     选择单个srcsystem
              INTO @r_srcsystem
              来自塔迪尔
             对象在哪里= @ i_transport_object-object
               AND obj_name = @ i_transport_object-obj_name(40)。
   ENDMETHOD。

有任何需要帮助的人吗? 并且请告诉我这是否不是最好的询问地点。

感谢与欢呼

贝尔贝尔

qaa-unittestingprep-01.jpg (71.7 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


人们好,

有些人知道我是挣扎与很多ABAP OO有关,因此,我很高兴我至少设法在沙盒系统中创建了一个应该执行的全局类,即 在将DDIC对象添加到传输之前执行一些检查。 这是该类及其方法的概述:

我现在想做的是添加一个测试类,以便对类中的各种方法进行单元测试。 所以,是的,我没有通过TDD创建代码,因为由于我与OO的基本争执而无法顺利完成,因为由于我仍然不了解和感到困惑,它会增加太多的复杂性。 但是,由于逻辑将位于非常重要的中心位置,因此我确实看到进行单元测试以确保将来的更改不会破坏代码的优点。

对于某些方法,这应该非常简单,因为它们仅需要验证导入参数并根据其内容返回abap_false或abap_true依赖项。 我认为(希望吗?)我可以借助在线找到的各种文档(例如 Joachim Rees 博客文章 James E. McDonough 和其他人的几篇文章和书籍(例如保罗·哈迪(Paul Hardy)的第5章,从ABAP到《未来》第3版。 后者也解释了为什么引入FRIENDS以便允许对私有方法进行单元测试是完全可以的,我对此表示完全同意! 我已经尝试确保方法通过导入参数而不是直接从sy-uname,sy-sysid和SYST中的其他字段中获取参数来获取所需的所有信息,以便单元测试可以使用除这些值之外的其他值(或 根本不需要吗?)。

我正在努力的是如何处理读取TADIR(GET_SRCSYSTEM_FROM_TADIR)和Z表(ENTRY_EXISTS_ZBC_DDIC_CHECK)的两个例程。 我知道我将不得不以某种方式"欺骗"单元测试以使用提供的数据进行播放,而不是实际读取表,但是我受制于如何正确地调整我的代码来做到这一点。

从阅读Paul的章节开始,我认为第一步是将这两种方法移入它们自己的全局类中,然后将它们公开而不是私有。 我迷路的地方在于决定在什么地方以及为什么要定义/编写代码。 那么,测试类中发生了什么?我该如何重写生产代码以允许"模拟"(或任何正确的用语)? 我认为我最困惑的是,全局类的接口定义在哪里可以进行测试。 这是"必须拥有"还是仅仅是"很高兴"?如果是前者,我需要在何处以及在何处进行?

不确定要回答这些问题需要哪些代码段,因此这里有一些TADIR SELECT的示例:

私人定义:

专用部分。
     ......
     方法source_system_okay_for_ddic
       输入
         i_transport_objects TYPE tr_objects
         i_sysid类型sy-sysid
       出口
         e_message TYPE bapiret2
       正在返回
         VALUE(r_correct_source_system)TYPE abap_bool。
     .....
     方法get_srcsystem_from_tadir
       输入
         i_transport_object类型e071
       正在返回
         VALUE(r_srcsystem)TYPE tadir-srcsystem。

从主例程开始

"现在检查DDIC系统是否是通过TADIR传输的所有对象的源系统
 如果source_system_okay_for_ddic(导出i_transport_objects = i_transport_objects
                                           i_sysid = i_sysid
                                 正在导入e_message = message)。
   "所有物品和运输都可以与物品一起保存
 其他。
   "传输中的至少一个对象尚未迁移到DDIC系统,并且消息
   "信息相应地填写了方法
   将消息添加到r_message。
 ENDIF。

来自SOURCE_SYSTEM_OKAY_FOR_DDIC

 METHOD source_system_okay_for_ddic。
     " -------------------------------------------------  ---------------------
     "方法SOURCE_SYSTEM_OKAY_FOR_DDIC(私有)
     " -------------------------------------------------  ---------------------
     "导入i_transport_objects TYPE tr_objects
     " i_sysid TYPE sy-sysid
     "导出e_message TYPE bapiret2
     "返回值(r_correct_source_system)类型abap_bool
     " -------------------------------------------------  ---------------------
     "默认的假设是该系统可以进行DDIC维护
     r_correct_source_system = abap_true。
     清除e_message。

     循环i_transport_objects到DATA(transport_object)。
       .....
       DATA(lv_srcsystem)= get_srcsystem_from_tadir(transport_object)。

       IF lv_srcsystem网元空间。
         ....
       万一。

     结局。

   ENDMETHOD。
 METHOD get_srcsystem_from_tadir。
     " -------------------------------------------------  ---------------------
     "方法ENTRY_EXISTS_ZBC_DDIC_CHECK(私有)
     " -------------------------------------------------  ---------------------
     "导入i_transport_object类型e071
     "返回值(r_srcsystem)TYPE tadir-srcsystem
     " -------------------------------------------------  ---------------------
     清除r_srcsystem。
     选择单个srcsystem
              INTO @r_srcsystem
              来自塔迪尔
             对象在哪里= @ i_transport_object-object
               AND obj_name = @ i_transport_object-obj_name(40)。
   ENDMETHOD。

有任何需要帮助的人吗? 并且请告诉我这是否不是最好的询问地点。

感谢与欢呼

贝尔贝尔

qaa-unittestingprep-01.jpg (71.7 kB)
付费偷看设置
发送

一周热门 更多>