在项目迭代周期有限的情况下,流程冗长条件复杂的升级测试无法再依赖人工的办法完成,必须借助自动化测试的工具和方法解决这个问题。本文将以
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
J
enkins是一种持续构建工具,为了方便开发和测试人员监控每日升级测试的状态,我们将TDH升级测试按照流程阶段和测试用例做成若干个参数化的Jenkins Jobs,通过Jenkins的计划任务,启动TDH 升级测试。
Selenium
Selenium是
一套面向
web应用的
开源
的测试
轻量级框架,
具有
跨平台
性的优点,并获得了包括
Java、Python在内的多个主流编程语言的
支持
。
Selenium
是
TDH前端操作的重要工具,
我们
通过
Selenium
实现
启停服务,添加配置,安装
LDAP、
Gardian
等
一系列操作。
下面是
Selenium
登陆T
ranswarp-Manager对应的代码示例。
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
driver =webdriver.Remote(command_executor='http://remoteIP:port/wd/hub', desired_capabilities=DesiredCapabilities.CHROME)
driver.set_page_load_timeout(30)
driver.implicitly_wait(30)
driver.maximize_window()
driver.get("TRANSWARP-MANAGERT-IP:8180")
driver.find_element_by_id("userid").clear().send_keys(USER)
driver.find_element_by_id("passwd").clear().send_keys(PASSWORD)
driver.find_element_by_id("sign-in-button").click()
|
VNC Server + Guacamole
VNC Server是一种为了满足分布式用户共享资源的需求,在服务器上开的一项服务。
TDH选择Guacamole远程连接访问VNC Server。Guacamole是
基于HTML 5和JavaScript的VNC
Web
查看器。
通过
Guacamole
网页连接VNC
Server就可以方便
远程
观察TDH升级状态
。
Python
Pycryto和Paramiko是
Python
中用于远程认证登录服务器
的两个重要的模块
:
P
ycrypto
用于安全认证
;
P
aramik
用于登陆远程服务器执行
命令
。
TDH版本升级过程中会
利用这两个模块
远程到对应的集群服务器
,
执行对应的升级程序
。
升级完成后
,
需要给出详细的测试报告
,
比如每个阶段的执行时间
、
启动时间
、
是否成功等关键信息
。
由于
P
ython自带的或者第三方开发的模块生成测试报告基本都是UT级别的
,
因此无法使用现成的模块
,
需要自己进行开发
。
我们参考
P
ython中对应的模块
HTMLTestRunner对生成的测试报告
进行二次开发。
根据工具的不同特征,TDH自动化升级框架为每个工具安排了不同的处理任务:Docker用于部署
用到的程序和环境;整体的测试工作由Jenkins负责调度;Selenium负责前端界面方面测试;Guacamole
作为
远程桌面客户端连接VNC
Server;利用Python支持Selenium和shell脚本以及实现远程服务器的加密认证连接
。根据上述任务分配,我们设计了TDH自动化升级测试的流程,并为之构建了如下框架:
1. 将
TDH升级做成一个
J
enkins
J
ob,需要用户事先配置好升级对应的集群,自动升级需要的客户端代码地址
、
D
ocker
I
mage配置等
。
启动该
J
ob即可进行TDH升级任务,可以是手动启动,也可以定时触发. 而且还可以通过
J
enkins界面来观察对应
J
ob的状态。
2. 启动
J
enkins
J
ob进行TDH升级之后
,
J
enkins会通过事先做好的
D
ocker
镜像
启动一个
C
ontainer
,
该C
ontainer包含客户端运行的所有环境
。
3. C
ontainer启动之后会从Git/SVN 上checkou
t
对应的自动化升级需要的客户端代码。
4. 运行
C
ontainer中的客户端代码,开始自动化升级,首先会发送
HTTP R
equest去连接远端的
S
elenium
W
eb
D
river
。
然后利用
S
elenium
W
eb
D
river去打开TDH需要升级的管理界面,进行前端操作
。
然后TDH客户端程序也会进行后端升级,远程到对应需要升级的集群上运行对应的升级脚本,监听是否升级成功信号
。
5. S
elenium
W
eb
D
river对应的服务器(
D
ocker
C
ontainer)需打开VNC Server
服务
,
客户端可以通过VNC View
er
查看前端界面升级状况
。
这里
的
VNC View
er使用的就是
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
:升级结束后需要添加的服务
|
第二步:
启动
J
enkins
J
ob
,
准备
进行TDH升级
。
第三步:启动一个
C
ontainer,从
G
it上拉取对应代码,然后开始执行升级程序
。
第四步:
通过
S
elenium模拟鼠标点击关闭所有的服务
(
Zookeeper除外
),如下图。
第五步:
远程到升级所对应的集群,配置升级脚本并执行,等待升级结果
。
第六步:
升级完成后,通过
S
elenium模拟鼠标点击输入新的
L
icense,更新集群的
L
icense
。
第七步:
安装并启动
G
uardian服务
。界面上的安装过程如下图。
第八步:
根据客户升级需要在如下界面上添加对应的组件
。
第九步:最后获得对应的如下升级报告
。
通过
产品
升级
测试
的
自动化
,
我们
省去了
大量的
人工操作和重复性操作
,
提高了
TDH升级
测试可靠性
,
结构化的测试报告帮助测试和开发人员迅速定位到升级过程中发生的问题
。
自动化
把之前需要
2~3
天才能完成的升级测试缩短到了一天以内,
大大提高了测试效率
,
为今后多产品线并行发布打下了坚实的基础
。
在整个的自动化测试框架中,使用Docker技术是极大提高我们测试效率的关键。Docker保证了开发环境到生产环境的一致性,无论对于什么产品,在该框架下,开发和测试者只要提供相应的镜像和程序就可以按照模板跑自动化任务。开发人员能够任意时间点对指定代码或功能进行测试,尽早发现错误以降低试错成本。在我们的实际开发中,任何一个代码的提交都经过整套测试流程,从而缩短产品开发周期中开发和测试之间的依赖链,有效提高产品迭代速度。
# 运行容器
$
docker
run --name my
jenkins
-itd --network host -v
/home/wyt/
jenkins
_home:/var/
jenkins
_home --env JAVA_OPTS="-Xmx8192m"
jenkins
$
docker
最近做的针对一个python脚本。用Java做了一个
自动化
sanity
测试
(cucumber)并根据脚本执行后的答复(null,0,1等)通过Assert确认运行结果。代码写好后,因该
测试
是由
jenkins
自动执行:从资源申请到
环境
准备,到build,service start,到API
测试
执行,最后的资源回收,整个过程都是自动执行,无法中途直接进入查询或手工执行
测试
,只能通过之后的日志去判断和分析。
脚本库是要运行在python3
环境
,并包含有标准库外的库包,
Java运行该脚本是通过
docker
安装
jenkins
安装
docker
run -d -u root --restart=always --name
jenkins
-server -v /usr/local/allure:/usr/local/allure -v /usr/local/git:/usr/local/git -v /usr/local/maven:/usr/local/maven -v /usr/loc
1、我们使用的jdk放置了微信专用的jar。所以自己建了一个基础镜像,参考文献:
Docker
:JDK镜像制作_陌生谁家年少-CSDN博客_制作jdk镜像
2、同一台机器
部署
多个
docker
时 隐射的日志目录不能相同,所以我们按端口号建立了文件夹
3、自学
Docker
file 命令
docker
命令(注意: RUN 制作镜像时运行 CMD 容器启动时运行,
docker
run ...
# 创建对应目录
mkdir -p /data/
jenkins
/
jenkins
_home/
chown -R 1000:1000 /data/
jenkins
/
jenkins
_home/
+ data
-
docker
-compose.yml // doc
前端这几年发展得非常迅速,我们的系统的功能正在变得越来越复杂,这对我们的前端工程化能力提出了更高的要求,听到工程化,大家的第一反应肯定是高质量的代码设计和高质量的代码实现。但实际上,前端
自动化
测试
也是前端工程化里面非常重要的一个环节。