沉默的海
作者沉默的海·2022-12-30 11:42
系统工程师·某金融单位

分布式服务框架自动化测试方案

字数 3594阅读 4743评论 0赞 9

自动化测试因其可实现 节省人力、时间 和 硬件资源 , 提高测试效率 的效果,从而越来越受到软件开发者和管理者的青睐和重视。而在分布式系统的实施过程中,自动化测试的落地因其分布式服务的特性,有着更为复杂的实现难度。

本文将结合项目实践,提出一种适合分布式系统的自动化测试方案。

一、 分布式自动化测试的挑战和困难

如何解决分布式节点的测试任务编排?

因分布式涉及的机器节点较多, 产品组件间依赖关系复杂,单一业务功能需要多组件集成协同完成 ,同时测试时需要将分布式的测试结果进行汇总判断。因此需要测试框架支持分布式的测试执行和自动化执行。

如何保证测试结果的可读性?

不同种类的测试方式测试的侧重点不同,需要的指标也不尽相同,且编写语言各异,因此生成的测试报告也会有所差异,需要统筹输出可读性综合性测试报告。

敏捷开发模式下如何开展快速的回归测试?

敏捷开发过程中,迭代周期较短,阶段性的输出成果带来是频繁的回归测试,同时各组件间独立开发,单组件模块替换要求对相关依赖的组件进行完整的回归测试。

二、 自动化测试范围分析

方向是指引走向成功的关键,在自动化测试领域,由敏捷大师 Mike Cohn大师提出的测试金字塔模型被视作经典模型。 在分布式系统的自动化测试中纵向可按照 “分层”概念划分,横向可按照“组件”进行开展。 通过增加了 “分层”的概念用于区别传统的自动化测试。 分层自动化测试倡导的是从 UI单层到多层次多粒度的测试组合

按照从底向上的层次顺序,测试数量应当是依次减少。测试组合实践的建议是测试组合应具有许多小而快的单元测试,适当的更粗粒度的测试,较少高层次的端到端测试。

单元自动化测试
单元自动化测试是软件中最小可执行的测试单元,是最接近代码底层实现的验证手段,利用自动化进行完整的回归测试,在生命周期中可以尽早地对软件产品进行测试将使效率和质量得到最好的保证 。

集成测试
可依据测试场景进行完整测试,在单元测试的基础上,将所有模块组装进行测试。

联调测试
侧重点在于模块间接口的正确性、各模块间的数据流和控制流是否按照设计实现其功能、以及集成后整体功能的正确性 。

UI功能测试
通过用户界面对可见外观及其底层与用户交互的部分的功能测试, 降低系统功能回归测试的成本。

三、 自动化测试相关技术与工具

自动化测试涉及持续集成工具、 UI自动化测试框架、单元测试框架和负载测试工具等一系列工具和技术。为保证技术的先进性和可扩展性,分布式自动化测试选用业界主流工具进行集成,满足各类测试场景要求。

持续集成工具
Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化。通常与版本管理工具(SCM)、构建工具或者Docker结合使用。

通过 Jenkins的pipeline流水线插件进行单元测试、集成测试和非功能测试的执行。其中,pipeline流水线将独立运行的多个任务连接起来,可以实现更复杂的CI/CD流程。pipeline流水线实际上是一套Groovy DSL,Jenkinsfile 用Groovy脚本描述CI/CD的流程。由测试人员编写Jenkinsfile 的文本文件并提交到项目的代码版本控制仓库,通过Jenkins流水线构建将从代码库中获取脚本进行任务的执行。

UI自动化测试框架
Selenium是一个web开源自动化测试框架, 支持主流的浏览器 , 可实现 模拟用户真实操作 ,支持 Java,Python等多种语言编写用例脚本 。 同时提供 Selenium IDE、Selenium WebDriver和Selenium Standalone Server等工具组件。Selenium IDE为嵌入到浏览器中插件,可在浏览器界面中录制和回放脚本,支持多种语言到脚本导出。Selenium WebDriver是支持多种编程语言的用于浏览器自动化模拟操作的API库,方式上更为灵活同时便于维护。Selenium Standalone Server包含Selenium Grid、远程控制、分布式部署等功能,提供分布式扩展、跨平台、异构环境运行的功能。

Appium是一个移动端自动化测试开源工具,支持iOS和Android平台,支持Python、Java等语言。Appium是跨平台的,即可以针对不同的平台用一套API来编写测试用例。Appium 采用 C/S架构,核心 为 Web服务器,提供了一套REST的接口。当收到客户端的连接后,就会监听到 命令进行执行,然后通过 HTTP响应收集命令执行的结果。因目前项目未涉及移动端开发,故暂时未使用此工具。

