如何通过标准ABAP报表程序化运行ABAP Unit测试并定时展示结果?
程序化运行ABAP Unit测试并展示结果
要实现程序化执行ABAP Unit测试、定时运行并在ALV中展示结果,核心是利用SAP官方提供的CL_AUNIT_RUNNER类触发测试,再提取结果并通过ALV输出。以下是具体实现方案:
一、核心实现逻辑
- 用
CL_AUNIT_RUNNER的静态方法RUN执行指定对象(类、程序、函数组等)的ABAP Unit测试 - 通过
CL_AUNIT_RESULT类获取测试的详细结果(通过/失败状态、错误信息、测试时长等) - 将结果整理为内表后,调用ALV控件展示数据
二、完整报表程序示例
REPORT z_run_aunit_test. * 选择屏幕:输入测试对象名称和类型 SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001. PARAMETERS: p_obj TYPE seoclsname OBLIGATORY, " 对象名称(类/程序) p_type TYPE trobjtype OBLIGATORY DEFAULT 'CLS' AS LISTBOX VISIBLE LENGTH 3. " 类型:CLS=类,PROG=程序 SELECTION-SCREEN END OF BLOCK b1. * 定义结果内表结构 TYPES: BEGIN OF ty_result, obj_name TYPE seoclsname, " 测试对象名称 test_class TYPE seoclsname, " 测试类名称 test_method TYPE seoattrname, " 测试方法名称 status TYPE char10, " 状态:PASS/FAIL/ERROR message TYPE string, " 错误/失败信息 duration TYPE i, " 测试时长(毫秒) END OF ty_result. DATA: gt_result TYPE STANDARD TABLE OF ty_result, gs_result TYPE ty_result, go_runner TYPE REF TO cl_aunit_runner, go_result TYPE REF TO cl_aunit_result, go_testcase TYPE REF TO cl_aunit_testcase, go_testmethod TYPE REF TO cl_aunit_testmethod, go_message TYPE REF TO cl_aunit_message. START-OF-SELECTION. * 初始化测试运行器 CREATE OBJECT go_runner. go_runner->set_filter( EXPORTING i_filter = cl_aunit_filter=>create( ) ). go_runner->add_object( EXPORTING i_object_name = p_obj i_object_type = p_type ). * 执行测试 go_result = go_runner->run( ). * 遍历结果整理到内表 LOOP AT go_result->get_testcases( ) INTO go_testcase. LOOP AT go_testcase->get_testmethods( ) INTO go_testmethod. gs_result-obj_name = p_obj. gs_result-test_class = go_testcase->get_name( ). gs_result-test_method = go_testmethod->get_name( ). gs_result-duration = go_testmethod->get_duration( ). CASE go_testmethod->get_status( ). WHEN cl_aunit_constants=>c_status_passed. gs_result-status = 'PASS'. WHEN cl_aunit_constants=>c_status_failed. gs_result-status = 'FAIL'. LOOP AT go_testmethod->get_messages( ) INTO go_message. gs_result-message = go_message->get_text( ). ENDLOOP. WHEN cl_aunit_constants=>c_status_error. gs_result-status = 'ERROR'. LOOP AT go_testmethod->get_messages( ) INTO go_message. gs_result-message = go_message->get_text( ). ENDLOOP. ENDCASE. APPEND gs_result TO gt_result. CLEAR gs_result. ENDLOOP. ENDLOOP. * ALV展示结果 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = sy-repid is_layout = VALUE #( colwidth_optimize = abap_true ) it_fieldcat = VALUE #( ( fieldname = 'OBJ_NAME' seltext_m = '测试对象' ) ( fieldname = 'TEST_CLASS' seltext_m = '测试类' ) ( fieldname = 'TEST_METHOD' seltext_m = '测试方法' ) ( fieldname = 'STATUS' seltext_m = '状态' ) ( fieldname = 'MESSAGE' seltext_m = '信息' ) ( fieldname = 'DURATION' seltext_m = '时长(ms)' ) ) TABLES t_outtab = gt_result EXCEPTIONS program_error = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF.
三、定时执行配置
- 事务码
SM36创建后台作业,填写作业名称与描述 - 在「步骤」中添加上述报表程序,设置固定的选择屏幕参数(要测试的对象和类型)
- 在「开始条件」中配置定时计划(如每天凌晨2点执行)
- 保存并激活作业,系统会按计划自动执行测试;可通过
SM37查看作业日志,也可修改程序将结果写入文件或发送邮件通知
四、扩展说明
- 若需批量测试多个对象,可修改选择屏幕为多选参数,循环调用
add_object方法添加测试对象 - 可通过
CL_AUNIT_FILTER设置过滤条件(如只运行特定测试类、排除某些方法) - 如需导出结果,可在ALV中开启导出功能,或直接在程序中实现写入本地文件/发送邮件的逻辑
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

