Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing ABAP单元中的布尔断言_Unit Testing_Abap - Fatal编程技术网

Unit testing ABAP单元中的布尔断言

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

如何编写一个简单的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 = 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将以这种方式完成一些事情。:)