在项目迭代周期有限的情况下,流程冗长条件复杂的升级测试无法再依赖人工的办法完成,必须借助自动化测试的工具和方法解决这个问题。本文将以Transwarp Data Hub(TDH)的自动化升级测试的架构为例,分析应如何选择并系统性的整合不同技术以合理实现自动化测试以及部署升级。
随着产品发行版的增多,大量存在于客户现场的老版本有待升级更新,每当一个新版本产品发布给客户前,测试人员必须保证新的发行版可以完美支持老版本的升级。每一版产品引入的新功能或组件,也需确定不会和老版本产品既有的功能产生冲突。由此体现了升级测试的极度必要性。通常在对TDH进行版本升级测试时,我们的开发人员不仅要考虑到前端界面,还要考虑到后端升级程序的执行。而且为了保证测试维度的完备性以及便于分析,升级测试框架必须保证以下几点:
自动升级测试
模拟用户的行为
稳定性保证
详细的测试报告
随时查看升级过程
考虑到上述几项需求,我们决定采用Docker + Jenkins再结合Selenium + VNC Server + Guacamole + Python这种技术混合型组合构建自动化升级测试环境。
首先请读者阅读下面的技术详解,简单了解这五种相关工具和技术的作用。
技术详解
Docker
Docker是被广泛应用的一种开源容器引擎,它可以支持程序的快速部署和移植,并具有很好的环境隔离性。在本文的例子中,我们将TDH升级所需要的OS运行环境——Remote WebDriver 和VNC Server,做在一个Docker镜像里,作为testbench。执行TDH升级测试前, 只需将TDH的程序部署到对应的testbench容器中即可运行。其中VNC Server提供的远程桌面服务允许开发者在Docker中debug测试中发现的问题。
以下是制作镜像的对应部分的Dockerfile文件内容:
ROM centos7_webtest:latest MAINTAINER transwarp #install jdk RUN rpm -ivh jdk-7u71-linux-x64.rpm #change yum repo ADD change_yum.sh /root/ RUN sh /root/change_yum.sh && rm -f /root/change_yum.sh #add html ADD HTMLTestRunner.py /usr/lib/python2.7/site-packages/ ... |
Jenkins
Jenkins是一种持续构建工具,为了方便开发和测试人员监控每日升级测试的状态,我们将TDH升级测试按照流程阶段和测试用例做成若干个参数化的Jenkins Jobs,通过Jenkins的计划任务,启动TDH 升级测试。
Selenium
Selenium是一套面向web应用的开源的测试轻量级框架,具有跨平台性的优点,并获得了包括Java、Python在内的多个主流编程语言的支持。Selenium是TDH前端操作的重要工具,我们通过Selenium实现启停服务,添加配置,安装LDAP、Gardian等一系列操作。
下面是Selenium登陆Transwarp-Manager对应的代码示例。
from selenium import webdriver |
VNC Server + Guacamole
VNC Server是一种为了满足分布式用户共享资源的需求,在服务器上开的一项服务。TDH选择Guacamole远程连接访问VNC Server。Guacamole是基于HTML 5和JavaScript的VNC Web查看器。通过Guacamole网页连接VNC Server就可以方便远程观察TDH升级状态。
Python
Pycrypto/Paramiko模块
Pycryto和Paramiko是Python中用于远程认证登录服务器的两个重要的模块:Pycrypto用于安全认证;Paramik用于登陆远程服务器执行命令。TDH版本升级过程中会利用这两个模块远程到对应的集群服务器,执行对应的升级程序。
HTML Report
升级完成后,需要给出详细的测试报告,比如每个阶段的执行时间、启动时间、是否成功等关键信息。由于Python自带的或者第三方开发的模块生成测试报告基本都是UT级别的,因此无法使用现成的模块,需要自己进行开发。我们参考Python中对应的模块HTMLTestRunner对生成的测试报告进行二次开发。
技术框架
根据工具的不同特征,TDH自动化升级框架为每个工具安排了不同的处理任务:Docker用于部署用到的程序和环境;整体的测试工作由Jenkins负责调度;Selenium负责前端界面方面测试;Guacamole作为远程桌面客户端连接VNC Server;利用Python支持Selenium和shell脚本以及实现远程服务器的加密认证连接。根据上述任务分配,我们设计了TDH自动化升级测试的流程,并为之构建了如下框架:
1. 将TDH升级做成一个Jenkins Job,需要用户事先配置好升级对应的集群,自动升级需要的客户端代码地址、Docker Image配置等。启动该Job即可进行TDH升级任务,可以是手动启动,也可以定时触发. 而且还可以通过Jenkins界面来观察对应Job的状态。
2. 启动Jenkins Job进行TDH升级之后,Jenkins会通过事先做好的Docker 镜像启动一个Container,该Container包含客户端运行的所有环境。
3. Container启动之后会从Git/SVN 上checkout对应的自动化升级需要的客户端代码。
4. 运行Container中的客户端代码,开始自动化升级,首先会发送HTTP Request去连接远端的SeleniumWebDriver。然后利用Selenium WebDriver去打开TDH需要升级的管理界面,进行前端操作。然后TDH客户端程序也会进行后端升级,远程到对应需要升级的集群上运行对应的升级脚本,监听是否升级成功信号。
5. Selenium WebDriver对应的服务器(Docker Container)需打开VNC Server服务,客户端可以通过VNC Viewer查看前端界面升级状况。这里的VNC Viewer使用的就是Guacamole。
6. Jenkins会获取到客户端程序运行时详细的日志以及对应的升级报告,客户端通过对应的日志和升级报告获取到每个升级步骤的详细信息。
实例详解
下面以TDH4.3.5升级到4.6 为例,具体说明开发测试人员执行TDH自动化升级测试时的操作。
第一步:创建一个Jenkins Job并配置以下参数。
manager_ip:Transwarp-Manager对应的ip username:Transwarp-Manager对应服务器登陆账号 password:Transwarp-Manager对应服务器登陆账号对应的密码 upgrade_tar_location:升级脚本对应的位置 upgrade_latest_install_tar:需要升级到对应的TDH的对应的tar包位置 new_version:升级到的TDH 版本 upgrade_mode:选择升级安全模式 service_add:升级结束后需要添加的服务 |
第二步:启动Jenkins Job,准备进行TDH升级。
第三步:启动一个Container,从Git上拉取对应代码,然后开始执行升级程序。
第四步:通过Selenium模拟鼠标点击关闭所有的服务(Zookeeper除外),如下图。
第五步:远程到升级所对应的集群,配置升级脚本并执行,等待升级结果。
第六步:升级完成后,通过Selenium模拟鼠标点击输入新的License,更新集群的License。
第七步:安装并启动Guardian服务。界面上的安装过程如下图。
第八步:根据客户升级需要在如下界面上添加对应的组件。
第九步:最后获得对应的如下升级报告。
总结
通过产品升级测试的自动化,我们省去了大量的人工操作和重复性操作,提高了TDH升级测试可靠性,结构化的测试报告帮助测试和开发人员迅速定位到升级过程中发生的问题。自动化把之前需要2~3天才能完成的升级测试缩短到了一天以内,大大提高了测试效率,为今后多产品线并行发布打下了坚实的基础。
在整个的自动化测试框架中,使用Docker技术是极大提高我们测试效率的关键。Docker保证了开发环境到生产环境的一致性,无论对于什么产品,在该框架下,开发和测试者只要提供相应的镜像和程序就可以按照模板跑自动化任务。开发人员能够任意时间点对指定代码或功能进行测试,尽早发现错误以降低试错成本。在我们的实际开发中,任何一个代码的提交都经过整套测试流程,从而缩短产品开发周期中开发和测试之间的依赖链,有效提高产品迭代速度。