Unit testing ABAP单元中的布尔断言
如何编写一个简单的ABAP Unit Assert语句来检查任何调用、表达式或其他语句的计算结果是否为true 在Unit testing ABAP单元中的布尔断言,unit-testing,abap,Unit Testing,Abap,如何编写一个简单的ABAP Unit Assert语句来检查任何调用、表达式或其他语句的计算结果是否为true 在CL\u AUNIT\u assert中,我看不到任何基本的assert()或assert\u true()方法,但我希望这些方法非常常见。我可以将这样的断言近似如下,但没有更干净的方法吗 cl_aunit_assert=>assert_equals( act = boolc( lv_value > 100 OR lv_value < 2 ) exp = a
CL\u AUNIT\u assert
中,我看不到任何基本的assert()
或assert\u true()
方法,但我希望这些方法非常常见。我可以将这样的断言近似如下,但没有更干净的方法吗
cl_aunit_assert=>assert_equals(
act = boolc( lv_value > 100 OR lv_value < 2 )
exp = abap_true ).
cl_aunit_assert=>assert_equals(
act = mo_model->is_active )
exp = abap_true ).
cl\u aunit\u assert=>assert\u equals(
act=boolc(lv_值>100或lv_值<2)
exp=abap_true)。
cl_aunit_assert=>assert_equals(
act=mo\U模型->处于活动状态)
exp=abap_true)。
对于我可以访问的版本,可能没有比您概述的版本更短的方法了。您可以创建CL\u AUNIT\u ASSERT
的子类,并添加自己的静态ASSERT\u TRUE
方法。这样做并不是一个坏主意,同时使您的本地ABAP单元测试类成为ZCL\u AUNIT\u ASSERT
的子类-这样,您可以省略cl\u AUNIT\u ASSERT=>
前缀,这将节省一些击键。您无法看到这些方法,因为ABAP中没有布尔类型
在爪哇,C++或C中,你可以把条件的结果赋值给变量,比如这个< /P>
int i = 5;
boolean result = i > 3;
在ABAP中不能执行相同的操作,因为没有布尔类型。因此,在其他语言中,什么是一行,在ABAP中,它将总是更加冗长
DATA: i TYPE i VALUE 5.
DATA: result TYPE abap_bool.
IF i > 3.
result = abap_true.
ELSE.
result = abap_false.
ENDIF.
您使用的东西似乎是一个新特性,最近已添加到该语言中,大多数客户在很长时间内不会使用。另外,CL\u AUNIT\u ASSERT
类是在新元素进入语言之前创建的
DATA: i TYPE i VALUE 5.
DATA: result TYPE abap_bool.
result = boolc( i > 3 ).
所以现在,有可能将上述内容写成一行。但是,该语言中仍然没有布尔类型
DATA: i TYPE i VALUE 5.
DATA: result TYPE abap_bool.
result = boolc( i > 3 ).
另一方面,没有布尔类型,但在这种情况下,您可以简单地使用
ASSERT\u INITIAL
或ASSERT\u NOT\u INITIAL
,因为布尔值由X
(true)或空格(false)模拟。后者是ABAP中的初始值。最干净的方法就是失败:
if value > limit.
cl_abap_unit_assert=>fail( ).
endif.
或者更具信息性:
cl\u abap\u unit=>失败(msg='Limit extended')。
根据您的SAP NetWeaver堆栈,您可以(或应该)使用更新的abap unit类cl\u abap\u unit\u ASSERT
。该类在基础版本>=7.02中可用。SAP将该类声明为“FINAL”,因此不可能从中继承,但另一方面,他们添加了一些ASSERT方法,如ASSERT\u TRUE
方法
以下是此方法的可能用法:
cl_abap_unit_assert=>assert_true(
exporting
act = m_ref_foo->is_bar( l_some_var )
msg = 'is_bar Method fails with Input { l_some_var }'
).
嗯,也许是因为ABAP中没有布尔类型?我刚刚有一个顿悟。没有布尔类型,但您可以简单地使用
ASSERT\u INITIAL
或ASSERT\u NOT\u INITIAL
,在这种情况下,布尔值由X
(true)或空格(false)模拟。后者是ABAP中的初始值。请考虑通过编辑链接重新格式化您的答案,不知道那一个。我希望FINAL
标志只是一个疏忽-删除该标志将使迁移更加容易。“SAP宣布该类为FINAL”当然他们做到了。。。奇怪的是,像其他人一样,似乎没有任何在线文档显示添加了ASSERT_TRUE。我发现的只是7.0版本中过时的方法列表。但是我已经检查了7.40系统上的类,并确认该方法存在(尽管这里的类文档也过时了),并且这是我原始问题最接近的标准解决方案,所以我将此标记为接受的答案。好吧…最终类应该声明为…最终。这个类只有静态方法,这意味着它不是为继承而设计的。所以SAP的设计决策很好。没有像Java中那样的静态导入?嗯……也许在未来20年内,ABAP将以这种方式完成一些事情。:)