如何正确使用全局测试类?

2020-09-02 14:09发布

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

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


在一个项目中,我们设计了一个类。 我们称之为Z_MYCLASS。 我们希望一个人来编写代码,一个人来编写本地单元测试类中的测试方法。 不幸的是,这一次无法起作用,因为第一个更改类的人将其锁定,因此第二个用户无法再更改它。

没问题,我想:这就是全局测试类的目的。 因此,我们创建了一个全局测试类,并将一个现有的单元测试复制到该类中。

但是当我运行单元测试时,我得到消息:

全局测试类[Z_MYCLASS_TEST]不是抽象的

好。 将这个测试类抽象化没有问题。 所以我做了。 但是之后,我收到以下消息:

已处理:0个程序,0个测试类,0个测试方法

我找到了以下文档:正确使用全局测试类

我的期望是使用F_CUT TYPE REF TO Z_MYCLASS创建具有某些单元测试方法的全局测试类。

如前所述,它不能很好地工作...:(

 class Z_MYCLASS_TEST定义
   上市
   抽象
   最后
   建立公众
   用于检测
   持续时间短
   风险水平无害。

   公共部分。
   受保护的部分。
   专用部分。
     数据f_cut类型参考z_myclass。
     方法设置。
     方法check_between_1_and_6进行测试。
 ENDCLASS。

 CLASS Z_MYCLASS_TEST实施。
   方法check_between_1_and_6。

     数据随机结果TYPE i。
     DATA is_between_1_and_6 TYPE abap_bool。
     做1000次。
       randomresult = f_cut-> generate_random()。
       is_between_1_and_6 = COND#(当1和6之间的随机结果
         然后abap_true
         否则abap_false)。
       cl_abap_unit_assert => assert_equals(
         出口
           行为= is_between_1_and_6
           exp = abap_true)。
     ENDDO。

   终结法。

   方法设置。
     f_cut = z_myclass => factory(seed = 1)。
   终结法。

 ENDCLASS。

但是我不知道如何设置测试类以对另一个类进行一些单元测试。

感谢您的帮助...

谢谢

Enno

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

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


在一个项目中,我们设计了一个类。 我们称之为Z_MYCLASS。 我们希望一个人来编写代码,一个人来编写本地单元测试类中的测试方法。 不幸的是,这一次无法起作用,因为第一个更改类的人将其锁定,因此第二个用户无法再更改它。

没问题,我想:这就是全局测试类的目的。 因此,我们创建了一个全局测试类,并将一个现有的单元测试复制到该类中。

但是当我运行单元测试时,我得到消息:

全局测试类[Z_MYCLASS_TEST]不是抽象的

好。 将这个测试类抽象化没有问题。 所以我做了。 但是之后,我收到以下消息:

已处理:0个程序,0个测试类,0个测试方法

我找到了以下文档:正确使用全局测试类

我的期望是使用F_CUT TYPE REF TO Z_MYCLASS创建具有某些单元测试方法的全局测试类。

如前所述,它不能很好地工作...:(

 class Z_MYCLASS_TEST定义
   上市
   抽象
   最后
   建立公众
   用于检测
   持续时间短
   风险水平无害。

   公共部分。
   受保护的部分。
   专用部分。
     数据f_cut类型参考z_myclass。
     方法设置。
     方法check_between_1_and_6进行测试。
 ENDCLASS。

 CLASS Z_MYCLASS_TEST实施。
   方法check_between_1_and_6。

     数据随机结果TYPE i。
     DATA is_between_1_and_6 TYPE abap_bool。
     做1000次。
       randomresult = f_cut-> generate_random()。
       is_between_1_and_6 = COND#(当1和6之间的随机结果
         然后abap_true
         否则abap_false)。
       cl_abap_unit_assert => assert_equals(
         出口
           行为= is_between_1_and_6
           exp = abap_true)。
     ENDDO。

   终结法。

   方法设置。
     f_cut = z_myclass => factory(seed = 1)。
   终结法。

 ENDCLASS。

但是我不知道如何设置测试类以对另一个类进行一些单元测试。

感谢您的帮助...

谢谢

Enno

付费偷看设置
发送
10条回答
哎,真难
1楼-- · 2020-09-02 14:35

如您所参考的文档所述: ABAP单元的基本概念要求测试和测试代码驻留在同一程序中

