​编译:TesterHome
原文标题:How eBay Developed an Automatic Testing Solution for Batch Application Upgrades
作者:Paul Zhang 、Tao Jin

本文介绍了一种新的测试方法,适用于 eBay 的 500+ 批处理应用程序。在 eBay,批处理应用程序包含每天运行的 10000+ 作业,用以处理离线 eBay 业务。例如,每月发
票作业负责记录客户主帐户上的所有订阅交 易。在这篇文章中,作者探讨了批量应用测试升级时面临的挑战,并提供解决测试痛点的解决方案,希望对从事相关领域工作的同学能够带来一些启发或帮助。

批量应用与服务系统不同,因为它在实例中没有 Web 容器。对于一个批处理池来说,它将等待来自上游作业调度程序的作业命令,根据给定的调度运行。一旦作业命令完成,应用程序进程将退出,并将退出代码和退出状态返回给调度程序。

批量测试一直是一个挑战。一般来说,批处理程序不是幂等的,因为大多数是操作文件、读取数据库等。这些数据源可以经常更新,即使输入参数相同,批处理作业也无法获得相同的结果。

对于批处理应用程序测试新更改(例如框架升级)的传统方法是将新代码直接部署到生产中以进行在线验证。这可能是一种冒险的方法,应该有更好的测试来涵盖以下用例。

解决方案

批量测试系统是一种全新的测试解决方案,它被设计为一个集中但独立的系统,支持基于不同版本的代码对相同的实例运行相同的作业,并自动提供端到端的比较。

基本思路是批处理框架默认提供基线作业。由于所有 eBay 站点应用程序都必须使用批处理框架,因此其中提供的框架作业可以无需任何额外的应用程序代码即可正常运行。例如,在当前应用程序代码运行良好的情况下,框架作业可以基于不同的代码运行两次。如果发生任何异常情况,可以比较之前和之后的指标。

该方法将解决这些痛点:

响应

批量响应包含两个部分:一个是退出代码,另一个是退出状态。退出代码是作业返回到调度程序的值,它是工作流案例的关键信号。一个工作流可以在调度程序中定义,其中一个批处理池被认为是一个工作流节点。调度程序会根据前一个批处理池中运行的作业退出代码将下一个作业调度到不同的流程分支。退出状态是用来标记作业是否成功的值。

日志

批量日志显示应用程序的运行逻辑。如果有任何新的异常出现或现有异常的错误数字在日志中急剧增加,应用程序的新代码很可能有问题。

执行时间

执行时间等于应用程序启动时间加上框架作业执行时间。相同的框架作业通常需要相同的时间来执行。如果执行时间显着增加,则新代码存在性能风险。

批量测试系统工作流程

批量测试系统的工作流程如下所示。

详细的镜像步骤是:

体系结构

在批量测试系统内部,有几个组件协同工作。控制器是作为协调器处理以下工作序列的关键组件。

配置文件是衡量测试是否为绿色的关键输入。每个应用程序的规则设置取决于应用程序的需求——例如,如果一个应用程序在启动时预热了一些缓存——允许的执行时间应该相应地设置得更长。

配置文件

控制器将读取配置文件,该文件从 git 资源库中分解出测试规则。下面是一个样本文件,其中解释了如何设置规则。

FrameworkSmokeTestJob:
  configuration:
    timeout: 5
  validation:
    execution:
      validatorType: batch-execution
      validatorOverrides:
        returnCode: 0
        durationMax: 3
       state: SUCCESS
   log:
     validatorType: batch-log-allowlist
     validatorOverrides:
       allowlist:
         - "~.*.*::2"

第一行的 “FrameworkSmokeTestJob” 是要运行的框架作业名称。

第三行的 "Timeout 5 "定义了 5 分钟作为最大的批处理执行时间。如果批处理作业运行超过 5 分钟,测试将以超时异常而失败。

从第五行到第十行,它定义了执行比较规则。第八行和第十行意味着返回代码应该是零,作业应该是成功的状态,这些都是框架作业的强制性要求。第九行定义了不允许执行时间超过三分钟的规则。
从第 11 行到第 15 行,它定义了日志比较规则。第 15 行的一个 regex 字符串描述了这样的规则:如果任何异常出现两次以上,该作业将被视为失败。允许出现两次异常的原因是为了避免出现噪音异常。例如,应用程序在启动时抛出一个无害的异常两次。它应该被忽略,并在 allowlist 部分定义。

从示例文件中,测试工具的用户可以根据应用程序的实际运行状态灵活地调整规则。此外,如果这个应用程序还有一些适合作为测试作业的作业,也可以配置,这意味着它在配置文件中支持多个作业。即使没有这样的作业,框架作业也是默认配置的。

总结

批量测试系统为 eBay 的批量系统框架升级提供了一个成功的测试解决方案,它可以克服遗留批处理应用程序缺乏端到端测试用例和基于 “实例到实例” 的比较的前所未有的挑战。它为质量保证提供了一种非在线验证方法。虽然目前的场景是框架升级,但它也可以帮助验证应用程序的代码变化和操作系统升级案例。这为批处理应用程序提供了一种通用的测量方法。


↙↙↙阅读原文可查看相关链接,并与作者交流