分布式测试框架架构与思考(1)技术选型

“工欲善其事必先利其器”。无论是哪个行业,这都是一句至理名言,软件测试当然也不例外。这也正是分布式测试框架(下文简称DST)设计的初衷。

  DST是海量数据项目背景下,为了解决测试集管理、运行、查询和测试执行、控制以及监控、日志数据的收集整理的一个通用型测试与分析平台。这个平台既包含了传统测试框架的特点也包含了自身的开创性思想。作为DST从前端界面到后端服务的亲身经历和开发者,下面我将从技术选型、架构设计、功能点分析、使用场景以及周边支持工具这几个角度来对DST测试平台做一个总结,进一步思考和回顾,以便发现不足和需要改进之处。

  --------------------------------------------------------------------------------

  第一篇  技术选型

  对于一个好的软件来说,技术选型无疑是最重要的一步,这将决定软件是否有良好的扩展性、健壮性、可靠性以及可维护性。对于DST来说,传统的B/S是一个显而易见的架构性选择,那么从前端到后端都需要有良好的Framework以及清晰的技术轨道与之配合。

  好的技术选型可以大大缩短开发周期,并提高代码的质量,减少bug产出率,优良的技术往往是具有清晰的结构化框架的,便于追踪问题,以及向其他开发者分享代码。

  技术选型贯穿了整个DST的设计与开发始终,并经历了多次回滚调整,最终采用现在的技术轨道并非是一件一帆风顺的事情。下表列举的是DST使用到的相关技术:


名称


描述


Webx


基于经典MVC设计模式的WEB框架,构建前端UI的主要骨骼脉络,具有清晰地层次化构造,良好的扩展机制。


Velocity


基于java的模板引擎,允许仅仅简单的使用模板语言(template language)来引用由java代码定义的页面对象。


ibatis


持久层框架包括SQL Maps和Data Access Objects(DAO),是一种“半自动化”的ORM(Object/Relation Mapping)实现。


Jeasyui


jQuery Easyui,基于jQuery的前端页面和javascript设计框架,简单且易于上手,封装的AJAX简洁易用。


HBase


一个分布式的、面向列的开源nosql数据库,DST利用其实现海量监控和日志数据的存取。


Mysql


持久化前端以及测试数据。


HighCharts


一套界面美观的纯Javascript图表库。


RESTful


REST (REpresentational State Transfer)描述了一个架构样式的网络系统。


Ueditor


一个百度开源的富文本编辑器。


AJAX


交互式网页应用的网页开发技术。


SyntaxHighlighter


高亮显示代码用的Javascript库。


Thrift


Facebook开发的一个软件框架,用来进行可扩展且跨语言的服务的开发。


Jetty


开源的servlet容器。

  其他还有一些例如SimpleTip(浮动标签)、MapReduce(用来做nosql数据的定期备份)等技术,由于涉及不多,不再列举。

