自动化质量保证 (QA)高级自动化 QA 工程师

你如何为验证缺乏现代 API 接口的遗留 ERP 系统中的端到端业务工作流程架构一个自动化测试框架,这些系统需要跨模块屏幕的状态化 GUI 交互,并要求实时数据库状态验证,同时确保在共享沙盒环境中的测试隔离?

用 Hintsage AI 助手通过面试

对问题的回答

问题的历史

SAP ECCOracle E-Business Suite 这样的遗留 ERP 系统继续为财富 500 强公司提供关键业务操作,但这些单体架构的出现早于现代 API 优先设计模式数十年。这个问题自然而然地出现,因为企业试图将 DevOps 转型策略应用于抵制容器化和微服务分解的棕地环境。传统的自动化方法在这里失败,因为这些系统将表现逻辑与以专有 ABAPPL/SQL 代码库中的业务规则紧密耦合。组织发现,仅仅将基于 Selenium 的 Web 自动化应用于厚客户端 SAPGUI 接口会导致灾难性的维护开销和错误的正反馈。

问题

根本的阻抗失配源于 ERP 系统依赖于状态化 GUI 框架,具有重客户端会话管理且没有暴露的 REST 接口。直接的数据库断言风险违反嵌入数千行遗留触发代码中的应用层业务规则,从而在测试结果中产生错误的负反馈。共享沙盒环境加大了这些困难,因为 ABAP 事务往往利用自主提交,绕过数据库级回滚机制,阻止通过标准事务装置实现测试隔离。此外,实时验证需要检测状态变化,这些变化可能因异步 RFC(远程功能调用)处理队列或夜间批处理作业时间表而滞后于 UI 确认。

解决方案

实施一种 混合自动化架构,结合 RPA 风格的屏幕自动化与通过 变更数据捕获 (CDC) 机制进行事件驱动的数据库验证。部署 数据虚拟化 工具,如 DelphixRedgate SQL Clone,为每个并行测试线程提供隔离的、可写的数据库子集,而无需复制整个 TB 级环境。利用专有自动化适配器,如 SAP CBTASapShell,以处理动态 Dynpro 控件标识符,而不会使用脆弱的 XPath 定位器。建立一个 事件总线,使用 Apache Kafka 消费 SAP 变更指针 或数据库事务日志,使异步断言能够消除轮询延迟,同时验证 UI 和数据库状态的一致性。

生活中的情境

一家全球制造企业需要自动化他们的 采购到付款 工作流程,涉及 SAP ECC 6.0 模块的采购申请、供应商审批、货物接收和发票验证。目标环境是一个共享 沙盒 实例,由手动测试人员、批处理作业时间表和来自不同地理团队的十二个并行自动化流同时使用。该工作流程涉及复杂的状态转换,创建采购订单时,通过 RFC 调用触发信用限额检查,然后进行异步库存更新。

测试由于 数据库争用 而表现出极大的不稳定性——自动化创建了 ID 为 450001 的采购订单,但在断言执行之前,竞争测试修改了相同的供应商主数据或消耗了成本中心中的可用预算。 SAPGUI 屏幕使用基于运行时 ABAP 屏幕序列动态生成的控件 ID,每当开发中的微小配置更改发生时,标准 Selenium 定位器就会失效。此外,关键的业务验证只在夜间 ABAP 批处理作业处理后完成,这使得简单的以 UI 驱动的方法无法实现当日测试反馈。

纯 UI 自动化与扩展等待 是第一个考虑的解决方案。该策略完全依赖于 SAP CBTA 的显式同步点和激进的轮询循环来检测 UI 状态变化。优点包括基础设施占用最小,符合 SAP 官方支持的自动化工具集,且不需要超出标准测试模块的额外许可证。缺点包括测试用例的执行时间膨胀到超过 50 分钟,因为固定的轮询间隔,完全无法验证后台 IDoc(中间文档)处理是否成功,以及在批处理作业不可预测地超出最大等待阈值时持续出现错误的正反馈。

直接数据库操作 是第二种替代方案。该方法完全绕过 UI 进行断言,使用 JDBC 连接立即验证 EKKO(采购文档头)和 EKPO(采购文档项目)表中的条目。优点包括亚秒级的验证速度和理论上对前端呈现变化的免疫,使测试能够在没有 SAPGUI 客户端安装的情况下运行。缺点包括当 ABAP 验证逻辑发生更改但 SQL 查询未更新时的维护噩梦,高风险测试实现细节而不是用户可见的业务流程,以及直接更新绕过应用级授权检查时违反数据完整性约束。

