CDS测试框架介绍

2019-11-27 00:59 来源:未知

动机

现今咱们都驾驭单元测量检验对我们代码的利润。并且大家都认可它是支付进度中至关重要的一局地。可是在把代码切换成数据库的情势下的时候,大家被强行地打回了软件测量检验的乌黑时代...我们今后面对着逻辑下推到ABAP CDS entities后,代码要哪些测量试验的难题。

CDS Test Double Framework允许开拓者们通过鲜明的ABAP Unit Test Framework自动化地质度量试CDS entities。

正文链接:

波兰语原来的文章:Introduction to CDS Test Double Framework – How to write unit tests for ABAP CDS Entities?

挑战

因为CDS entity中的逻辑运营在下层的数据库中(独立于abap runtime卡塔 尔(英语:State of Qatar),使用守旧的ABAP信任注入解决方案以促成测验成为了不容许的事体。entity的依靠组件亟需在数据库中加上测量检验替身,并且大家不得不确认保证CDS entity测量试验的时候数据库引擎调用/实行那几个测量试验替身(double卡塔 尔(阿拉伯语:قطر‎。

为了能够在CDS entity under test (CUT)中可控地测量试验逻辑,大家必要通过测量试验替身注射测验专项使用数据。这代表必得将测量试验数据插入到测试替身中,那样数据足以在CUT实践时被测量试验替身们回去。对于在ABAP CDS上下文中享有固有的只读属性的信赖新组合件(举个例子数据库视图和数据库函数卡塔 尔(阿拉伯语:قطر‎,那是风姿罗曼蒂克项极其的挑衅。

本文中关键的缩写:

CUT = CDS entity Under Test

DOC = Depended-On Component

CDS Test Double Framework

CDS Test Double Framework管理了上述的挑战,而且能够实现CDS entities测量检验的自动化:

  1. 在一直以来的Database Schema中为每种信任组件创造一时的可更新测量试验替身
    1. 复制信任组件表,但不复制任何数据。不复制信任数据库表的主键节制。那允许你轻轻松松地插入测量试验数据,而不用担心数据的完整性。相同的,数据库索引也不会被复制。
    2. 为依附数据库视图创建数量库表。那些表有着和重视数据库视图相近的布局。
    3. 信任数据库functions(由带有参数的信任CDS视图和正视表function爆发卡塔 尔(阿拉伯语:قطر‎会被复制,並且function的测量试验替身达成会被涂改为允许插入须求的测验数据。
  2. 在长久以来的Database Schema创制三个CDS entity under test(CUT卡塔尔国的不常别本。从各样意义上来看,那个别本是为CUT服务的。在原本的CDS entity中落到实处的逻辑在副本中相仿存在,不过依靠组件被替换为了呼应的测量检验替身。测量检验替身是由大家的CDS Test Double Framework所创设的。

网页测试游戏 1

测量试验什么?

网页测试游戏,单元测验应当注意于由一个给定视图实现的有价值的效果定义。不是怀有的CDS视图都急需二个单元测验。在贯彻单元测量试验以前,提出辨别出entity中与测量检验有关的上边。

常常,需求为一些含有了代码下推的主意的entity实行单元测量检验。潜在的测验候选者包蕴:

Calculations and/or filters, conversions, conditional expressions 比如 CASE…THEN…ELSE or COALESCE, type changing CAST operations, cardinality changes or checks against NULL values,  JOIN behavior, complex where conditions 等.

单元测量试验不应用于测量试验那么些更适用于静态检查、集成测验等技巧的CDS entities属性。如若不能够从单元测验中拿走别的价值的话,也不应进行它,比如对于那么些轻巧的CDS投电影和电视图。

如何使用CDS Test Double Framework写单元测量试验?

在下一些,大家会通过被遍布应用的ABAP Unit Test Framework为以下的CDS视图成立单元测验。

@AbapCatalog.sqlViewName: 'zSo_Items_By_1'
@EndUserText.label: 'Aggregations/functions in SELECT list'
@AbapCatalog.compiler.compareFilter: true
define view Salesorder_Items_By_TaxRate
as select from CdsFrwk_Sales_Order_Item
association [1] to snwd_so as _sales_order on so_guid = _sales_order.node_key
{
so_guid,
coalesce ( _sales_order.so_id, '9999999999' ) as so_id,
currency_code,
sum( gross_amount ) as sum_gross_amount,
tax_rate,
_sales_order
}
group by
so_guid,
_sales_order.so_id,
currency_code,
tax_rate

创建ABAP测试类

创建三个ABAP测量试验类以对CDS视图举办单元测量检验。有叁个好的实施方法:为测量检验类起一个和CUT相像/相通的名字,何况增进TEST的后缀。举例,对于CDS视图Salesorder_Items_By_TaxRate,测验类的名字能够是:Salesorder_Items_By_TaxRate_Test.

因为单元测量检验和CDS是不一样的东西,雷同/相符的名字能够帮忙我们轻便的搜索有关的测验。

CLASS Salesorder_Items_By_TaxRate_Test DEFINITION FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
...
...
ENDCLASS.

CLASS SO_ITEMS_BY_TAXRATE_TEST IMPLEMENTATION.
...
...
ENDCLASS.

概念固定方式

概念以下的装置拆卸方法。

运行情势cl_cds_test_environment=>create( i_for_entity = ‘<CDS under test>’ ),隐式地在数据库中创建全数信赖新组合件测试替身。那一个主意在测量试验类中只应被调用一遍。

"Fixture method class_setup is executed only once in the beginning of the execution of test class
METHOD class_setup.
"For parameter i_for_entity, specify the CDS view to be unit tested. This will create all the depended-on component Test doubles in the database.
environment = cl_cds_test_environment=>create( i_for_entity = 'Salesorder_Items_By_TaxRate' ).
ENDMETHOD.

METHOD class_teardown.
environment->destroy( ).
ENDMETHOD.

"Fixture method setup is executed once before each test method execution
<cod
METHOD setup.
environment->clear_doubles( ).
ENDMETHOD.

概念单元测量试验方法

METHOD cuco_1_taxrate_1_item_1_ok.

ENDMETHOD.

希图输入——在测量试验替身中插入测量试验数据

METHOD cuco_1_taxrate_1_item_1_ok.

"Step 1 : Insert testdata into the doubles
"Step 1.1 : create an instance of type snwd_so. Note : CDS view Salesorder_Items_By_TaxRate depends on snwd_so.
sales_orders = VALUE #( ( client = sy-mandt node_key = '01' so_id = 'ID' ) ).

"Step 1.2 : Use the framework method CL_CDS_TEST_DATA=>create(..) to create the test_data object
test_data = cl_cds_test_data=>create( i_data = sales_orders ).

"Step 1.3 : Use the framework method environment->get_double(..) to create the instance of the double 'SNWD_SO'
DATA(sales_orders_double) = environment->get_double( i_name = 'SNWD_SO' ).

"Step 1.4 : Insert the testdata into the double depended-on component object
sales_orders_double->insert( test_data ).

"Repeat Step 1 for all the depended-on component doubles
sales_order_items = VALUE #( ( mandt = sy-mandt so_guid = '01' currency_code = 'EUR' gross_amount = '1' tax_rate = '19.00' ) ).
test_data = cl_cds_test_data=>create( i_data = sales_order_items ).
DATA(sales_order_items_double) = environment->get_double( i_name = 'CdsFrwk_DEMO_1' ).
sales_order_items_double->insert( test_data ).

...

ENDMETHOD.

执行CDS

SELECT * FROM cdsfrwk_so_items_by_taxrate INTO TABLE @act_results.

注明输出——使用ABAP单元测量试验的预见

exp_results = VALUE #( ( so_id = 'ID' currency_code = 'EUR' sum_gross_amount = '1' tax_rate = '19.00' ) ).
cl_abap_unit_assert=>assert_equals(
act = lines( act_results )
exp = lines( exp_results ) ).

"The method looks as follows:

METHOD cuco_1_taxrate_1_item_1_ok.

"Step 1 : Insert testdata into the doubles
"Step 1.1 : create an instance of type snwd_so
sales_orders = VALUE #( ( client = sy-mandt node_key = '01' so_id = 'ID' ) ).

"Step 1.2 : Use the framework method CL_CDS_TEST_DATA=>create to create the test_data object
test_data = cl_cds_test_data=>create( i_data = sales_orders ).

"Step 1.3 : Use the framework method environment->get_double to the instance of the DOC double 'SNWD_SO'
DATA(sales_orders_double) = environment->get_double( i_name = 'SNWD_SO' ).

"Step 1.4 : Insert the testdata into the DOC double object
sales_orders_double->insert( test_data ).

"Repeat Step 1 for all the DOC doubles
sales_order_items = VALUE #( ( mandt = sy-mandt so_guid = '01' currency_code = 'EUR' gross_amount = '1' tax_rate = '19.00' ) ).
test_data = cl_cds_test_data=>create( i_data = sales_order_items ).
DATA(sales_order_items_double) = environment->get_double( i_name = 'CdsFrwk_DEMO_1' ).
sales_order_items_double->insert( test_data ).

"Step 2 : Execute the CDS
SELECT * FROM cdsfrwk_so_items_by_taxrate INTO TABLE @act_results.

"Step 3 : Verify Expected Output
exp_results = VALUE #( ( so_id = 'ID' currency_code = 'EUR' sum_gross_amount = '1' tax_rate = '19.00' ) ).
assert_so_items_by_taxrate( exp_results = exp_results ).

ENDMETHOD.

运行CDS的单元测验

在ADT中等,展开包蕴全体CDS单元测量检验的ABAP测量试验类。右键采用Run As->ABAP Unit Test,恐怕使用ctrl+shift+f10组合键来运作单元测验。结果会在eclipse中的ABAP Unit Runner视图中展现。

注意:现今结束,还不可能在DDL源代码编辑器中一贯运维单元测量试验。

受协理的测量试验场景

CDS Test Double framework支持为给定的CUT的以下DOC创立测量试验替身:

  • DDIC tables
  • DDIC views
  • CDS views
  • CDS views with Parameters
  • External Views
  • Table Functions
  • CDS special functions. CURRENCY_CONVERSION and UNIT_CONVERSION

你可以张开/关闭给定CDS的DCL,更加多细节会在本文的后面提供。

重视新整合件是Table Function

Tables Function的测量试验替身的决定格局和别的的CDS视图同样。

信赖组件是包蕴参数的CDS视图

CDS Test Double Framework提供了

cl_cds_test_data=>create( .. )->for_parameters( .. )

来为包括参数的品类的测量试验替身插入数据。

METHOD eur_tax_rate_19_found.

"Step 1 : Insert testdata into the doubles
open_items = VALUE #( ( mandt = sy-mandt so_guid = '0F' tax_rate = '19.00' so_id = '1' ) ).
i_param_vals = VALUE #( ( parm_name = `pCuCo` parm_value = `EUR` ) ).

"CdsFrwk_demo_3 is a CDS view with parameters. Use framework method ->for_parameters( ) to insert test data
test_data = cl_cds_test_data=>create( i_data = open_items )->for_parameters( i_param_vals ).

DATA(open_items_double) = environment->get_double( 'CdsFrwk_demo_3' ).
open_items_double->insert( test_data ).

...
...
ENDMETHOD.

DCL对CUT的影响

你也足以张开/关闭给定的CDS的DCL。然而,在日前,假诺您的CDS DDL在测量试验时蒙受DCL影响的话,大家建议在运作测验时老是关闭DCL。在以后,使用DCL时会有比很多取舍能够玩,何况能够行使剧中人物权限测量检验替身等。可是在这里时此刻的本子中,你要求静心在测量试验CDS DDL时完全关闭DCL(如若某些话卡塔尔国。在张开DCL时些测量检验大概引致测量检验间断性战败,因为实在访问调整角色权限会被利用。因而,提议在您的分娩测量检验中连连有一个:

DISABLE_DCL=ABAP_TRUE in the cl_cds_test_environment=>create(…)

对特殊function的支持:CURRENCY_CONVERSION和UNIT_CONVERSION

CDS Test Double framework中可以为七个特殊的CDS function提供支撑:

"Step 1 : Create testdata using the special framework method create_currency_conv_data
test_data = cl_cds_test_data=>create_currency_conv_data( output = '399.21' )->for_parameters(
amount = '558.14'
source_currency = 'USD'
target_currency = 'EUR'
exchange_rate_date = '20150218'
).

"Step 2 : Get the double instance using the framework method get_double
DATA(curr_conv_data_double) = environment->get_double( cl_cds_test_environment=>currency_conversion ).

"Step 3 : Insert test_data into the double
curr_conv_data_double->insert( test_data ).

包括NULL值的测量检验

为了在测验替身中插入null值,CDS Test Double Framework提供了法子:

cl_cds_test_data=>create( .. )->set_null_values( .. )

该方式能够显式地设定null值。

partners = VALUE #( ( client = sy-mandt bp_id = '1' ) ).

"Step 1 : define the list of columns into which NULL is inserted
i_null_vals = VALUE #( ( `address_guid` ) ).

"Step 2 : Create testdata and set the NULL value object
test_data = cl_cds_test_data=>create( i_data = partners )->set_null_values( i_null_vals ).

"Step 3 : Get test Double instance
DATA(partners_double) = environment->get_double( i_name = 'SNWD_BPA' ).

"Step 4 : Insert test data into test double
partners_double->insert( test_data ).

Demo examples

你可以在此个包里找到大多单元测验的事例:

SABP_UNIT_DOUBLE_CDS_DEMO

可用性

CDS Test Double Framework从NetWeaver AS ABAP 7.51 release千帆竞发可用。

越来越多消息

报告bug的话,请为CSS组件BC-DWB-TOO-UT-CDS创建tickets。

总计:通过本文,你今后得以选择CDS Test Double Framework高效地为您在CDS中实现的代码下推来写自动化的测量试验!

 

扩张阅读:浓重探討 Test Double、Dummy、Fake、Stub 、Mock 與 Spy

 

TAG标签:
版权声明:本文由澳门国际银河备用网址发布于网页测试游戏,转载请注明出处:CDS测试框架介绍