在整个DST的开发周期中,围绕技术选型,曾经发生过几次重要的争论,列举如下:

  1、框架之争

  DST之前有Kelude测试平台可以借鉴,Kelude采用Ruby语言的Rails框架,其特点是轻巧灵活,代码极少重复,开发效率极高。然而考虑到精通Ruby语言的程序员不多,后端服务的技术人员大多精通Java而非Ruby,且海量数据平台的大部分产品都是Java开发(如Hadoop),将来在DST与测试场景接合的时候,相同的语言可以省却很多麻烦。最终定选的Webx作为一个成熟的MVC设计模式,在淘宝的使用很广泛,有大量资料实例可以参考。

  持久层采用Hibernate还是ibatis,这要归功于我们团队的leader叶渡的技术选型,在后来的开发过程中,不谈外部的一般说法,我的感觉是ibatis结构非常清晰,sql语句完全被抽象到了sqlmap文件中,适合DBA以及其他开发人员对sql语句的审核。从DAO接口到之上的事务层,都可以通过ibatis很好的管理起来。但是ibatis从生成到增删改非常繁琐,增加一条sql语句,一般情况下至少要修改6、7个文件,这个过程很容易出错。

  2、UI设计之争

  作为后端测试工程师,因为我在DST立项开始的时候并没有太多的前端开发经验,因此在UI设计上,曾经发生过是否要专业UED参与的争论。这个争论虽然之后随着DST的开发渐渐消失,但此时提及,是为了记录我在设计过程中的一些思考。

  我觉得DST如果有专业的UED协助进行用户体验的设计那是最好不过的事情,但是对于此类项目的开发早期,很多功能点不是很清晰的情况下,由开发人员掌握住整个流程还是相当有必要的。开发者的亲身参与会省去许多探雷的过程,且测试人员自己才最清楚需要一个什么样的系统,UED的参与更多从普通用户角度思考,而测试框架作为一款特殊的软件产品,更需要从开发者角度去思考他们的操作习惯。

  3、海量数据持久化之争

  身处海量数据开发项目,自然少不了和动辄上千个节点的集群打交道,从这些集群收集到的监控数据和日志数据的量也可以用浩如烟海来形容。按常规经验,一个百台规模的集群,收集到的监控数据一年约有8TB,传统关系型数据库撑住这样的数据量还要保持高效的并发读写效率,往往需要一个很有经验的团队来支撑,分表操作会成为一个常态。而我们所需的查询动作往往又非常简单,基本上都是扫描一段时间内的数据。这恰好是nosql型数据库最擅长的领域。

  但是在这部分设计之初,我们发生了关于持久化是通过直接存取二进制文件方式,还是存取HBase方式之争。

  直接存取二进制文件方式的理由是,可以直接从RRD(Round Robin Database)数据库文件中读取所需的监控数据,对查询请求可以通过固定算法计算出数据所在位置后,用seek函数直接跳转过去进行连续读取,好处是速度快,硬件资源需求少。但这样的方式带来的问题,一是查询依赖于编程,不利于查询方式的扩展和数据挖掘;二是没有足够可靠的数据冗余备份方案,一旦机器损坏,数据就将发生不可逆转的丢失;三是扩展性不够,能够hold住百级别节点的集群,并不意味着我们仅仅只有百台机器需要存取监控和日志数据,一旦规模扩大,这样的解决方案将面临无法动态扩容的危险。

  最终我们选择了将监控和日志数据存到HBase中这个方案,上述的三个问题都不会发生。而在后来的设计中,我进一步发现与其从gmond保存的RRD数据库文件中读取监控数据,不如通过替代gmond master节点的方式来直接解析xml形式的监控数据。这样可以避免磁盘操作这个性能瓶颈,数据流完全是从内存到网络(gmond)再到内存(我们的工具)再通过网络到HBase集群的内存中。整个过程完全将没有磁盘这种慢速设备的干扰。关于这部分的详细设计思想,我将会在后文中继续描述。

  4、敏捷开发模式实施之争

  采用敏捷开发模式是DST设计过程中不可忽视的一个重要技术选型。按照书本上的定义:敏捷开发强调程序员团队与业务专家之间的紧密协作、面对面的沟通(认为比书面的文档更有效)、频繁交付新的软件版本、紧凑而自我组织型的团队、能够很好地适应需求变化的代码编写和团队组织方法,也更注重做为软件开发中人的作用。

  而DST在开发之初,有过一些并不是很适宜的对某些开发点的反复关注和修改,浪费了一些时间。这在随后持续进行的迭代开发周期中,还是需要警醒自身,并持续改善的。一方面避免代码浪费,另一方面还要和业务需求层面多进行沟通,以便做出的产品与实际需求之间偏差较小。

  综上所述,技术选型的过程并非是一帆风顺的,其过程尤其是人与人之间交互中,需要各方不断的争执和妥协。有些选型也并非一成不变,在发现问题之后,及时的回滚就可以了,最重要的是不可一条错路走到黑。而我们平时更愿意只选择自己最熟的路走,这对于开发产品来说并不是一件好事。

  我认为一个比较好的习惯是,无论遇到什么问题,哪怕是自己已有成熟想法的,都应该首先去搜索一下业界同类问题的解决办法,能够走大部分人共同走过的路,才是最安全可靠的。我们设计一个优秀的软件,做一个零散部件的组装者要比做一个从矿工开始的开发者需要付出的更少,且有更多的机会获得成功。技术选型正是一个选择零件的过程,这比架构的角色更为重要,无论拥有多么优秀的架构,一个足够分量的错误的零件都有可能会毁掉你设计的整座大厦。

====================================分割线================================

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-08-01 10:00:16

分布式测试框架架构与思考(1)技术选型的相关文章

分布式测试框架架构与思考(1)奠基

"工欲善其事必先利其器".无论是哪个行业,这都是一句至理名言,软件测试当然也不例外.这也正是分布式测试框架(下文简称DST)设计的初衷. DST是海量数据项目背景下,为了解决测试集管理.运行.查询和测试执行.控制以及监控.日志数据的收集整理的一个通用型测试与分析平台.这个平台既包含了传统测试框架的特点也包含了自身的开创性思想.作为DST从前端界面到后端服务的亲身经历和开发者,下面我将从技术选型.架构设计.功能点分析.使用场景以及周边支持工具这几个角度来对DST测试平台做一个总结,进一步

谈分布式测试体系构建

自谷歌提出云计算概念之后,大数据领域的发展就逐渐加速日新月异,云计算具体到实例,可以归纳为调度.均衡.容错.监控.运维等一整套操作海量数据的方案.有别于传统小规模或孤立体系产品,云计算生态圈存在错综复杂的系统级别关联,并行其中的不同架构和模块流转于超大规模的分布式软硬体资源中,很难划分出明显的界限.对于这样的产品体系,传统领域的测试方案要么逐渐失效,要么作用域缩减到仅能覆盖体系末端.为了保证大数据平台的可靠性.稳定性和高性能,亟需构建一套与之相匹配的测试体系来衡量产品是否合格. 存在的问题 业界

