13.Program Editing
13.1 Testing and Checking Program
创建项目和完成项目时,需要进行项目测试。
Checkpoints(断点),程序运行时,可以作为测试接入点。使用Tcode:SAAB,将断点放入checkpoint group。
语法:
ASSERT [ [ID group [SUBKEY sub]] [FIELDS val1 val2 ...] CONDITION ] log_exp.
定义断言。
当没有ID时,checkpoint总是激活的,当有ID时,checkpoint状态由外部checkpoint group状态决定;
SUBKEY只在ASSERT将条目写入日志时有效;
FIELDS的大小由系统profile parameter:abap/aab_log_field_size_limit确定;
语法:
BREAK-POINT { [ID group] | [log_text] }.
定义断点。
语法:
LOG-POINT ID group [SUBKEY sub] [FIELDS val1 val2 ...].
定义日志断点。
13.2 Runtime measurement
运行时间测量,使用类CL_ABAP_RUNTIME或者GET RUN TIME、SET RUN TIME CLOCK RESOLUTION、SET RUN TIME ANALYZER。
语法:
GET RUN TIME FIELD rtime.
获取运行时间
示例:
FORM f_get_runtime. DATA:lv_time TYPE I. DATA:lv_t1 TYPE I. DATA:lv_t2 TYPE I. DATA:lv_dura TYPE P LENGTH 8 DECIMALS 5. GET RUN TIME FIELD lv_t1. DO 1000 TIMES. SELECT COUNT(*) FROM sflight. ENDDO. GET RUN TIME FIELD lv_t2. lv_time = lv_t2 - lv_t1. GET RUN TIME FIELD lv_t1. DO 1000 TIMES. ENDDO. GET RUN TIME FIELD lv_t2. lv_time = lv_time - ( lv_t2 - lv_t1 ). "获取每查询一次时间,单位microseconds lv_dura = lv_time / 1000. WRITE:/ lv_time,lv_dura. ENDFORM.
语法:
SET RUN TIME CLOCK RESOLUTION {HIGH|LOW}.
指定GET RUN TIME的精度。必须在GET RUN TIME之前执行,否则出错。
语法:
SET RUN TIME ANALYZER {ON|OFF}.
此语句影响运行时分析工具。
13.3 ABAP Unit Test
ABAP单元测试。
语法:
CLASS class DEFINITION FOR TESTING [RISK LEVEL {CRITICAL|DANGEROUS|HARMLESS}]
[DURATION {SHORT|MEDIUM|LONG}].
测试类定义。
方法名:
setup:which is executed before each individual test or before each execution of a test method.
teardown:which is executed after each individual test or after each execution of a test method.
class_setup:静态方法,which is executed once before all tests of the class.
class_teardown:静态方法,which is executed once after every test of the class.
语法:
METHODS meth [ABSTRACT|FINAL]
FOR TESTING
[RAISING exc1|RESUMABLE(exc1) exc2|RESUMABLE(exc2) ...].
测试方法,只能在测试类中定义。
使用类CL_ABAP_UNIT_ASSERT中静态方法进行值测试。
示例:
"被测试类 CLASS c_1 DEFINITION. PUBLIC SECTION. CLASS-METHODS:set_name IMPORTING name TYPE string. CLASS-DATA:gv_name TYPE string. ENDCLASS. CLASS c_1 IMPLEMENTATION. METHOD:set_name. gv_name = name. ENDMETHOD. ENDCLASS. "测试类 CLASS c_test DEFINITION FOR TESTING. PUBLIC SECTION. METHODS:m_test FOR TESTING. ENDCLASS. CLASS c_test IMPLEMENTATION. METHOD:m_test. c_1=>set_name( 'hh' ). cl_abap_unit_assert=>assert_equals( EXPORTING act = c_1=>gv_name exp = 'hh' msg = 'success' ). ENDMETHOD. ENDCLASS.
13.4 Dynamic Program Edit
对Program编辑实现动态控制。Program由Source code、Text Elements、Dynpro三个部分组成。Function:RS_ACCESS_PERMISSION,进行权限检查;TR_SYS_PARAMS:存储库对象是否可更改;
1.Source code
语法:
GENERATE SUBROUTINE POOL itab NAME prog [error_handling].
生成临时子程序池。
[error_handling]
MESSAGE mess]
[INCLUDE incl]
[LINE lin]
[WORD wrd]
[OFFSET off]
[MESSAGE-ID mid]
[SHORTDUMP-ID sid] ... .
message:当子程序池发生错误,第一个错误的错误信息;
include:当子程序池中include发生错误,include名称;
line:当子程序池中发生错误,第一个错误行号;
word:当子程序池中发生错误,第一个字符;
offset:当子程序池发生错误,第一个字符及后偏移量;
message-id:当子程序池发送错误,第一个错误存储在table: TRMSG,使用mid可以查找到;
shortdump-id:当出现错误时,但是被处理了,错误存储在table: SNAPT;
示例1:动态子程序
FORM f_dyn_source_subroutine. DATA:lv_prog TYPE string. DATA:lt_tab TYPE STANDARD TABLE OF string. DATA:lv_mess TYPE string. DATA:lv_id TYPE string. APPEND 'PROGRAM subpool.' TO lt_tab. APPEND ` DATA spfli_tab TYPE TABLE OF spfli.` TO lt_tab. APPEND ` DATA spfli_wa TYPE spfli.` TO lt_tab. APPEND `LOAD-OF-PROGRAM.` TO lt_tab. APPEND ` SELECT *` & ` FROM spfli` & ` INTO TABLE spfli_tab.` TO lt_tab. APPEND `FORM show_tab.` TO lt_tab. APPEND ` LOOP AT spfli_tab INTO spfli_wa.` TO lt_tab. APPEND ` WRITE:/ spfli_wa-carrid,spfli_wa-connid.` TO lt_tab. APPEND ` ENDLOOP.` TO lt_tab. APPEND `ENDFORM.` TO lt_tab. "创建子程序池 GENERATE SUBROUTINE POOL lt_tab NAME lv_prog MESSAGE lv_mess SHORTDUMP-ID lv_id. IF sy-subrc = 0. PERFORM ('SHOW_TAB') IN PROGRAM (lv_prog) IF FOUND. ELSEIF sy-subrc = 4. MESSAGE lv_mess TYPE 'I'. ELSEIF sy-subrc = 8. MESSAGE lv_id TYPE 'I'. ENDIF. "创建类 DATA:lv_class TYPE string. DATA:lo_ref TYPE REF TO object. CLEAR lt_tab. APPEND `program.` TO lt_tab. APPEND `class main definition.` TO lt_tab. APPEND ` public section.` TO lt_tab. APPEND ` class-methods meth.` TO lt_tab. APPEND `endclass.` TO lt_tab. APPEND `class main implementation.` TO lt_tab. APPEND ` method meth.` TO lt_tab. APPEND ` message 'Test' type 'I'.` TO lt_tab. APPEND ` endmethod.` TO lt_tab. APPEND `endclass.` TO lt_tab. "创建子程序池 GENERATE SUBROUTINE POOL lt_tab NAME lv_prog. "类名 lv_class = `PROGRAM=` && lv_prog && `CLASS=MAIN`. CALL METHOD (lv_class)=>meth. "方式2: CREATE OBJECT lo_ref TYPE (lv_class). CALL METHOD lo_ref->('METH'). ENDFORM.
语法:
READ REPORT prog INTO itab [MAXIMUM WIDTH INTO wid].
获取存储库中source code。
示例:
FORM f_dyn_source_read. DATA:lv_prog TYPE C LENGTH 30. DATA:lt_tab TYPE TABLE OF string. lv_prog = 'ZTOM_LEARNING14'. READ REPORT lv_prog INTO lt_tab. IF sy-subrc = 0. APPEND `FORM sub.` TO lt_tab. APPEND ` WRITE:/ 'hello'.` TO lt_tab. APPEND `ENDFORM.` TO lt_tab. GENERATE SUBROUTINE POOL lt_tab NAME lv_prog. PERFORM ('SUB') IN PROGRAM (lv_prog). ENDIF. "生成指定program lv_prog = 'TEST_PROG'. APPEND `FORM sub1.` TO lt_tab. APPEND ` WRITE:/ 'hello sub1'.` TO lt_tab. APPEND `ENDFORM.` TO lt_tab. INSERT REPORT lv_prog FROM lt_tab. "读取 CLEAR lt_tab[]. READ REPORT lv_prog INTO lt_tab. GENERATE SUBROUTINE POOL lt_tab NAME lv_prog. PERFORM ('SUB1') IN PROGRAM (lv_prog). ENDFORM.
语法:
SYNTAX-CHECK FOR itab MESSAGE mess LINE lin WORD wrd
[PROGRAM prog] [DIRECTORY ENTRY dir]
[WITH CURRENT SWITCHSTATES] [error_handling].
对itab内动态内容进行语法检查,不必要,因为执行时,总会进行语法检查。
error_handling:
[INCLUDE incl]
[OFFSET off]
[MESSAGE-ID mid]
语法:
INSERT REPORT prog FROM itab
[MAXIMUM
WIDTH INTO wid]
{
[KEEPING DIRECTORY ENTRY]
|
{ [PROGRAM TYPE pt]
[FIXED-POINT
ARITHMETIC fp]
[UNICODE
ENABLING uc] }
|
[DIRECTORY ENTRY dir] }.
将itab动态定义语法插入到存储库。如果prog已经存在,就覆盖。
程序类型
ID |
Program Type |
1 |
|
F |
Function group or function pool |
I |
|
J |
|
K |
|
M |
|
S |
|
T |
Type group or type pool |
2. Text Elements
语法:
READ TEXTPOOL prog INTO itab LANGUAGE lang.
读取textpool。
语法:
INSERT TEXTPOOL prog FROM itab LANGUAGE lang.
插入textpool。
lang这里为表T002维护。
示例:
FORM f_dyn_source_texts. DATA:lv_prog TYPE C LENGTH 30. DATA:lt_tab TYPE TABLE OF textpool. DATA:ls_tab LIKE LINE OF lt_tab. lv_prog = 'ZTOM_LEARNING14'. READ TEXTPOOL lv_prog INTO lt_tab LANGUAGE 'EN'. LOOP AT lt_tab INTO ls_tab. WRITE:/ ls_tab-id,ls_tab-key,ls_tab-entry,ls_tab-length. ENDLOOP. ENDFORM.