使用虚拟测试数据的混合架构 是第三个实施的选项。该解决方案利用 SAP TDMS(测试数据迁移服务器) 在共享沙盒中划分出隔离的客户端特定数据片段,为每个自动化线程分配独特的公司代码。我们使用 SeleniumSapShell 自动化包装器进行 UI 交互,同时利用 Kafka 监听程序监控 CDPOS(变更文档项) 表,以实时状态变化通知通过 CDC。优点包括真正的并行执行无交叉污染,基于事件驱动的断言相比轮询快 80% 的验证速度,以及通过 AI 基于对象识别工具(如 TestPlantMicro Focus UFT 的 AI 引擎)抵御 UI 定位器变化。缺点是需要对 TDMS 配置进行大量前期基础设施投资,以及管理数据老化和刷新周期的复杂测试数据编排逻辑。

选择 混合架构 是因为它解决了根本原因——测试数据隔离——而不仅仅是通过时间调整来掩盖症状。尽管初始设置需要三周的 Basis 管理员协作来配置 TDMS 切片,但它实现了对遗留系统的真正 CI/CD 集成,并将反馈回路从三天缩短到不到两个小时。这种方法提供了纯 UI 自动化无法提供的确定性执行保证,同时保持了直接数据库查询牺牲的用户中心验证视角。

该框架目前支持来自八个区域团队的每日 250+ 个并行测试执行,且未发生交叉污染事件。测试的不稳定性从 42% 降至 1.8%,订单到现金 关键路径执行时间从 6 小时减少到 28 分钟。该架构成为企业自动化其他遗留模块的标准,证明主机时代的系统可以在不冒险的现有改造策略的情况下实现现代自动化速度。

候选人通常遗漏的内容

你如何在使用 ABAP 代码中的自主提交的 SAP 系统中维护测试隔离?这会阻止标准数据库事务在测试之间进行回滚?

候选人通常建议将测试包装在数据库事务中,但 ABAPCOMMIT WORK 命令执行自主提交概不理会 JDBC 事务边界。正确的方法是通过保留特定的组织结构——例如公司代码、工厂 ID 或采购组织——专门用于自动化管道来实现 逻辑租户隔离。将这一方法与 时间隔离 策略相结合,其中自动化创建的商业文档日期设定在未来六个月,以确保它们对处理当前日期交易的手动测试人员和批处理作业不公开可见。清理时,使用 BAPI(业务应用程序编程接口) 调用,如 BAPI_PO_DELETE,而不是直接的 SQL 删除,以尊重应用层的参考完整性和授权检查。

什么技术防止 SAPGUI 自动化在负载均衡环境中 SAP 消息服务器动态重定向连接到不同的应用服务器时失败?

许多候选人建议在负载均衡器级别配置粘性会话,但这需要网络管理权限,而这些权限在企业环境中通常不会授予 QA 团队。正确的解决方案是在登录后立即从 SAPGUI 连接字符串中捕获特定的应用服务器实例号,然后使用显式的 SAP 路由器 字符串将所有后续的自动化步骤路由到该特定节点。在你的测试上下文中实施一个 会话亲和性注册表,将线程 ID 映射到特定的服务器实例,利用 SAPTH_SERVER_LIST 函数模块主动识别可用节点。这确保了状态化的 ABAP 会话变量在多个屏幕转换中保持持久性,而无需进行基础设施更改或禁用负载均衡。

你如何同步自动化与异步 SAP 批处理作业的完成,而不诉诸于对 SM37 事务的脆弱屏幕抓取?

大多数候选人建议轮询 作业概览 屏幕或实施固定延迟,这两者都会引入脆弱性和不可预测的执行时间。先进的解决方案利用 SAPXBP(外部批处理处理) 接口通过 RFC(远程功能调用)目的地,使自动化能够以编程方式调用 BP_JOB_STATUS_GET。以下是使用 PyRFCPython 实现:

from pyrfc import Connection def wait_for_batch_job(conn, job_name, timeout=300): """事件驱动的等待 SAP 批处理作业完成""" import time start = time.time() while time.time() - start < timeout: result = conn.call('BP_JOB_STATUS_GET', JOBNAME=job_name, EXTERNAL_USER_NAME='AUTOMATION_USER') status = result['STATUS'] if status == 'F': # 完成 return True elif status == 'A': # 中止 raise Exception(f"作业 {job_name} 被中止") time.sleep(2) # 短轮询,但可以替换为网络钩子 return False

这将验证与 GUI 定时解耦,减少同步开销,从几分钟降低到毫秒,当与 SAP事件网格 网钩结合使用时,提供确定性失败分析的结构化作业日志解析能力。