测试类必须是要测试的类池的一部分(作为本地类)。 测试类可以是全局的原因是为了允许代码重用。

您可以做的是从Z_MYCLASS_TEST中删除FINAL属性,并在继承自Z_MYCLASS_TEST的Z_MYCLASS中声明一个空的本地测试类。

 CLASS my_local_test从z_myclass_test继承以测试持续时间短的风险等级。
 ENDCLASS。
 

现在,如果在Z_MYCLASS上执行单元测试,则由于继承会调用在Z_MYCLASS_TEST中定义的测试方法。

(我不确定这是正确的方法,但是 从技术的角度来看,它应该起作用。)

暮风yp
2楼-- · 2020-09-02 14:42

您读过TDD文档吗? 测试驱动开发

这意味着:

首先编写测试,然后编写代码。

我认为在现实生活中可以做的是:

-与团队一起定义逻辑,程序/类的结构(高级设计)

-创建所需的接口并修复输入/输出

-创建类(空)

-创建Abap单元

- 类

我认为,如果您已创建程序的squeleton和Abap Unit部分,则可以在单独的部分中工作而不会出现问题。 问题仅在于单元测试的创建

,但是我认为在现实生活中同时创建单元测试和测试是一个坏主意

第二点, 单元测试对生产代码和生产代码的影响单元测试。 因此,这是一个循环..

大简至美
3楼-- · 2020-09-02 14:24

不能直接测试全局测试类,这就是为什么它必须被抽象的原因。 您必须使用继承全局测试类的本地测试类。

如果全局测试类(CHECK_BETWEEN_1_AND_6)中有一个测试方法,并且您想从本地测试类运行它,则必须 在PROTECTED或PUBLIC部分的全局类中声明它。 如果在专用部分中放置它,它将永远不会运行。 或仅在本地测试类中声明测试方法。

SETUP方法在全局测试类中没有意义(与其他夹具方法相同)。 仅执行本地测试类中的SETUP方法。 解决方法:创建一种从本地测试类的SETUP调用的"全局设置"方法。

clever101
4楼-- · 2020-09-02 14:19

嗨,弗雷德里克,

感谢您的建议! 您当然是对的:我们的方法已不再是过去。 但是我们在一个dojo中进行编码,因此需要在该类上同时工作。 "程序员"必须对类进行一些更正(重新命名,漂亮的打印,文档等),而"测试人员"必须准备一些单元测试。 即使在流程上并没有多大意义,我们也希望找出哪些单元测试有用并进行编码。

大道至简
5楼-- · 2020-09-02 14:20

感谢您的帮助Frederic Girod Sandra Rossi

(针对我的方法)设置全局测试类的解决方案似乎是:

  1. 创建全局抽象测试类
  2. 创建用于实例化F_CUT的 private 方法设置
  3. 创建一些 public 测试方法
  4. 创建具有继承全局变量的本地测试类 测试类

全局类

 CLASS z_myclass_test定义
   上市
   抽象
   创建公共
   用于检测
   持续时间短
   风险等级危害。

   公共部分。
     方法check_something用于测试。
   专用部分。
     数据f_cut类型参考z_myclass。  "(z_myinterface)
     方法设置。
 ENDCLASS。

 CLASS z_myclass_test IMPLEMENTATION。

   方法设置。
     f_cut =新的#()。
   终结法。

   方法check_something。
     cl_abap_unit_assert => assert_equals(
       行为= f_cut-> method_to_test()
       exp ='something')。
   终结法。

 ENDCLASS。

本地测试类

 CLASS lcl_testclass定义
   从z_myclass_test继承
   用于检测
   危险等级危害
   持续时间短。
 ENDCLASS。

这非常合适,因为使用此设置,我可以使用自己的测试方法创建多个全局测试类。 这是我一直很烦的一件事:在"本地测试类"这一部分中创建了多个非常复杂的本地测试类和测试方法。 当在一个"文件"中为各种不同的测试类提供数百行代码时,它的排列方式不是很好。通过这种方法,我可以区分不同的测试类。

非常感谢!

jovirus
6楼-- · 2020-09-02 14:23

感谢GáborMárián为您提供答案! 似乎我只是一个人认识到了。 ;)

是的, ABAP单元的基本概念要求测试和测试代码驻留在同一程序中

我在下面的解决方案中,如果有多个测试类,这可能会很混乱。

一周热门 更多>