SAP eCATT自动化测试工具深度解析与实战指南
简介:SAP eCATT(Electronic Computer-Aided Test Tool)是SAP提供的自动化测试解决方案,基于SAP Scripting语言,支持功能与性能测试,广泛应用于SAP系统的端到端业务流程验证。该工具具备脚本录制回放、数据驱动测试、灵活脚本编辑及详尽报告分析等核心功能,并可与ALM、CTS等SAP工具集成,显著提升测试效率与准确性。本文档深入讲解eCATT的使用方法,涵盖脚本创建、数据配置、错误调试及性能测试等内容,适用于SAP实施与维护团队掌握自动化测试全流程。
1. SAP eCATT基本概念与应用场景
1.1 eCATT核心架构与设计原理
SAP eCATT(Extended Computer Aided Test Tool)是基于ABAP平台构建的原生自动化测试工具,深度集成于SAP系统内核。其架构采用“测试脚本-控制流-数据源”三层模型,通过ABAP运行时环境直接驱动GUI操作逻辑,实现对事务码、屏幕字段、按钮事件的精准模拟。
* 示例:eCATT测试脚本在后台的执行逻辑片段
CALL FUNCTION 'ECATT_SCRIPT_PROCESSOR'
EXPORTING
test_object = 'ZTEST_ME21N'
mode = 'EXECUTE'
IMPORTING
return_code = lv_retcode.
该代码段展示了eCATT脚本如何通过标准RFC函数触发执行,体现了其与ABAP系统的无缝融合能力。
1.2 典型应用场景与企业级价值
eCATT广泛应用于SAP升级、ECC到S/4HANA迁移、补丁验证等关键项目阶段,尤其在回归测试中可减少70%以上的人工干预。其支持跨模块业务流程串联(如MM+SD+FI),并通过同步点机制确保复杂交互的稳定性。
| 场景 | 使用优势 |
|---|---|
| 需求验证 | 快速还原用户操作路径,提升验收效率 |
| 系统迁移验证 | 批量回放历史操作,保障功能一致性 |
| 定期回归测试 | 可集成至CI/CD管道,支持无人值守执行 |
1.3 相较传统测试的差异化优势
相较于手动测试和第三方RPA工具,eCATT具备天然的系统级权限与数据访问能力,无需额外接口开发即可读写透明表、调用BAPI。更重要的是,它能精确捕捉SAP GUI事件链,还原复杂的屏幕跳转逻辑,避免因控件识别失败导致的脚本中断。
此外,eCATT支持参数化与数据驱动设计,结合外部Excel或数据库输入源,可实现“一次录制、多场景回放”的高效测试模式,为企业级SAP质量保障提供可持续演进的技术路径。
2. 脚本录制与回放机制详解
SAP eCATT 的核心价值之一在于其强大的自动化测试能力,而这一能力的基础正是 脚本的录制与回放机制 。该机制不仅为非编程背景的业务顾问提供了快速创建测试用例的路径,也为开发人员实现复杂流程的可重复验证提供了结构化支持。本章将从底层技术原理出发,深入剖析 eCATT 如何捕获用户操作、生成可执行脚本,并在不同环境下准确还原业务行为。
通过理解录制与回放的技术实现逻辑,读者能够识别并优化脚本中的冗余步骤,提升测试稳定性和维护效率。同时,掌握同步控制、异常恢复等关键机制,是构建高可用自动化测试体系的前提条件。
2.1 eCATT测试用例的创建与结构解析
eCATT 测试用例并非简单的宏记录文件,而是由多个抽象组件构成的结构化对象。这些组件共同定义了测试的行为逻辑、数据依赖和执行上下文。理解其内部构造,有助于设计出更具扩展性与复用性的测试资产。
2.1.1 测试用例对象(Test Case Object)的定义与属性配置
在 SAP 系统中,每一个 eCATT 测试用例都以一个独立的对象形式存在,通常存储于 $TMP 包或客户命名空间下的函数组中。该对象本质上是一个 ABAP Dictionary 结构的实例,包含元数据、控制流、变量声明和事务调用序列等多个组成部分。
使用事务码 SECATT 进入 eCATT 工作台后,可通过“Create”按钮新建测试用例。系统提示输入以下关键属性:
| 属性名称 | 说明 |
|---|---|
| Test Case ID | 唯一标识符,建议遵循命名规范如 TC_MM_PO_CREATE_001 |
| Description | 中文或英文描述,用于说明测试目的 |
| Application Component | 所属模块(如 MM, SD, FI),便于分类管理 |
| Test Script Language | 脚本语言类型,默认为 ABAP |
| System Data Container (SDC) | 指定目标系统连接信息 |
| Recording Mode | 可选标准录制或结构化录制模式 |
* 示例:测试用例头对象的ABAP结构定义(简化)
TYPES: BEGIN OF ty_testcase_header,
testcase_id TYPE c LENGTH 30,
description TYPE string,
app_component TYPE c LENGTH 10,
sdc_name TYPE rs38l-sdcname,
recording_mode TYPE c LENGTH 1, " S = Standard, T = Structured
END OF ty_testcase_header.
代码逻辑分析 :
- 定义了一个内联结构ty_testcase_header,模拟 eCATT 内部存储测试用例元数据的方式。
-testcase_id使用定长字符字段确保唯一性;
-sdc_name引用了标准表rs38l-sdcname,表示系统数据容器名称;
-recording_mode字段长度为 1,对应 SAP GUI 提供的选择项。
此结构虽不直接暴露给用户,但在后台被持久化至数据库表 RSAUTESTCASE 中,作为测试资产管理的一部分。此外,每个测试用例还会关联一个主程序(Main Program),由系统自动生成,负责调度所有测试步骤的执行顺序。
元数据驱动的设计优势
eCATT 采用元数据驱动架构,意味着测试行为不是硬编码在脚本中,而是通过动态读取对象属性来决定执行策略。例如,在 Test Runner 中批量执行时,系统会先查询 RSAUTESTCASE 表获取所有启用状态的测试用例,再根据 application component 和 priority 字段进行排序与过滤。
这种设计使得测试套件具备良好的可管理性,尤其适用于大型企业跨模块集成测试场景。
版本控制与变更追踪
由于测试用例属于 ABAP 开发对象,因此天然支持版本管理(via SE80 或 ADT)。每次修改后,系统自动记录变更人、时间戳及请求号(Transport Request),满足审计合规要求。建议开启“Change Documents”功能,以便追溯历史变更内容。
2.1.2 控制流组件:Test Steps与Transaction Call的关系建模
eCATT 的控制流由一系列有序的 Test Steps 构成,每个 Step 可以封装一个或多个 Transaction Call (事务调用)。这种分层模型实现了操作粒度与业务流程之间的映射。
控制流层级结构示意图(Mermaid)
graph TD
A[Test Case] --> B[Test Step 1]
A --> C[Test Step 2]
A --> D[Test Step N]
B --> B1[Transaction: VA01]
B --> B2[Input Field: KUNNR = '0000123456']
B --> B3[Command: Enter]
C --> C1[Transaction: VF01]
C --> C2[Input Field: VBELN = '{ORDER_NUM}']
C --> C3[Verification: Output Message = 'Billing Created']
D --> D1[Include Subroutine: CHECK_INVENTORY]
流程图说明 :
- 顶层为 Test Case,代表完整业务流程;
- 每个 Test Step 封装一组相关操作,增强可读性;
- Transaction Call 是实际触发 SAP 事务码的操作节点;
- 支持变量引用{ORDER_NUM}和子程序调用,体现脚本灵活性。
数据表:Test Step 结构字段说明
| 字段名 | 类型 | 含义 |
|---|---|---|
| STEP_NUMBER | NUMC(3) | 步骤编号,决定执行顺序 |
| DESCRIPTION | CHAR(50) | 步骤描述,如“创建销售订单” |
| TRAN_CODE | CHAR(20) | 对应事务码(如 VA01) |
| CALL_TYPE | CHAR(1) | 调用类型:T=Transaction, F=Function Module |
| ACTIVE | FLAG | 是否启用该步骤 |
| SYNC_POINT | FLAG | 是否设置同步点 |
这些字段存储在内部表 IT_TESTSTEP 中,可在脚本中通过 READ TABLE 查询特定步骤的状态。
示例:手动添加 Transaction Call 的脚本片段
* 在ABAP Script中显式调用VA01事务
CALL TRANSACTION 'VA01' USING bdcdata MODE 'N' MESSAGES INTO bdcmsgcoll.
* 构造BDC数据表
APPEND INITIAL LINE TO bdcdata ASSIGNING FIELD-SYMBOL(<bdc_line>).
<bdc_line>-program = 'SAPMV45A'.
<bdc_line>-dynpro = '1000'.
<bdc_line>-dynbegin = 'X'.
APPEND <bdc_line>.
<bdc_line>-fnam = 'BAPI_VBAK-KUNNR'.
<bdc_line>-fval = '0000123456'.
参数说明与逻辑分析 :
-CALL TRANSACTION ... USING bdcdata是标准 BDC 调用方式,兼容 eCATT 运行环境;
-MODE 'N'表示无中断模式,适合自动化执行;
-bdcdata是 BDCDATA 结构的内表,用于传递屏幕字段值;
-dynbegin = 'X'标记新屏幕开始;
- 字段fnam必须与目标事务的实际字段名一致,否则导致输入失败。
该机制允许高级用户绕过图形化录制,直接编写精确控制逻辑,特别适用于需要动态判断跳转路径的场景。
2.1.3 界面事件捕获机制与屏幕元素识别逻辑
eCATT 录制过程的核心是对 SAP GUI 界面上发生的用户交互事件进行监听与解析。这一过程依赖于 SAP GUI Scripting Engine 提供的接口能力,但 eCATT 在此基础上进行了更高层次的抽象处理。
事件捕获流程(Mermaid 流程图)
sequenceDiagram
participant User
participant SAPGUI as SAP GUI
participant ScriptingEngine as Scripting Engine
participant eCATTRecorder as eCATT Recorder
participant ABAPScript as ABAP Script Generator
User->>SAPGUI: 点击输入框并输入值
SAPGUI->>ScriptingEngine: 触发OnGuiEvent("SetFocus", FieldName)
ScriptingEngine->>eCATTRecorder: 传递字段名与新值
eCATTRecorder->>ABAPScript: 解析语义 → 生成SET PARAMETER语句
ABAPScript-->>eCATTRecorder: 返回脚本片段
eCATTRecorder->>SAPGUI: 回写至测试用例编辑器
流程说明 :
- 用户操作首先被捕获为 GUI 层事件;
- Scripting Engine 将原始事件转换为结构化数据;
- eCATT Recorder 判断是否为有效输入动作(如非导航键);
- 最终交由 ABAP Script Generator 生成标准化命令。
屏幕元素识别策略
eCATT 并不依赖控件坐标定位,而是基于 SAP 屏幕的 DynPro(Dynamic Program)结构 进行识别。每个屏幕由三部分唯一确定:
- Program Name (如 SAPMV45A)
- Screen Number (如 1000)
- Field Name (如 BAPI_VBAK-KUNNR)
系统通过如下方式提取字段路径:
* 模拟字段识别逻辑
FORM identify_field USING p_program TYPE progname
p_screen TYPE screen_nr
p_field TYPE dyn_fnam
RETURNING VALUE(r_logical_path) TYPE string.
CONCATENATE p_program '-' p_screen '/' p_field INTO r_logical_path.
ENDFORM.
逻辑分析 :
- 输入参数来自 GUI Scripting 接口回调;
- 输出结果形如SAPMV45A-1000/BAPI_VBAK-KUNNR,作为脚本中字段引用依据;
- 此路径在回放时用于反向查找目标输入框,确保跨系统一致性。
动态字段处理挑战与应对
当同一事务在不同客户端显示不同字段(因变式或权限差异),可能导致录制脚本无法回放。解决方案包括:
- 使用 Field Variants 统一界面布局;
- 在脚本中加入条件判断:
IF sy-langu = 'ZH'.
SET PARAMETER ID 'KUN' FIELD '0000123456'.
ELSE.
SET PARAMETER ID 'KU' FIELD '0000123456'.
ENDIF.
此类处理提升了脚本对多语言、多环境部署的适应能力。
2.2 脚本录制过程的技术实现
脚本录制不仅是“按下开始—执行操作—停止”的简单过程,其背后涉及 SAP GUI 与 ABAP 运行时之间的深度协作。理解这一过程的技术细节,有助于规避常见问题,如遗漏操作、误录快捷键等。
2.2.1 SAP GUI Scripting引擎的工作原理
SAP GUI Scripting 是一套 COM-based 接口,允许外部程序访问 GUI 元素及其状态。eCATT 利用此接口实现对用户操作的实时监听。
要启用该功能,必须满足以下前提:
- 客户端安装支持 scripting 的 SAP GUI 版本;
- 在登录界面勾选“Enable Scripting”选项;
- 或通过注册表设置:
HKEY_CURRENT_USER\Software\SAP\SAPGUI Front\Sessions\ScriptingEnabled = 1
一旦激活,GUI 会启动一个名为 SAPROTCTRLLib.SapROTWrapper 的 COM 服务,提供全局对象访问入口。
获取会话对象的 VBA 示例(辅助理解)
Set WshShell = CreateObject("WScript.Shell")
Set SapGuiAuto = GetObject("SAPGUI")
Set application = SapGuiAuto.GetScriptingEngine
Set connection = application.Children(0)
Set session = connection.Children(0)
session.findById("wnd[0]/usr/txfield").Text = "Hello"
尽管 eCATT 不使用 VBA,但其底层通信机制与此类似,均通过
findById路径定位控件。
eCATT Recorder 在运行时注入代理监听器,拦截所有 OnUserAction 事件,并将其转化为 ABAP 可识别的命令序列。
事件过滤机制
为了避免记录无关操作(如鼠标悬停、滚动条拖动),eCATT 实施了严格的事件筛选规则:
| 事件类型 | 是否记录 | 条件 |
|---|---|---|
| SetFocus + ChangeValue | 是 | 输入字段发生更改 |
| Command: Enter, F8 | 是 | 显式提交指令 |
| Hotkey: Ctrl+S | 否 | 非标准保存路径 |
| MouseMove | 否 | 无业务语义 |
这种选择性捕获策略显著减少了脚本体积,提高了执行效率。
2.2.2 用户操作到ABAP命令的映射规则
eCATT 的智能化体现在它能将低级 GUI 操作转化为高级 ABAP 命令。以下是典型映射关系表:
| 用户操作 | 生成的ABAP命令 | 说明 |
|---|---|---|
| 在字段输入值 | SET PARAMETER ID 'MAT' FIELD lv_material. | 参数ID需预先配置 |
| 按下Enter键 | CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN. | 自动跳过初始屏 |
| 选择表格行 | SET CURSOR LINE 5. | 设置光标位置 |
| 勾选复选框 | SET FIELD 'BDC_OKCODE' TO '/01'. | 模拟点击按钮 |
示例:采购订单创建中的映射过程
假设用户执行 ME21N 创建 PO,输入供应商编号 LFA1-LIFNR = '0000100001' ,系统生成如下脚本:
SET PARAMETER ID 'LIF' FIELD '0000100001'.
CALL TRANSACTION 'ME21N' USING bdc_data MODE 'A'.
若未配置参数 ID,则退化为屏幕级输入:
APPEND INITIAL LINE TO bdc_data ASSIGNING <fs>.
<fs>-program = 'SAPLMEME'.
<fs>-dynpro = '0100'.
<fs>-fnam = 'EKKO-LIFNR'.
<fs>-fval = '0000100001'.
可见,参数 ID 的存在极大提升了脚本简洁性与可移植性。
2.2.3 录制过程中动态变量的自动生成策略
为提高脚本复用性,eCATT 在录制阶段即尝试识别常量并替换为变量。这一过程称为 自动参数化(Auto-Parameterization) 。
变量识别规则
系统根据字段用途自动分类:
| 字段类型 | 处理方式 |
|---|---|
| 主键类(物料号、订单号) | 替换为 {MATNR} , {VBELN} |
| 时间日期 | 替换为 sy-datum , sy-uzeit |
| 数值输入(金额、数量) | 提取为 {QUANTITY} , {AMOUNT} |
| 文本备注 | 保留原值或设为空字符串 |
示例:动态变量插入
原操作输入 100 件商品,系统生成:
DATA: lv_qty TYPE p DECIMALS 0.
lv_qty = {QUANTITY}. " 自动绑定变量池
SET FIELD 'EKPO-MENGE' TO lv_qty.
{QUANTITY}将在运行时从数据容器(Data Container)中获取实际值。
自定义变量模板配置
可通过事务码 SEOA 编辑变量映射规则,例如:
{
"field_pattern": "EKPO-MENGE",
"variable_name": "QUANTITY",
"data_type": "P",
"default_value": "1"
}
此举使团队可统一变量命名规范,避免混乱。
2.3 回放机制与执行上下文管理
回放是测试验证的关键环节,其稳定性直接影响自动化成功率。eCATT 通过精细化的上下文管理和同步机制保障回放准确性。
2.3.1 回放时的会话控制与状态保持
每次回放均在一个独立的 LUW(Logical Unit of Work) 中执行,保证事务完整性。系统维护以下上下文信息:
- 当前事务码堆栈
- 屏幕历史栈(Screen Stack)
- 变量作用域链
- 错误消息缓冲区
CLASS lcl_context_manager DEFINITION.
PUBLIC SECTION.
DATA: current_transaction TYPE tcode,
screen_stack TYPE TABLE OF ty_screen_entry,
var_scope TYPE REF TO data,
error_buffer TYPE TABLE OF bapiret2.
ENDCLASS.
该类模拟 eCATT 内部上下文管理器,确保跨步骤状态延续。
2.3.2 屏幕等待策略与同步点设置(Sync Points)
网络延迟或系统负载可能导致屏幕未及时加载,引发“找不到字段”错误。为此,eCATT 支持三种等待策略:
| 策略 | 描述 | 配置方式 |
|---|---|---|
| Implicit Wait | 固定等待时间(秒) | Synchronous Update Timeout |
| Explicit Wait | 等待特定字段出现 | Sync Point on Field |
| Polling | 定期轮询直到条件满足 | 自定义脚本循环 |
设置显式同步点示例
WHILE NOT is_field_ready( 'SAPMV45A', '1000', 'BAPI_VBAK-VBELN' ).
WAIT UP TO 1 SECOND.
ENDWHILE.
is_field_ready为伪函数,实际通过 RFC_READ_TABLE 查询 GUI 元数据。
推荐在关键断点(如报表输出页)设置 Sync Point,提升健壮性。
2.3.3 异常中断后的恢复机制与断点续跑支持
eCATT 支持 Checkpoint Resume 功能,允许从中断处继续执行。
实现机制如下:
- 每个 Test Step 执行前后记录日志条目;
- 发生错误时,保存当前 Step Number 至临时变量;
- 用户修复问题后,选择“Resume from Step X”。
IF sy-subrc <> 0.
WRITE: / 'Error at Step:', gv_current_step.
EXPORT gv_current_step TO MEMORY ID 'ECATT_RESUME'.
STOP.
ENDIF.
下次运行时检测内存 ID 是否存在,若存在则跳转至指定步骤。
2.4 录制模式的选择与优化建议
合理选择录制模式可大幅提升脚本质量。
2.4.1 标准录制 vs 结构化录制的应用场景对比
| 特性 | 标准录制 | 结构化录制 |
|---|---|---|
| 适用人群 | 业务用户 | 开发人员 |
| 输出形式 | 连续步骤流 | 模块化子程序 |
| 可维护性 | 低 | 高 |
| 支持条件分支 | 否 | 是 |
| 推荐用途 | 快速原型 | 生产级测试 |
2.4.2 减少冗余步骤的剪裁技术
使用“Clean Up Script”功能删除多余 Enter/F3 操作,保留必要导航。
2.4.3 提高脚本可维护性的结构化设计原则
- 每个业务动作封装为独立 Test Step;
- 使用 Include 程序共享公共逻辑;
- 添加注释说明每步意图;
- 变量集中声明,避免分散定义。
以上机制协同工作,构成了 eCATT 录制与回放的强大基础,为后续高级功能(如数据驱动、CI/CD 集成)铺平道路。
3. SAP Scripting语言基础与高级逻辑编写
SAP eCATT 的强大之处不仅在于其图形化录制能力,更体现在其内置的脚本编程能力——通过 ABAP Script in eCATT,测试人员可以实现复杂的业务逻辑控制、动态行为处理以及系统级交互。本章深入剖析 eCATT 脚本语言的核心语法结构,并结合实际场景探讨如何利用流程控制、外部调用和模块化设计提升自动化测试的灵活性与可维护性。
eCATT 使用一种受限但功能完整的 ABAP 子集作为其脚本语言,允许在测试步骤之间插入自定义代码块。这些脚本运行于 SAP 应用服务器的 ABAP 运行时环境中,具备访问系统变量、调用函数模块、执行条件判断等能力。相较于传统的 GUI 自动化工具(如 Selenium),eCATT 的脚本具有更高的稳定性与集成深度,尤其是在涉及后台作业调度、BAPI 调用或跨事务数据传递时展现出显著优势。
随着企业 SAP 系统复杂度上升,测试需求已从“点击按钮并验证结果”演进为“模拟完整端到端业务流”,包括主数据创建、审批流触发、接口同步等多个环节。这就要求测试脚本不再局限于线性执行,而必须支持分支、循环、异常捕获等高级编程结构。因此,掌握 eCATT 脚本语言不仅是技术进阶的体现,更是构建高效、可靠测试体系的关键支撑。
3.1 ABAP Script in eCATT语法体系
eCATT 中的脚本编写基于简化版的 ABAP 语法,专为测试上下文优化,限制了部分高风险操作(如直接修改数据库表),同时保留了足够的表达能力以应对常见测试逻辑。理解其语法体系是构建复杂测试脚本的第一步。
3.1.1 变量声明与数据类型支持(C, N, D等类型)
在 eCATT 脚本中,变量需使用 DATA 语句显式声明,遵循 ABAP 风格的命名规范。支持的基本数据类型主要包括:
| 类型 | 描述 | 示例 |
|---|---|---|
C | 字符串类型,定长或变长 | DATA: lv_text TYPE C LENGTH 20. |
N | 数字字符串类型(仅包含数字字符) | DATA: lv_order TYPE N LENGTH 10. |
D | 日期类型(格式 YYYYMMDD) | DATA: lv_date TYPE D. |
T | 时间类型(格式 HHMMSS) | DATA: lv_time TYPE T. |
I | 整数类型 | DATA: lv_counter TYPE I VALUE 1. |
F | 浮点数类型 | DATA: lv_price TYPE F VALUE '99.99'. |
DATA: lv_user TYPE C LENGTH 12,
lv_client TYPE N LENGTH 3 VALUE '100',
lv_today TYPE D,
lv_count TYPE I.
lv_user = 'TESTUSER'.
lv_today = sy-datum.
逐行解析:
- 第1–4行:声明四个变量,分别用于存储用户名、客户端编号、当前日期和计数器。
-
TYPE C LENGTH 12表示一个最多12个字符的字符串变量; -
VALUE '100'在声明时初始化值; -
sy-datum是 ABAP 系统字段,表示当前日期,自动填充为 YYYYMMDD 格式; - 所有变量均在 eCATT 的执行上下文中持久化,可在后续测试步骤中引用。
⚠️ 注意:eCATT 不支持所有 ABAP 数据类型(如
P压缩数、结构体STRUCTURE或内表INTERNAL TABLE的复杂定义),但在简单场景下足以满足参数传递和逻辑判断需要。
此外,变量作用域默认为整个测试用例(Test Case Level),即在一个测试用例的所有脚本段之间共享。若需隔离上下文,可通过命名约定(如前缀区分)或子程序封装来实现。
3.1.2 表达式计算与内置函数调用(如sy-uzeit, sy-datum)
eCATT 支持常见的算术运算和系统函数调用,便于生成动态值。例如,在创建采购订单时,常需基于当前时间生成唯一描述符。
DATA: lv_hour TYPE I,
lv_min TYPE I,
lv_sec TYPE I,
lv_desc TYPE C LENGTH 50.
lv_hour = sy-uzeit(2). " 提取小时部分(前2位)
lv_min = sy-uzeit+2(2). " 提取分钟部分(第3-4位)
lv_sec = sy-uzeit+4(2). " 提取秒部分(第5-6位)
CONCATENATE 'AUTO_PO_' lv_hour '_' lv_min '_' lv_sec INTO lv_desc.
参数说明:
-
sy-uzeit:ABAP 系统变量,表示当前时间(HHMMSS); -
(2):表示从左侧开始截取前2个字符; -
+2(2):偏移2位后取2位字符,适用于精确提取时间片段; -
CONCATENATE:字符串拼接函数,生成类似AUTO_PO_14_30_25的描述文本。
此方法广泛应用于生成唯一订单标题、日志标记或临时对象名称,避免硬编码带来的重复冲突问题。
graph TD
A[开始] --> B{获取当前时间 sy-uzeit}
B --> C[截取小时]
B --> D[截取分钟]
B --> E[截取秒]
C --> F[拼接成描述符]
D --> F
E --> F
F --> G[返回 lv_desc]
该流程图展示了从系统时间提取并组合成唯一标识的过程,体现了脚本对动态数据的处理能力。
3.1.3 条件判断语句(IF-ELSE)的嵌入方式
eCATT 支持标准的 IF-ELSE-ENDIF 结构,可用于根据运行时状态决定执行路径。例如,在不同客户端环境下选择不同的物料组。
DATA: lv_client TYPE N LENGTH 3,
lv_matgrp TYPE C LENGTH 10.
lv_client = '100'.
IF lv_client = '100'.
lv_matgrp = 'RAW'.
ELSEIF lv_client = '200'.
lv_matgrp = 'FIN'.
ELSE.
lv_matgrp = 'MISC'.
ENDIF.
" 将结果写入参数供后续事务使用
SET PARAMETER ID 'MAT' FIELD lv_matgrp.
逻辑分析:
-
IF lv_client = '100'.判断当前客户端是否为 100; - 满足条件则设置物料组为
'RAW'; -
SET PARAMETER ID 'MAT' FIELD lv_matgrp.将变量值注入 SAP 参数缓冲区,供后续事务码(如 MM01)读取; - 此机制实现了环境感知的测试行为切换,无需修改脚本本身即可适应多系统部署。
此类条件逻辑还可扩展至版本兼容性判断、用户权限检测、数据存在性校验等场景,极大增强了脚本的智能性。
3.2 流程控制结构的编程实践
为了应对批量输入、错误恢复和代码复用等需求,eCATT 提供了有限但实用的流程控制结构。合理运用这些结构可显著提升脚本的鲁棒性和可维护性。
3.2.1 循环结构(DO, WHILE)在批量输入中的应用
当需要模拟批量创建多个条目时(如多个行项目),可使用 DO ... ENDDO 或 WHILE ... ENDWHILE 循环。以下示例演示如何通过循环向采购订单添加5个行项。
DATA: lv_index TYPE I VALUE 1,
lv_item TYPE N LENGTH 5.
DO 5 TIMES.
lv_item = lv_index.
" 使用 SET PARAMETER 注入行项目号
SET PARAMETER ID 'EME' FIELD lv_item. " EME = Item Number
" 触发“新增行”动作(假设已在 ME21N 中配置相应按钮映射)
CALL TRANSACTION 'ME21N' WITH AUTHORITY-CHECK USING
'BDC_INSERT', 'SAPMM06E', 'BDC_OKCODE', '/00'.
lv_index = lv_index + 1.
ENDDO.
执行逻辑说明:
-
DO 5 TIMES.执行固定次数循环; - 每次循环中将当前索引赋值给
lv_item; -
SET PARAMETER ID 'EME'设置 SAP 动态屏幕参数,影响后续 BDC 录制行为; -
CALL TRANSACTION显式调用事务码并携带 OKCODE 指令,模拟用户点击; - 循环结束后自动退出,继续执行后续步骤。
✅ 实际应用建议:配合数据驱动机制(见第四章),可将循环次数设为变量,从外部文件读取总行数,实现真正意义上的灵活批量处理。
3.2.2 子程序调用(INCLUDE)与代码复用机制
虽然 eCATT 不支持完整的 FORM 或 FUNCTION MODULE ,但可通过 INCLUDE 语句引入预定义的代码片段,实现一定程度的代码复用。
首先,在 ABAP 工作台中创建一个名为 Z_ECATTCODE_INCLUDE 的 INCLUDE 程序,内容如下:
* Z_ECATTCODE_INCLUDE: 公共辅助函数库
DEFINE set_material_group.
DATA: lv_matgrp TYPE C LENGTH 10.
lv_matgrp = &1.
SET PARAMETER ID 'MAT' FIELD lv_matgrp.
END-OF-DEFINITION.
然后在 eCATT 脚本中引用:
INCLUDE Z_ECATTCODE_INCLUDE.
set_material_group 'RAW'.
参数说明:
-
INCLUDE必须指向有效的 ABAP INCLUDE 对象; -
DEFINE ... END-OF-DEFINITION定义宏,&1表示第一个参数; - 调用时传入
'RAW',替换&1并执行设定逻辑; - 此方式适合封装常用操作(如登录、参数设置、日志记录)以减少重复代码。
3.2.3 错误处理块(ON ERROR)的定义与跳转逻辑
eCATT 提供 ON ERROR 指令用于捕获运行时异常,防止脚本因单一错误中断整体执行。
ON ERROR GOTO error_handler.
DATA: lv_result TYPE I.
lv_result = 1 / 0. " 故意引发除零错误
WRITE: / 'This will not be executed'.
error_handler:
WRITE: / 'An error occurred – handled gracefully'.
SET PARAMETER ID 'ERR' FIELD 'DIV_ZERO'.
异常处理机制说明:
-
ON ERROR GOTO label指定出错时跳转的目标标签; - 当发生运行时错误(如除零、空指针)时,控制权立即转移;
-
GOTO后续代码仍可继续执行,实现“软失败”策略; - 结合适当的日志输出或状态标记,有助于后期分析失败原因。
🛠️ 使用建议:应在关键操作前启用错误处理,特别是在调用 RFC 或更新主数据时,确保即使某一步骤失败也不会导致整个测试套件崩溃。
3.3 动态行为控制与外部接口调用
现代 SAP 测试往往涉及跨组件协作,仅靠 GUI 操作难以覆盖全部场景。eCATT 提供多种机制实现动态行为控制与系统级交互。
3.3.1 使用CALL METHOD调用BAPI或RFC函数
通过 CALL METHOD 可直接调用 BAPI 或远程函数模块,绕过 GUI 层进行高效数据操作。
DATA: lv_salesorder TYPE VBELN,
lt_return TYPE TABLE OF BAPIRET2,
ls_return TYPE BAPIRET2.
CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'
EXPORTING
SALESDOCUMENTIN = ''
ORDER_HEADER_IN = VALUE BAPISDHDR( DOC_TYPE = 'OR' )
IMPORTING
SALESDOCUMENT = lv_salesorder
TABLES
RETURN = lt_return.
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
ELSE.
READ TABLE lt_return INTO ls_return WITH KEY type = 'E'.
WRITE: / 'Error:', ls_return-message.
ENDIF.
参数解释:
-
BAPI_SALESORDER_CREATEFROMDAT2:创建销售订单的标准 BAPI; -
EXPORTING:传入订单类型等信息; -
IMPORTING:接收生成的订单号; -
TABLES RETURN:获取执行反馈信息; -
sy-subrc检查调用结果,成功则提交事务; - 此方式比 GUI 录制快得多,且不受界面响应延迟影响。
3.3.2 在脚本中触发后台作业并监控执行状态
某些流程(如报表批量运行)需异步执行。可通过 JOB OPEN , JOB SUBMIT , JOB CLOSE 控制后台作业。
DATA: jobname LIKE tbtco-jobname VALUE 'ZBILL_REPORT',
jobcount LIKE tbtcm-jobcount,
retval LIKE sy-subrc.
SUBMIT zbilling_report AND RETURN.
GET RUN TIME FIELD jobstart.
WHILE retval = 0.
CALL FUNCTION 'BP_JOB_STATUS'
EXPORTING
jobname = jobname
IMPORTING
jobstatus = lv_status
retval = retval.
IF lv_status = 'F'.
EXIT.
ENDIF.
WAIT UP TO 5 SECONDS.
ENDWHILE.
流程说明:
-
SUBMIT ... AND RETURN异步启动报表; -
GET RUN TIME记录起始时间; -
BP_JOB_STATUS查询作业状态; -
WAIT UP TO 5 SECONDS避免频繁轮询; - 直至作业完成(状态为 ‘F’)才继续下一步。
3.3.3 利用SYSTEM CALL执行操作系统级指令
在特殊场景下(如清理临时文件、启动外部工具),可使用 SYSTEM CALL 执行 OS 命令。
SYSTEM CALL 'cmd.exe /c del C:\temp\*.tmp' IGNORING CONDENSED MODE.
⚠️ 安全警告:此功能通常被禁用,需管理员授权;且仅限于应用服务器本地执行,不可用于客户端机器。
3.4 高级编码技巧与最佳实践
3.4.1 模块化脚本设计以提升可读性
推荐将脚本划分为逻辑模块:
* === 初始化 ===
INIT_SECTION.
DATA: lv_env TYPE C LENGTH 10 VALUE 'PROD'.
* === 数据准备 ===
PREPARE_DATA.
INCLUDE Z_ECATTC_INIT_DATA.
* === 主流程 ===
MAIN_FLOW.
DO 3 TIMES.
CALL TRANSACTION 'ME21N' ...
ENDDO.
* === 清理 ===
CLEANUP.
SET PARAMETER ID 'MAT' FIELD ''.
通过注释分隔和结构化布局提高可读性。
3.4.2 日志输出控制与调试信息注入
使用 WRITE 输出调试信息:
WRITE: / 'Start processing at:', sy-datum, sy-uzeit.
输出将显示在 eCATT 执行日志中,便于追踪执行轨迹。
3.4.3 避免硬编码的配置分离方案
将环境相关参数外置:
DATA: BEGIN OF config OCCURS 0,
key TYPE C LENGTH 20,
value TYPE C LENGTH 50,
END OF config.
config-key = 'PO_TYPE'; config-value = 'NB'. APPEND config.
config-key = 'PLANT'; config-value = '1000'. APPEND config.
运行时根据 key 查找 value ,实现配置集中管理。
综上所述,eCATT 脚本语言虽受限于安全模型,但仍提供了丰富的编程能力。通过合理运用变量、流程控制、外部调用和模块化设计,可构建出高度灵活、稳定可靠的自动化测试解决方案。
4. 数据驱动测试实现与外部数据源(如Excel)集成
在现代企业级SAP系统测试实践中,单一输入组合的验证已无法满足复杂业务场景下的质量保障需求。随着SAP系统中业务流程日益庞大、交互逻辑愈发精细,测试用例的数量和覆盖维度呈指数级增长。传统的静态脚本执行方式不仅维护成本高,且难以应对多环境、多用户、多参数组合的实际运行条件。为此, 数据驱动测试 (Data-Driven Testing, DDT)成为提升自动化测试效率与覆盖率的核心策略之一。
数据驱动测试的本质在于将“测试逻辑”与“测试数据”进行解耦,使同一套测试脚本能够基于不同的输入数据集重复执行,从而显著减少代码冗余、增强测试灵活性,并支持大规模回归测试的自动化调度。尤其在SAP环境中,面对诸如采购订单创建(ME21N)、销售订单处理(VA01)、财务过账(FB50)等高度依赖业务数据的操作事务,能否高效接入并管理外部数据源,直接决定了eCATT测试框架的实用性与扩展性。
本章聚焦于SAP eCATT平台下数据驱动测试的完整实现路径,深入剖析其设计理念、技术架构以及与主流外部数据源(特别是Excel文件)的集成机制。通过构建可复用的数据模型、定义清晰的映射规则、设计健壮的异常处理流程,结合实际案例演示如何从Excel或CSV文件中读取结构化数据并驱动SAP事务码执行,最终形成一套具备生产级可用性的自动化测试解决方案。
4.1 数据驱动测试的设计理念与模型构建
数据驱动测试并非简单地将变量替换为参数,而是一种系统化的测试架构设计方法。其核心思想是将测试行为抽象为“不变”的操作流程,而把变化的部分——即输入数据与预期结果——剥离到独立的数据容器中。这种分离使得测试脚本更具通用性和可维护性,尤其适用于需要频繁变更测试条件或批量验证多种数据组合的场景。
4.1.1 静态数据 vs 动态数据的使用边界划分
在实施数据驱动测试前,首要任务是对测试数据进行分类,明确哪些数据适合内嵌于脚本中(静态数据),哪些应由外部提供(动态数据)。
| 数据类型 | 特征描述 | 使用场景示例 | 是否推荐外置 |
|---|---|---|---|
| 静态数据 | 在所有测试环境中保持一致,极少变动 | 客户端编号、公司代码、语言设置 | 否 |
| 半动态数据 | 环境相关但格式固定 | 测试用户ID、组织单元 | 是(通过配置文件) |
| 完全动态数据 | 每次执行都需更新或随机生成 | 订单号、物料描述、金额 | 是(必须外置) |
静态数据通常作为默认值存在于脚本内部,例如 sy-mandt = '100' 这类不会随环境改变的基础参数。而动态数据则必须从外部加载,以确保跨开发、测试、预生产环境的一致性与隔离性。例如,在执行采购订单测试时,“供应商编码”、“采购组织”可能因环境不同而异;“订单数量”、“价格”则需模拟真实波动范围。若这些值被硬编码在脚本中,一旦环境切换或数据变更,就必须修改脚本本身,违背了自动化测试的初衷。
因此,合理的做法是仅保留不可变的控制逻辑在脚本中,其余全部交由外部数据源驱动。这不仅提升了脚本的可移植性,也为后续集成CI/CD流水线奠定了基础。
4.1.2 参数化输入与预期结果分离的设计模式
一个完整的数据驱动测试模型应当包含两个关键组成部分: 输入参数集 和 预期输出断言 。二者应分别存储在同一数据表的不同列中,形成“输入-输出”对照关系。
以采购订单创建为例,典型的数据结构如下所示:
+------------+--------------+----------------+----------+-----------+------------------+
| SupplierID | PurchOrg | Plant | Material | Quantity | ExpectedStatus |
+------------+--------------+----------------+----------+-----------+------------------+
| L1000 | PO10 | PL001 | MTR-001 | 100 | Created Successfully |
| L1001 | PO11 | PL002 | MTR-002 | 200 | Vendor Not Found |
+------------+--------------+----------------+----------+-----------+------------------+
在此模型中:
- 前四列为 输入参数 ,用于填充ME21N事务码中的字段;
- 最后一列为 预期状态 ,可在脚本回放结束后用于断言实际结果是否匹配。
该设计的优势在于:
1. 支持负面测试(Negative Testing):通过预设错误条件(如无效供应商),验证系统的容错能力;
2. 易于扩展:新增测试用例只需添加行记录,无需改动脚本;
3. 可视化程度高:测试人员可通过查看数据表快速理解测试覆盖范围。
4.1.3 多数据集批量执行的架构支撑
为了实现多行数据的逐条执行,eCATT提供了内置的 迭代控制机制 ,允许脚本在一个循环结构中依次读取每一行数据并触发事务调用。这一过程依赖于“Internal Table”对象来承载外部导入的数据集。
DATA: lt_data TYPE TABLE OF zddt_me21n,
ls_data TYPE zddt_me21n.
" 假设数据已从Excel导入至lt_data
LOOP AT lt_data INTO ls_data.
" 调用ME21N事务并传入当前行数据
CALL TRANSACTION 'ME21N' USING bdcdata MODE 'N'.
ENDLOOP.
上述伪代码展示了基本的循环逻辑。在eCATT中,此功能通过“Test Data Container”与“Loop Step”组件协同完成。具体而言:
- Test Data Container :定义数据结构(类似ABAP中的Structure),声明各字段名称与类型;
- Loop Step :绑定该容器,指示eCATT对每一条记录执行一次完整的事务流。
此外,还支持条件跳过、失败中断、日志标记等功能,确保即使某一行执行失败,其余数据仍可继续处理,符合企业级批量测试的需求。
flowchart TD
A[开始执行] --> B{是否存在更多数据行?}
B -- 是 --> C[读取下一行数据]
C --> D[填充BDC会话数据]
D --> E[执行事务码ME21N]
E --> F{执行成功?}
F -- 是 --> G[记录成功日志]
F -- 否 --> H[记录失败信息并继续]
G --> B
H --> B
B -- 否 --> I[结束测试]
该流程图清晰表达了数据驱动测试的主控逻辑:以数据行为单位进行迭代,每个周期独立封装输入、执行、验证三个阶段,保证了整体流程的稳定性和可观测性。
4.2 外部数据源接入技术路径
要真正实现数据驱动测试,必须解决外部数据源的接入问题。SAP eCATT原生支持多种数据载体,包括本地文本文件、Excel文档,甚至可通过RFC连接远程数据库获取实时数据。不同的接入方式各有优劣,需根据项目实际情况选择最优方案。
4.2.1 Excel文件通过OLE Automation导入的方法
Excel因其易用性和广泛普及,成为最常用的数据源格式之一。eCATT可通过 OLE Automation 技术直接调用Microsoft Excel应用程序,读取 .xls 或 .xlsx 文件中的工作表内容。
操作步骤:
- 在eCATT测试配置中启用“External Data Source”选项;
- 选择“OLE Object”类型,指定Excel文件路径;
- 配置工作簿名、工作表名及起始单元格范围(如Sheet1!A1:F100);
- 定义字段映射关系,将列标题与eCATT内部变量关联。
" 示例:通过ABAP Script调用OLE对象(简化版)
DATA: ole TYPE OLE2_OBJECT.
CREATE OBJECT ole 'Excel.Application'.
CALL METHOD OF ole 'Workbooks' = workbooks.
CALL METHOD OF workbooks 'Open' EXPORTING #1 = 'C:\TestData\PO_Data.xlsx' IMPORTING #1 = workbook.
CALL METHOD OF workbook 'Worksheets' = worksheets.
CALL METHOD OF worksheets 'Item' EXPORTING #1 = 'Sheet1' IMPORTING #1 = worksheet.
GET PROPERTY OF worksheet 'Cells' EXPORTING #1 = 2 #2 = 1 = cell_value.
逻辑分析 :
- 第1行:创建Excel应用实例;
- 第2~3行:打开指定文件并获取工作簿引用;
- 第4~5行:定位到目标工作表;
- 第6行:读取第2行第1列的值(即第一行数据);此方法依赖客户端安装Office软件,适用于本地测试环境,但在服务器端运行时存在兼容性风险。
参数说明:
-
'Excel.Application':OLE类标识符,表示启动Excel进程; -
EXPORTING #1,#2:传递方法参数的位置序号; -
IMPORTING:接收返回对象或值; -
GET PROPERTY:用于读取单元格内容。
尽管OLE方式灵活,但其稳定性受操作系统和权限限制影响较大,建议仅用于开发与UAT阶段。
4.2.2 使用TEXT Files作为轻量级数据载体的配置方式
对于追求稳定性和跨平台兼容性的场景,纯文本文件(如CSV)是更优选择。eCATT支持直接导入定界符分隔的文本文件(comma-, tab-separated),无需额外依赖第三方组件。
配置要点:
- 文件编码:推荐UTF-8,避免中文乱码;
- 分隔符:逗号
,或制表符\t; - 首行为字段名,便于自动映射;
- 文件路径:建议使用相对路径或环境变量替代绝对路径。
SupplierID,PurchOrg,Plant,Material,Quantity,ExpectedStatus
L1000,PO10,PL001,MTR-001,100,Created Successfully
L1001,PO11,PL002,MTR-002,200,Vendor Not Found
在eCATT中导入后,系统会自动生成对应的数据结构,并允许在脚本中通过 <field_name> 语法引用各列值。
优势对比:
| 维度 | Excel | CSV |
|---|---|---|
| 易编辑性 | 高(支持公式、格式) | 中(纯文本) |
| 兼容性 | 低(需Office) | 高(通用) |
| 自动化友好 | 低(OLE不稳定) | 高(标准格式) |
| 文件大小 | 较大 | 小 |
因此,在CI/CD流水线或无人值守自动化中,优先推荐使用CSV格式。
4.2.3 RFC连接远程数据库获取测试数据的可行性分析
当测试数据来源于其他系统(如ERP、MDM、Data Lake)时,可通过RFC函数从远程ABAP系统提取数据。这种方式适用于需要与主数据管理系统同步的高级场景。
实现方式:
- 编写一个远程可调用的Function Module(如
Z_GET_TEST_DATA_PO); - 在eCATT脚本中使用
CALL METHOD调用该RFC; - 将返回的内表赋值给Test Data Container。
CALL FUNCTION 'Z_GET_TEST_DATA_PO'
DESTINATION 'REMOTESYS'
TABLES
et_data = lt_external_data.
逻辑分析 :
-DESTINATION:指定逻辑目标系统(SM59中配置);
-TABLES:传输数据表参数;
-et_data:输出参数,接收来自远端系统的测试数据集。
此方法的最大优势在于实现了 数据与测试的物理分离 ,确保测试始终基于最新的业务数据快照。然而,它也带来了网络延迟、权限控制、接口稳定性等问题,需谨慎评估使用场景。
4.3 数据映射与变量绑定机制
无论采用何种数据源,最终都需要将外部数据准确映射到eCATT脚本中的变量或BDC输入字段。这一过程称为“变量绑定”,是数据驱动测试成败的关键环节。
4.3.1 Internal Table与外部列字段的匹配规则
eCATT通过“Data Declaration”区域定义一个Internal Table结构,其字段名必须与外部数据源的列名完全一致(区分大小写)。系统在加载数据时会自动按名称匹配。
例如,若Excel中有列名为 MaterialCode ,则Internal Table中也必须定义同名字段:
TYPES: BEGIN OF ty_testdata,
supplier_id TYPE char30,
purch_org TYPE char4,
plant TYPE char4,
materialcode TYPE matnr, " 注意:此处命名必须与Excel列名一致
quantity TYPE i,
END OF ty_testdata.
DATA: it_testdata TYPE STANDARD TABLE OF ty_testdata.
若名称不一致,即使语义相同也无法正确绑定,导致空值或报错。
4.3.2 数据类型转换异常的预判与处理
由于外部数据通常以字符串形式存储,而SAP字段具有严格的数据类型约束(如NUMC、DATS、CURR),因此在映射过程中极易发生类型转换错误。
常见问题及解决方案:
| 错误类型 | 表现形式 | 解决方案 |
|---|---|---|
| 字符串转数值失败 | Quantity = 'abc' → 类型不符 | 添加前置校验,过滤非法字符 |
| 日期格式不匹配 | 2025-04-05 ≠ SAP格式 YYYYMMDD | 使用 CONVERT DATE 函数标准化 |
| 长度超限 | 输入 Material 超过18位 | 截断或抛出警告 |
可在脚本中加入预处理逻辑:
IF ls_data-quantity CS 'AZaz'.
WRITE: / 'Error: Quantity contains non-numeric characters'.
CONTINUE.
ENDIF.
" 转换为整数
ls_bdc-data = ls_data-quantity.
同时,建议在数据源中加入数据清洗步骤,确保输入质量。
4.3.3 支持多行迭代的数据循环控制策略
eCATT支持两种主要的循环模式:
- For Each Row :逐行遍历,每行触发一次事务执行;
- Batch Mode :将多行数据打包成一个BDC会话,一次性提交(适用于批量输入场景)。
推荐使用前者,因其具备更好的错误隔离能力。可通过设置“Loop End Condition”来控制终止条件,如到达末尾或遇到特定标志位。
graph LR
Start --> LoadData[加载外部数据]
LoadData --> InitCounter[初始化行索引=1]
InitCounter --> CheckEOF{索引≤总行数?}
CheckEOF -- Yes --> ReadRow[读取第N行]
ReadRow --> MapVars[映射字段至变量]
MapVars --> Execute[执行事务]
Execute --> LogResult[记录结果]
LogResult --> IncCounter[索引+1]
IncCounter --> CheckEOF
CheckEOF -- No --> End
该流程确保了每条数据独立执行,便于追踪失败原因。
4.4 实际集成案例演示
4.4.1 从Excel读取采购订单测试数据并驱动ME21N事务码
目标:自动化创建多个采购订单,数据来源于Excel。
步骤分解:
- 准备Excel文件,包含字段:Supplier、PurchOrg、Plant、Material、Qty;
- 在eCATT中新建Test Data Container,定义相同字段;
- 配置OLE数据源,指向Excel文件;
- 录制ME21N事务流程,在关键字段处使用
<FieldName>占位符; - 插入Loop Step,绑定数据容器;
- 执行并查看日志。
" BDC调用片段示例
PERFORM bdc_field USING 'BDC_CURSOR' 'EKKO-LPEIN'.
PERFORM bdc_field USING 'EKKO-LIFNR' <Supplier>.
PERFORM bdc_field USING 'EKKO-EKORG' <PurchOrg>.
PERFORM bdc_field USING 'EKKO-WERKS' <Plant>.
<Supplier>等为动态变量,运行时由当前数据行填充。
4.4.2 基于CSV文件实现客户主数据批量创建
使用VA01事务码批量创建客户销售视图,数据源为CSV文件。
- 文件路径:
/usr/sap/testdata/customers.csv - 字段:CustomerID, SalesOrg, DistChannel, Division
- 脚本中使用“Text File”数据源类型导入
优势:无需Office,适合Linux服务器部署。
4.4.3 数据版本管理与测试环境适配方案
为应对多环境差异,建议建立“数据版本库”:
- 按环境(DEV/QAS/PRD)划分目录;
- 使用YAML或JSON文件定义环境参数(如客户端、用户名);
- 在Jenkins Pipeline中动态注入变量。
最终实现“一套脚本 + 多套数据”的灵活部署架构,全面提升测试敏捷性与可靠性。
5. 测试数据准备与参数化策略
在SAP系统的自动化测试实践中,测试数据的质量和可维护性直接决定了测试用例的可靠性、复用性和执行效率。尤其在eCATT(Extended Computer Aided Test Tool)环境中,由于其高度依赖于真实业务场景下的GUI交互路径与后端数据状态,测试数据不再是简单的输入值集合,而是构成整个测试上下文的核心要素。本章节将深入探讨如何系统性地设计测试数据结构,建立科学的数据管理机制,并通过精细化的参数化策略提升测试脚本的灵活性与适应能力。
5.1 测试数据的分类与生命周期管理
5.1.1 独立数据、共享数据与临时数据的应用场景
在eCATT测试中,根据数据的作用范围与使用频率,可以将其划分为三类典型形态:独立数据、共享数据和临时数据。
独立数据 是指专属于某个特定测试用例的数据集,通常用于验证孤立的功能点或边界条件。例如,在创建采购订单ME21N事务码测试中,使用的供应商编号、物料编码等信息仅服务于该用例,不与其他测试交叉引用。这类数据的优势在于隔离性强、调试简单,但缺点是重复定义多,维护成本高。
共享数据 则被多个测试用例共同引用,常见于主数据或配置数据,如公司代码、工厂、销售组织等。此类数据一般存储于全局参数文件或外部数据库中,确保跨测试的一致性。使用共享数据能显著减少冗余配置,但也引入了耦合风险——一旦共享数据被修改或删除,可能影响大量相关测试。
临时数据 是运行时动态生成并仅供单次执行使用的数据,如带时间戳的客户名称、随机生成的订单号等。这种数据常用于避免主键冲突或模拟并发操作,特别适用于回归测试套件的大规模并行执行。
| 数据类型 | 使用场景 | 可维护性 | 并发安全性 | 示例 |
|---|---|---|---|---|
| 独立数据 | 单个功能验证 | 高(局部控制) | 中(需命名规范) | 特定测试专用物料 |
| 共享数据 | 跨模块通用配置 | 低(集中管理) | 低(易引发冲突) | 工厂”1000”、货币”USD” |
| 临时数据 | 动态生成防重 | 极高(自动清理) | 高(唯一标识) | CUST_20250405_1234 |
flowchart TD
A[测试开始] --> B{是否需要预置数据?}
B -- 是 --> C[加载独立/共享数据]
C --> D[生成临时数据]
D --> E[执行测试步骤]
E --> F{测试成功?}
F -- 否 --> G[记录错误 & 保留现场]
F -- 是 --> H[触发数据清理]
H --> I[回滚或删除临时数据]
I --> J[结束测试]
上述流程图展示了测试数据从准备到清理的完整生命周期。值得注意的是,临时数据虽然提升了并发安全,但在失败情况下若未妥善保留,可能导致问题无法复现。因此,建议结合日志标记与可选保留机制进行平衡处理。
5.1.2 数据准备的前置条件与依赖关系梳理
成功的测试执行往往建立在正确的数据前提之上。以“创建销售订单”为例,其前置条件包括:
- 客户主数据已存在;
- 物料主数据包含销售视图;
- 销售区域(销售组织+分销渠道+部门)已配置;
- 定价条件记录就绪。
这些依赖构成了一个 数据依赖图谱 ,必须在测试启动前完成校验或初始化。否则即使脚本逻辑正确,也会因“数据缺失”导致失败,掩盖真正的功能缺陷。
为此,推荐采用分层数据准备策略:
- 基础层 :系统级配置数据(如公司代码、币种),通常由实施团队一次性导入;
- 主数据层 :客户、供应商、物料等,可通过LSMW或RFC批量加载;
- 事务数据层 :订单、发票等运行时生成的数据,适合由eCATT自身驱动创建。
实现这一策略的关键是在eCATT测试包中明确划分“数据准备用例”与“功能验证用例”。前者负责构建测试所需的最小数据集,后者专注于业务逻辑验证。两者之间可通过Test Runner的依赖调度机制实现顺序执行。
此外,还应建立 数据依赖清单表 ,如下所示:
| 测试用例 | 所需数据项 | 来源方式 | 是否自动准备 |
|---|---|---|---|
| ZTEST_SO_CREATE | SOLD_TO=CU001 | Excel导入 | 是 |
| MATNR=MAT8888 | RFC调用BAPI_MATERIAL_GET_DETAIL | 是 | |
| PRICE_COND=RPR001 | 手动配置 | 否 | |
| ZTEST_INVOICE_GEN | VBELN=SO100001 | 上游销售订单输出 | 依赖ZTEST_SO_CREATE |
此表格不仅辅助规划数据准备工作,还可作为自动化框架中的元数据输入,支持动态判断是否跳过准备阶段或强制重建环境。
5.1.3 数据清理机制与回滚脚本设计
测试完成后,及时清理产生的数据对于保障后续测试的纯净性至关重要。特别是在持续集成(CI)环境下,每次构建都应在干净状态下运行,避免“脏数据”污染结果。
eCATT本身不具备内置的事务回滚功能(如ABAP中的 ROLLBACK WORK ),因此必须显式编写 反向清除逻辑 。常见的清理手段包括:
- 调用取消/删除事务码(如VA02取消销售订单);
- 直接执行DELETE语句操作透明表(需谨慎授权);
- 触发后台作业批量清理测试标识数据。
以下是一个典型的回滚脚本片段(ABAP Script in eCATT):
* 清理测试生成的销售订单
DATA: lv_vbeln TYPE vbeln_va.
lv_vbeln = 'SO99999999'. " 可替换为变量传入
CALL TRANSACTION 'VA02' USING
'BDC_CURSOR' = 'RV45A-MABNR'
'BDC_OKCODE' = '/00'
'RV45A-KUNNR_FK' = 'CU001'
'RV45A-VBELN' = lv_vbeln.
CALL TRANSACTION 'VA02' USING
'BDC_CURSOR' = 'VBKD-BBSYS'
'BDC_OKCODE' = 'AKLO' " 删除订单
'VBKD-BBSYS' = ''.
逻辑分析与参数说明 :
CALL TRANSACTION 'VA02':进入销售订单更改界面。- 第一次调用定位目标订单(通过VBELN字段),
/00表示回车确认。- 第二次调用发送OKCODE
'AKLO',这是VA02中“删除”的标准命令代码。- 所有BDC字段均来自标准屏幕字段名,可通过SE80查看Dynpro结构获取。
- 实际应用中,
lv_vbeln应从主测试中传递过来,或从日志提取最新生成的单据号。
为了提高健壮性,建议在清理前加入存在性检查:
SELECT SINGLE vbeln FROM vbak INTO @lv_vbeln
WHERE vbeln = @lv_target_order AND loevm_neq = space.
IF sy-subrc = 0.
" 执行删除
ELSE.
WRITE: / 'Order not found or already deleted:', lv_target_order.
ENDIF.
该SQL查询验证订单是否存在且未被删除( loevm_neq 为空表示有效)。只有当记录存在时才发起删除操作,防止误删或异常中断。
最终,完整的数据生命周期应形成闭环: 准备 → 使用 → 验证 → 清理 ,并通过统一的日志标记(如 [DATA_SETUP] , [CLEANUP_START] )增强可追溯性。
5.2 参数化的层次结构设计
5.2.1 局部参数 vs 全局参数的作用域控制
参数化是提升eCATT脚本灵活性的核心手段。依据作用域的不同,参数可分为 局部参数 和 全局参数 两类。
局部参数 定义在单个测试用例内部(Transaction: SECATT → Test Case → Parameters),仅对该用例及其子步骤可见。适用于特定业务逻辑所需的数据,如某次采购申请的金额阈值、审批人ID等。
优点是封装良好,修改不影响其他用例;缺点是重复定义多,不利于统一调整。
全局参数 则定义在整个测试包或项目级别(通过Parameter Sets),可在多个测试用例间共享。典型用途包括:
- 登录凭据(User, Client, Language)
- 系统配置(Company Code, Plant)
- 环境标识(DEV, QAS, PRD)
全局参数通过SECATT中的“Parameter Set”功能管理,支持导出/导入,便于跨系统迁移。
合理的设计原则是: 越接近环境配置的数据,越应提升至全局层级;越贴近业务实例的数据,越应保留在局部 。
例如:
| 参数名称 | 类型 | 建议层级 | 说明 |
|---|---|---|---|
GS_USER | STRING | Global | 登录用户名 |
GS_CLIENT | NUMC(3) | Global | 客户端编号 |
GS_LANG | CHAR(1) | Global | 语言代码 |
LT_ITEM_MATNR | TABLE | Local | 行项目物料表 |
GV_ORDER_TYPE | CHAR(4) | Local | 订单类型(如OR, CR) |
通过这种分层设计,可以在不同环境中快速切换全局参数集,而无需改动具体测试逻辑。
5.2.2 环境相关参数的外部化配置(如客户端、语言)
在多环境部署(开发→测试→生产)中,硬编码参数会导致脚本不可移植。解决之道是将环境敏感参数 外部化 ,即从脚本中剥离,交由外部文件或配置中心管理。
一种高效做法是利用eCATT的 Parameter Set Import/Export 功能,结合操作系统批处理脚本实现自动化加载。
示例流程如下:
# Windows Batch Script: setup_env.bat
SET ENV=QAS
ecatt.exe -import_params %ENV%_params.xml -run_test ZTC_PURCHASE_TEST
对应的XML参数文件结构( QAS_params.xml ):
<?xml version="1.0" encoding="utf-8"?>
<PARAMETERS>
<PARAMETER NAME="GS_CLIENT" VALUE="400"/>
<PARAMETER NAME="GS_USER" VALUE="TESTER_QAS"/>
<PARAMETER NAME="GS_LANG" VALUE="E"/>
<PARAMETER NAME="GS_SERVER" VALUE="sapqas.internal"/>
</PARAMETERS>
在eCATT中可通过 IMPORT PARAMETERS FROM FILE 指令读取该文件:
IMPORT PARAMETERS FROM FILE 'C:\config\QAS_params.xml'.
执行逻辑说明 :
- 该命令在测试初始化阶段执行,覆盖当前所有同名参数值;
- 文件路径可为绝对或相对路径,建议统一放在中央配置目录;
- 若某些参数未在文件中定义,则保持原值不变;
- 支持变量嵌套,如
${SYSTEM_ROOT}\configs\${ENV}_params.xml。
这种方式实现了“一套脚本,多套配置”的理想状态,极大增强了跨环境执行能力。
5.2.3 动态生成唯一标识符(如订单号、物料编号)的算法实现
为了避免数据冲突,尤其是在并行测试或频繁回归中,静态数据极易造成主键重复。解决方案是引入 动态标识生成机制 。
常用方法包括:
-
时间戳组合法 :基于当前日期+时间生成唯一字符串
abap DATA: lv_time TYPE t, lv_date TYPE d. lv_time = sy-uzeit. " HHMMSS lv_date = sy-datum. " YYYYMMDD CONCATENATE 'MAT' lv_date+6(2) lv_time(6) INTO gv_matnr.
输出示例:MAT250405123456 -
序列号递增法 :借助自定义计数器表ZCOUNTER维护递增值
abap SELECT SINGLE currval FROM zcounter INTO @gv_counter WHERE objname = 'MATERIAL'. gv_counter = gv_counter + 1. UPDATE zcounter SET currval = @gv_counter WHERE objname = 'MATERIAL'. WRITE gv_counter TO gv_matnr NO-ZERO LEFT-JUSTIFIED. -
UUID模拟法 :使用随机数生成近似唯一ID
abap CALL FUNCTION 'GUID_CREATE' IMPORTING ev_guid_32 = gv_guid. REPLACE ALL OCCURRENCES OF '-' IN gv_guid WITH ''.
推荐优先使用第1种方式,因其无需额外数据库依赖,且具备天然排序特性,便于日志追踪。
5.3 数据上下文隔离与并发执行保障
5.3.1 用户会话级别的数据隔离机制
当多个eCATT测试并行运行时,若共用同一用户账号和数据空间,极易发生竞争条件。例如两个测试同时尝试创建客户编号”CUST001”,必然导致失败。
有效的隔离策略是为每个测试分配 独立的用户会话+专属数据命名空间 。
具体实施方案包括:
- 为自动化测试创建专用用户池(如AUTOTEST01 ~ AUTOTEST10);
- 每个测试绑定一个用户,并在其参数中设置
GS_USER = AUTOTEST01; - 所有生成的数据附加用户标识,如客户名=
[T01] Customer A;
这样即使多个测试同时运行,也能通过用户名区分上下文,降低干扰概率。
5.3.2 并行测试时避免数据冲突的命名策略
除了用户隔离,还需制定统一的数据命名规则,确保关键字段的唯一性。
推荐格式: [PREFIX][TIMESTAMP][RANDOM][USER_ID]
| 组成部分 | 示例 | 说明 |
|---|---|---|
| PREFIX | ORD_, CUST_ | 明确数据类别 |
| TIMESTAMP | 2504051230 | 精确到分钟的时间戳 |
| RANDOM | _R7X2 | 随机字母数字组合,防碰撞 |
| USER_ID | _U03 | 关联执行用户,便于排查 |
综合示例: ORD_2504051230_R7X2_U03
该策略已在多家大型企业SAP CI/CD流水线中验证有效,支持每日上千次并发测试无冲突。
5.3.3 使用随机化与时间戳增强数据唯一性
在脚本层面,可通过ABAP Script动态构造此类标识:
DATA: lv_ts TYPE char12,
lv_rand TYPE char4.
lv_ts = sy-datum+6(2) && sy-datum+4(2) && sy-datum+2(2) &&
sy-uzeit(6).
CALL FUNCTION 'RANDOM_STRING'
EXPORTING
seed = ( sy-index * 1000 ) + sy-tabix
IMPORTING
random_string = lv_rand.
TRANSLATE lv_rand TO UPPER CASE.
CONCATENATE 'CUST_' lv_ts lv_rand INTO gv_customer_id.
逐行解读 :
- 提取当前时间的YYMMDDHHMMSS格式;
- 调用
RANDOM_STRING函数生成4位随机串(需确保函数可用);- 转换为大写避免大小写敏感问题;
- 拼接成最终唯一ID。
若 RANDOM_STRING 不可用,可用替代方案:
lv_rand = substring( val = |{ sy-uzeit }{ sy-datlo }| off = 4 len = 4 ).
利用时间微小差异生成伪随机值。
5.4 自动化数据预置方案
5.4.1 利用eCATT自身脚本初始化基础数据
最直接的方式是编写专门的“Setup Test Case”,在正式测试前自动创建所需主数据。
例如,创建客户主数据的eCATT脚本:
CALL TRANSACTION 'XD01' USING
'BDC_CURSOR' = 'RF02K-DLAND'
'BDC_OKCODE' = '/00'
'RF02K-KUNNR' = gv_kunnr
'RF02K-NAME1' = gv_name
'RF02K-LAND1' = 'US'
'RF02K-ORT01' = 'New York'.
CALL TRANSACTION 'XD01' USING
'BDC_CURSOR' = 'KNB1-BANKL'
'BDC_OKCODE' = '/00'
'KNB1-BANKL' = 'BK01'
'KNB1-BANKN' = '123456789'.
该脚本可通过Test Runner在主测试前自动调用,形成标准化前置流程。
5.4.2 调用DDIC结构直接写入透明表的高阶技巧
对于性能要求极高或GUI路径复杂的场景,可绕过GUI层,直接操作数据库表。
前提条件:
- 用户具有 SU53 权限检查通过;
- 表非聚拢表(cluster table);
- 不违反业务逻辑完整性(建议配合BAPI更安全)。
示例:直接插入KNVV表(销售视图):
INSERT INTO knvv ( kunnr, vkorg, vtweg, spart, kalsc )
VALUES ( gv_kunnr, '1000', '10', '00', '01' ).
IF sy-subrc <> 0.
WRITE: / 'Failed to insert KNVV record'.
ENDIF.
风险提示 :直接写表跳过了字段出口、增强点和索引更新,可能导致后续功能异常。仅建议用于非关键测试或沙箱环境。
5.4.3 与LSMW协同完成复杂主数据导入
对于大规模主数据(如10万条物料),推荐使用LSMW(Legacy System Migration Workbench)先行导入,再由eCATT执行事务性测试。
集成模式如下:
- 使用LSMW定义对象(如“物料主数据”)及映射规则;
- 准备Excel或CSV源文件;
- 在eCATT测试开始前,调用OS命令执行LSMW批处理作业:
SYSTEM CALL 'nplsmw.bat import_materials.csv'.
- 待返回码为0后再启动功能测试。
此方式兼顾效率与准确性,已成为大型SAP项目数据准备的标准实践。
6. eCATT测试执行流程与Test Runner使用
6.1 单个测试用例的执行控制
在SAP eCATT中,单个测试用例的执行是自动化测试流程的基础单元。其执行过程不仅涉及脚本本身的逻辑运行,还包括环境初始化、会话管理、异常响应等多个关键环节。
首先,在执行前必须完成 环境检查与登录配置 。这一步通过定义“System Data”和“Client/User Credentials”来实现。例如:
SYSTEM ZDEV CLIENT 800 USER testuser PASSWD secret
该配置需在eCATT测试用例的“Attributes”标签页中设定,并确保目标系统处于可用状态。此外,还需启用SAP GUI Scripting功能(事务码 RZ11 设置参数 sapgui/user_scripting 为 TRUE ),否则无法捕获或回放GUI操作。
eCATT支持两种主要执行模式: 同步执行 与 异步执行 。
- 同步执行 :适用于大多数功能性测试场景,脚本按顺序逐条执行命令,每一步完成后才进入下一步。此模式便于调试,适合开发阶段。
- 异步执行 :用于模拟后台作业或长时间运行的事务(如报表生成、批处理等)。可通过设置
ASYNC = 'X'启动非阻塞调用,并结合WAIT FOR EVENT语句监听特定事件(如作业完成)。
执行过程中,可通过 /nECATT 事务码打开测试浏览器,实时查看日志输出。日志包含以下信息:
- 每个Test Step的开始/结束时间
- 屏幕跳转路径(TCode + Dynpro)
- 变量值变化记录
- 错误堆栈(如有)
若发生中断(如网络断开、程序错误),eCATT提供 断点续跑(Resume from Failure Point) 功能。用户可在修复问题后选择从失败步骤重新执行,避免重复整个流程。
| 执行属性 | 描述 | 推荐值 |
|---|---|---|
| Commit Mode | 控制是否自动提交事务 | Manual(推荐用于调试) |
| Display Mode | 是否显示GUI界面 | Yes(调试时),No(批量运行) |
| Error Handling | 出错后的处理策略 | Stop on Error 或 Continue |
| Sync Timeout | 等待屏幕加载的最大秒数 | 30~60 秒 |
此外,可通过 ABAP 脚本注入动态行为,例如在关键节点添加日志标记:
WRITE: / '【DEBUG】即将执行ME21N采购订单创建'.
MESSAGE I000(ZTEST) WITH 'Step checkpoint reached'.
此类信息将写入 eCATT 日志,增强可追溯性。
6.2 Test Runner在批量测试中的核心作用
当测试范围扩展至多个模块或全系统回归时,手动逐个执行测试用例已不可行。此时, Test Runner 成为组织与调度大规模测试的核心工具。
Test Runner 允许将多个 eCATT 测试用例打包为一个 Test Package(测试套件) ,并统一管理其执行流程。创建方式如下:
- 使用事务码
/nECATT - 进入 “Test Packages” 视图
- 创建新包(如
REGRESSION_MM_2025) - 添加相关测试用例(如
TC_MM_PO_CREATE,TC_MM_GOODS_RECEIPT等)
依赖关系定义与执行顺序编排
复杂业务流程往往存在前后依赖。例如,“收货”测试必须在“采购订单创建”成功之后执行。Test Runner 支持通过 前置条件(Prerequisites) 定义依赖链:
graph TD
A[TC_MM_VENDOR_CREATE] --> B[TC_MM_INFO_RECORD]
B --> C[TC_MM_PO_CREATE]
C --> D[TC_MM_GOODS_RECEIPT]
D --> E[TC_MM_INVOICE_VERIFICATION]
上述流程可在 Test Package 中通过拖拽排序或使用 ABAP 逻辑动态控制执行顺序。若某用例失败,后续依赖项可被自动跳过或标记为“Blocked”。
失败重试机制与阈值控制策略
为了应对偶发性环境波动(如锁等待、临时通信超时),Test Runner 支持配置 自动重试机制 :
- 最大重试次数:通常设为 2~3 次
- 重试间隔时间:建议 ≥15 秒
- 触发条件:仅针对特定错误类型(如
SY-SUBRC ≠ 0但非数据校验失败)
同时,可通过“Threshold Rules”设定整体通过率阈值。例如:
若测试套件中失败率 > 10%,则触发预警邮件通知 QA 经理。
此规则可通过自定义 ABAP 报表监控实现,也可集成至 SAP Solution Manager 的测试工作台。
以下是一个典型的 Test Package 配置示例:
| 测试用例编号 | 名称 | 依赖用例 | 重试次数 | 超时(秒) | 启用状态 |
|---|---|---|---|---|---|
| TC_MM_001 | 创建供应商 | - | 2 | 120 | X |
| TC_MM_002 | 维护信息记录 | TC_MM_001 | 1 | 90 | X |
| TC_MM_003 | 创建采购订单 | TC_MM_002 | 3 | 180 | X |
| TC_MM_004 | 收货 | TC_MM_003 | 2 | 240 | X |
| TC_SD_001 | 销售订单创建 | - | 1 | 150 | X |
| TC_FI_001 | 发票校验 | TC_MM_004 | 2 | 200 | X |
| TC_HR_001 | 员工主数据导入 | - | 1 | 300 |
注:未勾选“启用状态”的用例将在本次运行中被忽略。
Test Runner 还支持计划任务(via SM36),可定时触发整套回归测试,实现无人值守执行。
简介:SAP eCATT(Electronic Computer-Aided Test Tool)是SAP提供的自动化测试解决方案,基于SAP Scripting语言,支持功能与性能测试,广泛应用于SAP系统的端到端业务流程验证。该工具具备脚本录制回放、数据驱动测试、灵活脚本编辑及详尽报告分析等核心功能,并可与ALM、CTS等SAP工具集成,显著提升测试效率与准确性。本文档深入讲解eCATT的使用方法,涵盖脚本创建、数据配置、错误调试及性能测试等内容,适用于SAP实施与维护团队掌握自动化测试全流程。
更多推荐
所有评论(0)