联想企业网盘基于Docker构建分布式部署框架实践

本文讲的是联想企业网盘基于Docker构建分布式部署框架实践[编者的话]本文首先介绍了企业级分布式系统部署所面临的挑战,并且结合联想云存储自有框架研发经验分享了一些解决问题的思想和具体做法.最后还与Kubernetes项目进行了简单对比. 众所周知,企业网盘在这两年呈现爆发式增长,越来越多的企业选择企业网盘,来解决企业在业务过程中面临的数据集中存储.共享.分发.协同办公以及移动化等痛点需求.同时将企业网盘整合到各个业务系统中,大幅提高企业的数据流转效率和安全! 而联想企业网盘增长尤为迅速,仅联想

分布式测试执行

1 相关说明 1.1 背景简介 随着一个产品的自动化工作不断深入,自动化的case积累数量持续增长,绝大部分毫无依赖关系的case由于串行运行,测试执行时间达到小时界别,且不易于优化.另外,ci运行时所需机器资源的抢占互斥,运行机器的不稳定等问题也逐渐扩大. Hadoop分布式测试执行方案正是为了解决以上问题而产生,通过分布式执行,可以达到并行运行,提高执行效率的目的:另外,hadoop提供调度,重试等机制功能,可以提供给用户一个相对透明的计算资源池,减少用户对机器运行环境的依赖. 1.2 分布

大数据平台架构技术选型与场景运用

一.大数据平台 大数据在工作中的应用有三种: 与业务相关,比如用户画像.风险控制等; 与决策相关,数据科学的领域,了解统计学.算法,这是数据科学家的范畴; 与工程相关,如何实施.如何实现.解决什么业务问题,这是数据工程师的工作. 数据工程师在业务和数据科学家之间搭建起实践的桥梁.本文要分享的大数据平台架构技术选型及场景运用偏向于工程方面. 如图所示,大数据平台第一个要素就是数据源,我们要处理的数据源往往是在业务系统上,数据分析的时候可能不会直接对业务的数据源进行处理,而是先经过数据采集.数据存储

Dubbo分布式服务框架入门(附工程)

版权声明:本文为博主原创文章,转载注明出处http://blog.csdn.net/u013142781 目录(?)[+] 要想了解Dubbo是什么,我们不防先了解它有什么用.  使用场景:比如我想开发一个网上商城项目,这个网上商城呢,比较复杂,分为pc端web管理后台,微信端销售公众号,那么我们分成四个项目,pc端网站,微信端网站,还有一个后台服务项目,接口服务项目. 对数据库的操作的相关接口放到接口服务项目,这些接口的实现放在后台服务项目,pc端网站和微信端网站都依赖接口服务项目,调用后台数

Struts行为测试框架StrutsTestCase实战

阅读提要 StrutsTestCase是一个强有力的易于使用的针对Struts行为的测试框架.StrutsTestCase,并与传统型JUnit测试相结合,将会带给你一个相当高的测试覆盖率并提高你的产品的可靠性. 一.引言 StrutsTestCase是一个用于测试Struts行为的基于Junit的测试框架.如果你使用Struts,那么你会注意到它可以提供给你一种容易而有效的方式来测试你的应用程序的Struts行为类. 典型的J2EE应用程序都是分层构建的,如图1所示. ·DAO层封装了数据库存

基于OSGi实现分布式服务框架历程(四)

在这个篇幅中将来分析下这个分布式服务框架的服务的生命周期的管理的问题,在分布式服务框架中,支持服务的动态部署.卸载.升级是很关键的,至于服务的生命周期是否需要做到像OSGi那样的动态通知,在这个篇幅中会进行分析,并最终形成这个分布式服务框架的生命周期模型以及到目前为止的服务架构模型. 先来分析下服务的生命周期是否需要做到像OSGi DS的动态通知,这里以服务组件安装为例稍微的说下OSGi DS服务的生命周期模型,在OSGi DS中,当有新的Service Component安装时,首先会检查其是

分析分布式服务框架

技术是为需求而服务的,分布式服务框架也同样如此,它不是凭空诞生的,也是因为有这样的需求才会有分布式服务框架这么样的东西诞生,在这篇blog中来详细的分析分布式服务框架诞生的原因(其实也是需要用分布式服务框架的应用场景,这里隐含的意思就是并不是什么应用都需要分布式服务框架的).分布式服务框架需要提供的feature以及实现这些feature可选的技术方案. 其实这篇blog应该写在实现分布式服务框架系列blog之前,:),不废话了,来看为什么会需要分布式服务框架,在一个不断发展的大型应用中,系统的