在项目迭代周期有限的情况下,流程冗长条件复杂的升级测试无法再依赖人工的办法完成,必须借助自动化测试的工具和方法解决这个问题。本文将以 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

  • Pycrypto/Paramiko模块

Pycryto和Paramiko是 Python 中用于远程认证登录服务器 的两个重要的模块 P ycrypto 用于安全认证 P aramik 用于登陆远程服务器执行 命令 TDH版本升级过程中会 利用这两个模块 远程到对应的集群服务器 执行对应的升级程序

  • HTML Report

升级完成后 需要给出详细的测试报告 比如每个阶段的执行时间 启动时间 是否成功等关键信息 由于 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 前端这几年发展得非常迅速,我们的系统的功能正在变得越来越复杂,这对我们的前端工程化能力提出了更高的要求,听到工程化,大家的第一反应肯定是高质量的代码设计和高质量的代码实现。但实际上,前端 自动化 测试 也是前端工程化里面非常重要的一个环节。