单元测试框架
TestNG是一款基于Java的测试框架,被设计用于解决大部分的测试需求,涵盖单元测试(测试一个单独的类)和集成测试(测试由几个类、几个包甚至有几个框架组成的系统)两种测试方式。

负载测试工具
Fortio是一个快速、小型、可重用、可嵌入的go库以及命令行工具的服务器进程,服务器包括一个简单的web UI和结果的图形表示。通过参数化的设置可以运行一个设置的持续时间,固定的调用次数的负载任务。

四、 分布式自动化测试集成方案

依据测试范围的分析,针对分布式平台测试的手段包括单元自动化测试、集成测试、联调测试和 UI自动化测试。

针对分布式平台测试场景下的分布式自动测试及执行结果的收集问题,将采用 Jenkins的pipeline实现流水线的任务编排,通过“master+agent”架构的形式进行分布式构建,通过串行或者并行的方式借助自动化前端测试框架和组件测试组合、负载测试工具和多组件间实现测试的组合集成,可分步骤对执行结果进行采集,并可灵活输出测试报告。通过Jenkins与git源码仓库的提交触发关联或者设定定时可实现动态的自动化测试执行。

测试架构图:

多环境分布式执行:解决多节点测试协同

Jenkins提供了Master Slave机制,Master负责调度任务和发送请求,多个Slave可以并发的执行构建任务,同时可将各步骤结果进行汇总。多测试环境情况下,Master节点提供web接口让用户来管理job和Slave Agent,并通过标签进行管理。

自动化执行:满足敏捷开发快速迭代测试

采用 Jenkins提供时间触发和事件触发等方式实现自动化执行,时间触发方式包括定时cron设置和轮询代码仓库,事件触发包括上游任务触发、版本管理工具通知触发等方式。

通过设定 cron定时任务和代码仓库自动触发的方式,完成实时构建和每日构建,提供持续集成的能力,同时通过邮件通知的方式及时反馈给干系人。

可视化测试报告:输出可视化的自定义测试报告

通过对测试案例的编排,可根据各环节点的输出内容,统一的进行断言判断,各测试模式可借助于相关 Jenkins插件输出定制化、可视化的测试报告,其中报告信息包括成功和失败率、测试覆盖率等信息,最后可使用邮件发出。

测试库管理和流水线设计:任务编排和测试手段的实现

pipeline 编排方式支持条件分支执行、循环执行方式、重试机制,同时对于多执行任务可采用串行和并行的方式进行编排,从而实现各类测试手段。测试库管理包括测试组件、测试案例和测试流水线。

测试组件: 考虑到在实际的测试过程中,测试的步骤中包含一部分无关乎业务的执行方式,比如接口调用、脚本执行等,从复用性的角度考虑,故考虑将这些重复的事件使用方式抽取为无关业务的执行组件,使用 Jenkins的pipeline实现 。组件在执行前会接收环境信息参数和执行参数,环境信息参数包括需要执行的测试环境服务器信息,执行参数按照执行场景需要为具体的测试数据和期望结果。

测试案例: 试案例通过根据对功能测试的原子性划分,专注于测试单一业务功能。测试案例按照组件进行独立的功能进行编写。针对测试案例的设计包括案例名称、分类目录、描述、流水线名称、测试步骤、测试流程编排、案例级别、检查关键点等等。

流水线: 流水线的设计通过对测试案例的复用和多场景编排,使得测试针对特殊场景按照概要设计规格说明的要求组装成模块从而检查工作是否达到或实现相应技术指标及要求。流水线中可实现对于 单元自动化测试、集成测试、联调测试和 UI自动化测试的调用 ,借助与流水线的复用和组合,实现组合流水线的前置处理、后置处置和检查点的比较。

五、 总结与展望

通过 Jenkins持续集成平台与前端自动化测试、单元测试框架以及负载工具的集成可基本覆盖分布式系统自动化测试的场景,未来可在此基础上对Jenkins pipeline进行扩展,借助于共享库的功能将更可复用性高的测试代码和函数进行更加灵活的管理和应用,借助于可视化构建及视图插件实现视图管理。同时根据自动化测试工作的不断推进和深入,进行Jenkins插件代码骨架的开发和实施工作。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

9

添加新评论0 条评论

Ctrl+Enter 发表

本文隶属于专栏

最佳实践
不同的领域,都有先行者,实践者,用他们的最佳实践来加速更多企业的建设项目落地。

作者其他文章

相关文章

相关问题

相关资料

X社区推广