zoukankan      html  css  js  c++  java
  • ABAP Help Document(28):13 Program Editing

    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

    Executable program

    F

    Function group or function pool

    I

    Include program

    J

    Interface pool

    K

    Class pool

    M

    Module pool

    S

    Subroutine pool

    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.
  • 相关阅读:
    Mac下写博客工具ecto相关资料
    重装MacOS
    Mac下写博客工具MarsEdit相关资料
    Mac下安装最新版本的Graphviz
    什么是回归分析?
    Mac 配置Charles抓https的包
    Android sdk tool android 命令参数
    判断某个端口被那个进程占用
    [置顶] 微创新时代个人崛起的方法
    xml获取配置DataTable
  • 原文地址:https://www.cnblogs.com/tangToms/p/14697292.html
Copyright © 2011-2022 走看看