-对测试驱动开发中的消息处理的怀疑

2020-08-20 05:03发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)你好 我试图在一个非常简单的s...

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

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


你好

我试图在一个非常简单的se38程序中添加TDD,但遇到了一个问题,我尝试在论坛上进行谷歌搜索,但未找到解决方案。 因此,如果有人已经遇到了这个问题,那么请分享经验如何解决这一问题将对您有很大的帮助。

问题语句:在我的旧程序(不是基于OOP)中,在子例程中有一条message语句,这导致ABAP单元测试运行失败。

尝试了几种方法,到目前为止似乎没有成果。 每次它都会引发CX_AUNIT_UNCAUGHT_MESSAGE异常。

可能缺少一些非常基本的东西!

这是消息语句引起的问题,可能是因为它试图与GUI连接,不确定。

我正在下面的"测试类/方法"下处理这段代码:

但是它仍然失败,我的期望是,它应该通过测试。 As此消息需要根据给定的测试数据进行提示,并且我不想将该消息作为来自process_data例程的导出参数传递。 我想尽量保持表格不变。

任何指向该特定问题的指针都将非常有帮助。

谢谢。 索姆

(118.1 kB)
付费偷看设置
发送
11条回答
xfwsx85
1楼 · 2020-08-20 06:05.采纳回答

你好

在单元测试中,被测代码中的普通MESSAGE语句在单元测试中被"禁止"。

单元测试运行时实际上在会话中运行,而没有可用的对话框。 就像您的代码片段一样,没有引发消息或未添加其他消息的消息取决于对话框(或在后台运行),因此在这里不起作用。

结果屏幕为此提示(微弱) 分析标签中的案例中包含错误的文字:" MESSAGE ...引发,但未处理!" (我确实知道这完全没有帮助)。 ABAP Unit坚称,您的MESSAGE语句已经添加了RAISING附加项,并且在到达单元测试运行时环境的主要代码之前没有人抓住它。

您需要更改代码以传播此消息,而不是直接传播此消息。 在此表单中显示:

  • 在7.50以下,您可以在引发此异常时包装在Exception类(LCX_OBJECT)中(用RAISE EXCEPTION类型的LCX_OBJECT ...替换MESSAGE语句,检查RAISE EXCEPTION语法;您可以将其作为参数传递或直接定义为内部的常量 异常类)。
  • 如果您已经在 7.50,您可以依靠RAESS EXCEPTION的MESSAGE语句
  • 将消息序列化为"消息协议"(FORM参数/内部表,使用类似BAPIRET2的类型)以 显示在(主要)外部代码上。 Standard在许多功能模块和所有应返回成功/错误消息以显示的BAPI中执行此操作。

然后在调用此表单的地方调整代码以处理异常/表单协议 显示它。

最诚挚的问候

My梦
2楼-- · 2020-08-20 05:48

您能张贴局部测试类定义和测试方法定义吗?

在测试方法中出现这种消息很奇怪

me_for_i
3楼-- · 2020-08-20 06:05

如果您以后会期望出现异常,则PROCESS_DATA中的MESSAGE语句也应该包含RAISING EXCEPTION附加项 ?

huskylover
4楼-- · 2020-08-20 05:53

请以文本形式而不是图像形式发布代码,以便人们可以通过测试您的代码来轻松回答。

d56caomao
5楼-- · 2020-08-20 06:00

我已经用一些东西重建了一个完整的示例 像您的代码

您不应在OOo代码中使用MESSAGE语句。 您必须将其替换为异常类。 我也用异常类编写了代码。 您可以使用此异常类来保留消息编号/信息。

我还写了 Peter的建议。 Inotai (因为这样做最好)

 REPORT ztest_fg029。


 CLASS lx_my_error从cx_static_check继承。

   公共部分。
     接口if_t100_dyn_msg。
     接口if_t100_message。

     常数:
       开始使用fail_for_my_method,
         msgstr TYPE symsgid VALUE'00',
         msgno TYPE symsgno VALUE'001',
         attr1 TYPE scx_attrname VALUE'GV_ERROR_INFO',
         attr2 TYPE scx_attrname VALUE'',
         attr3 TYPE scx_attrname VALUE'',
         attr4 TYPE scx_attrname VALUE'',
       END OF failed_for_my_method。
     DATA gv_error_info TYPE字符串。

     方法构造函数
       输入
         !textid喜欢if_t100_message => t100key可选
         !previous喜欢上一个OPTIONAL
         iv_error_info TYPE字符串可选。
 ENDCLASS。



 类别lx_my_error实施。
   方法构造函数## ADT_SUPPRESS_GENERATION。
     调用方法超级>构造函数
       出口
         前一个=前一个。
     gv_error_info = iv_error_info。
     清除我-> textid。
     如果textid是INITIAL。
       if_t100_message〜t100key = if_t100_message => default_textid。
     其他。
       if_t100_message〜t100key = textid。
     万一。
   终结法。
 ENDCLASS。



 类别lc_生产性定义。

  公共部分。
     方法my_method引发lx_my_error。
     方法my_second_method引发lx_my_error。
 ENDCLASS。




 lc_productive的实现。

   方法my_method。
     带有" My_Method"的消息e001(00)几乎未失败。
   终结法。

   方法my_second_method。
     引发例外类型lx_my_error
       出口
         textid = lx_my_error => failed_for_my_method
         iv_error_info =" My_Method几乎没有失败"。
   终结法。

 ENDCLASS。


 类别ltc_生产性定义
       用于检测
       危险等级危害
       持续时间短
       最后。

   专用部分。
     方法设置。
     用于测试引发lx_my_error的方法test_method_1。
     用于测试引发lx_my_error的方法test_method_2。
     测试test_method_2_peter_com的方法以提高lx_my_error。
     数据o_cut类型参考lc_productive。

 ENDCLASS。


 类别ltc_productive实施。
   方法设置。
     o_cut =新的#()。
   方法。

   方法test_method_1。
     尝试。
     o_cut-> my_method()。
       将lx_my_error捕获到数据中(lo_exception)。
         data(lv_flag)= abap_true。
     努力。
     cl_abap_unit_assert => assert_equals(
       行为= lv_flag
       exp = abap_true)。
   方法。

   方法test_method_2。
     尝试。
     o_cut-> my_second_method()。
       将lx_my_error捕获到数据中(lo_exception)。
         data(lv_flag)= abap_true。
     努力。
     cl_abap_unit_assert => assert_equals(
       行为= lv_flag
       exp = abap_true)。
   方法。

   方法test_method_2_peter_com。
     尝试。
     o_cut-> my_second_method()。
       将lx_my_error捕获到数据中(lo_exception)。
     努力。
     cl_abap_unit_assert => assert_bound(lo_exception)。
   方法。
 结束类。
 
闻人可可
6楼-- · 2020-08-20 06:02

感谢,我也意识到了!

lukcy2020
7楼-- · 2020-08-20 05:42

顺便说一句,您也可以使用此断言,这样就不需要帮助变量:

cl_abap_unit_assert => assert_bound(act = exc)。/em>

一周热门 更多>