//
Transwarp - 新聞詳情
http://www.transwarp.io/news/detail?id=151
在項(xiàng)目迭代周期有限的情況下浪耘,流程冗長(zhǎng)條件復(fù)雜的升級(jí)測(cè)試無(wú)法再依賴(lài)人工的辦法完成溜在,必須借助自動(dòng)化測(cè)試的工具和方法解決這個(gè)問(wèn)題逐沙。本文將以Transwarp Data Hub(TDH)的自動(dòng)化升級(jí)測(cè)試的架構(gòu)為例,分析應(yīng)如何選擇并系統(tǒng)性的整合不同技術(shù)以合理實(shí)現(xiàn)自動(dòng)化測(cè)試以及部署升級(jí)送悔。
隨著產(chǎn)品發(fā)行版的增多,大量存在于客戶(hù)現(xiàn)場(chǎng)的老版本有待升級(jí)更新,每當(dāng)一個(gè)新版本產(chǎn)品發(fā)布給客戶(hù)前荚板,測(cè)試人員必須保證新的發(fā)行版可以完美支持老版本的升級(jí)凤壁。每一版產(chǎn)品引入的新功能或組件,也需確定不會(huì)和老版本產(chǎn)品既有的功能產(chǎn)生沖突跪另。由此體現(xiàn)了升級(jí)測(cè)試的極度必要性拧抖。通常在對(duì)TDH進(jìn)行版本升級(jí)測(cè)試時(shí),我們的開(kāi)發(fā)人員不僅要考慮到前端界面免绿,還要考慮到后端升級(jí)程序的執(zhí)行唧席。而且為了保證測(cè)試維度的完備性以及便于分析,升級(jí)測(cè)試框架必須保證以下幾點(diǎn):
- 自動(dòng)升級(jí)測(cè)試
- 模擬用戶(hù)的行為
- 穩(wěn)定性保證
- 詳細(xì)的測(cè)試報(bào)告
- 隨時(shí)查看升級(jí)過(guò)程
考慮到上述幾項(xiàng)需求嘲驾,我們決定采用Docker + Jenkins再結(jié)合Selenium + VNC Server + Guacamole + Python這種技術(shù)混合型組合構(gòu)建自動(dòng)化升級(jí)測(cè)試環(huán)境淌哟。
首先請(qǐng)讀者閱讀下面的技術(shù)詳解,簡(jiǎn)單了解這五種相關(guān)工具和技術(shù)的作用辽故。
技術(shù)詳解
Docker
Docker是被廣泛應(yīng)用的一種開(kāi)源容器引擎徒仓,它可以支持程序的快速部署和移植,并具有很好的環(huán)境隔離性誊垢。在本文的例子中掉弛,我們將TDH升級(jí)所需要的OS運(yùn)行環(huán)境——Remote WebDriver 和VNC Server,做在一個(gè)Docker鏡像里喂走,作為testbench殃饿。執(zhí)行TDH升級(jí)測(cè)試前, 只需將TDH的程序部署到對(duì)應(yīng)的testbench容器中即可運(yùn)行。其中VNC Server提供的遠(yuǎn)程桌面服務(wù)允許開(kāi)發(fā)者在Docker中debug測(cè)試中發(fā)現(xiàn)的問(wèn)題芋肠。
以下是制作鏡像的對(duì)應(yīng)部分的Dockerfile文件內(nèi)容:
FROM centos7_webtest:latestMAINTAINER transwarp#install jdkRUN rpm -ivh jdk-7u71-linux-x64.rpm#change yum repoADD change_yum.sh /root/RUN sh /root/change_yum.sh && rm -f /root/change_yum.sh#add htmlADD HTMLTestRunner.py /usr/lib/python2.7/site-packages/
Jenkins
Jenkins是一種持續(xù)構(gòu)建工具乎芳,為了方便開(kāi)發(fā)和測(cè)試人員監(jiān)控每日升級(jí)測(cè)試的狀態(tài),我們將TDH升級(jí)測(cè)試按照流程階段和測(cè)試用例做成若干個(gè)參數(shù)化的Jenkins Jobs业栅,通過(guò)Jenkins的計(jì)劃任務(wù)秒咐,啟動(dòng)TDH 升級(jí)測(cè)試。
Selenium
Selenium是一套面向web應(yīng)用的開(kāi)源的測(cè)試輕量級(jí)框架碘裕,具有跨平臺(tái)性的優(yōu)點(diǎn)携取,并獲得了包括Java、Python在內(nèi)的多個(gè)主流編程語(yǔ)言的支持帮孔。Selenium是TDH前端操作的重要工具雷滋,我們通過(guò)Selenium實(shí)現(xiàn)啟停服務(wù),添加配置文兢,安裝LDAP晤斩、Gardian等一系列操作。
下面是Selenium登陸Transwarp-Manager對(duì)應(yīng)的代碼示例姆坚。
from selenium import webdriverfrom selenium.webdriver.common.desired_capabilities import DesiredCapabilitiesdriver =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是一種為了滿(mǎn)足分布式用戶(hù)共享資源的需求澳泵,在服務(wù)器上開(kāi)的一項(xiàng)服務(wù)。TDH選擇Guacamole遠(yuǎn)程連接訪(fǎng)問(wèn)VNC Server兼呵。Guacamole是基于HTML 5和JavaScript的VNC Web查看器兔辅。通過(guò)Guacamole網(wǎng)頁(yè)連接VNC Server就可以方便遠(yuǎn)程觀(guān)察TDH升級(jí)狀態(tài)腊敲。
Python
******Pycrypto/Paramiko模塊******
Pycryto和Paramiko是Python中用于遠(yuǎn)程認(rèn)證登錄服務(wù)器的兩個(gè)重要的模塊:Pycrypto用于安全認(rèn)證;Paramik用于登陸遠(yuǎn)程服務(wù)器執(zhí)行命令维苔。TDH版本升級(jí)過(guò)程中會(huì)利用這兩個(gè)模塊遠(yuǎn)程到對(duì)應(yīng)的集群服務(wù)器碰辅,執(zhí)行對(duì)應(yīng)的升級(jí)程序。
******HTML Report******
升級(jí)完成后介时,需要給出詳細(xì)的測(cè)試報(bào)告没宾,比如每個(gè)階段的執(zhí)行時(shí)間、啟動(dòng)時(shí)間沸柔、是否成功等關(guān)鍵信息循衰。由于Python自帶的或者第三方開(kāi)發(fā)的模塊生成測(cè)試報(bào)告基本都是UT級(jí)別的,因此無(wú)法使用現(xiàn)成的模塊勉失,需要自己進(jìn)行開(kāi)發(fā)羹蚣。我們參考Python中對(duì)應(yīng)的模塊HTMLTestRunner對(duì)生成的測(cè)試報(bào)告進(jìn)行二次開(kāi)發(fā)。
****技術(shù)框架****
根據(jù)工具的不同特征乱凿,TDH自動(dòng)化升級(jí)框架為每個(gè)工具安排了不同的處理任務(wù):Docker用于部署用到的程序和環(huán)境;整體的測(cè)試工作由Jenkins負(fù)責(zé)調(diào)度咽弦;Selenium負(fù)責(zé)前端界面方面測(cè)試徒蟆;Guacamole作為遠(yuǎn)程桌面客戶(hù)端連接VNC Server;利用Python支持Selenium和shell腳本以及實(shí)現(xiàn)遠(yuǎn)程服務(wù)器的加密認(rèn)證連接型型。根據(jù)上述任務(wù)分配段审,我們?cè)O(shè)計(jì)了TDH自動(dòng)化升級(jí)測(cè)試的流程,并為之構(gòu)建了如下框架:
- 將TDH升級(jí)做成一個(gè)Jenkins Job闹蒜,需要用戶(hù)事先配置好升級(jí)對(duì)應(yīng)的集群寺枉,自動(dòng)升級(jí)需要的客戶(hù)端代碼地址、Docker Image配置等绷落。啟動(dòng)該Job即可進(jìn)行TDH升級(jí)任務(wù)姥闪,可以是手動(dòng)啟動(dòng),也可以定時(shí)觸發(fā). 而且還可以通過(guò)Jenkins界面來(lái)觀(guān)察對(duì)應(yīng)Job的狀態(tài)砌烁。
- 啟動(dòng)Jenkins Job進(jìn)行TDH升級(jí)之后筐喳,Jenkins會(huì)通過(guò)事先做好的Docker 鏡像啟動(dòng)一個(gè)Container,該Container包含客戶(hù)端運(yùn)行的所有環(huán)境函喉。
- Container啟動(dòng)之后會(huì)從Git/SVN 上checkout對(duì)應(yīng)的自動(dòng)化升級(jí)需要的客戶(hù)端代碼避归。
- 運(yùn)行Container中的客戶(hù)端代碼,開(kāi)始自動(dòng)化升級(jí)管呵,首先會(huì)發(fā)送HTTP Request去連接遠(yuǎn)端的Selenium WebDriver梳毙。然后利用SeleniumWebDriver去打開(kāi)TDH需要升級(jí)的管理界面,進(jìn)行前端操作捐下。然后TDH客戶(hù)端程序也會(huì)進(jìn)行后端升級(jí)账锹,遠(yuǎn)程到對(duì)應(yīng)需要升級(jí)的集群上運(yùn)行對(duì)應(yīng)的升級(jí)腳本冠跷,監(jiān)聽(tīng)是否升級(jí)成功信號(hào)噪窘。
- Selenium WebDriver對(duì)應(yīng)的服務(wù)器(Docker Container)需打開(kāi)VNC Server服務(wù),客戶(hù)端可以通過(guò)VNC Viewer查看前端界面升級(jí)狀況。這里的VNC Viewer使用的就是Guacamole榨乎。
- Jenkins會(huì)獲取到客戶(hù)端程序運(yùn)行時(shí)詳細(xì)的日志以及對(duì)應(yīng)的升級(jí)報(bào)告,客戶(hù)端通過(guò)對(duì)應(yīng)的日志和升級(jí)報(bào)告獲取到每個(gè)升級(jí)步驟的詳細(xì)信息鸭限。
實(shí)例詳解
下面以TDH4.3.5升級(jí)到4.6 為例闰蚕,具體說(shuō)明開(kāi)發(fā)測(cè)試人員執(zhí)行TDH自動(dòng)化升級(jí)測(cè)試時(shí)的操作。
第一步:創(chuàng)建一個(gè)Jenkins Job并配置以下參數(shù)懂从。
manager_ip:Transwarp-Manager對(duì)應(yīng)的ip
username:Transwarp-Manager對(duì)應(yīng)服務(wù)器登陸賬號(hào)
password:Transwarp-Manager對(duì)應(yīng)服務(wù)器登陸賬號(hào)對(duì)應(yīng)的密碼
upgrade_tar_location:升級(jí)腳本對(duì)應(yīng)的位置
upgrade_latest_install_tar:需要升級(jí)到對(duì)應(yīng)的TDH的對(duì)應(yīng)的tar包位置
new_version:升級(jí)到的TDH 版本
upgrade_mode:選擇升級(jí)安全模式
service_add:升級(jí)結(jié)束后需要添加的服務(wù)
第二步:?jiǎn)?dòng)Jenkins Job授段,準(zhǔn)備進(jìn)行TDH升級(jí)。
第三步:?jiǎn)?dòng)一個(gè)Container番甩,從Git上拉取對(duì)應(yīng)代碼侵贵,然后開(kāi)始執(zhí)行升級(jí)程序。
第四步:通過(guò)Selenium模擬鼠標(biāo)點(diǎn)擊關(guān)閉所有的服務(wù)(Zookeeper除外)缘薛,如下圖窍育。
第五步:遠(yuǎn)程到升級(jí)所對(duì)應(yīng)的集群,配置升級(jí)腳本并執(zhí)行宴胧,等待升級(jí)結(jié)果漱抓。
第六步:升級(jí)完成后,通過(guò)Selenium模擬鼠標(biāo)點(diǎn)擊輸入新的License恕齐,更新集群的License乞娄。
第七步:安裝并啟動(dòng)Guardian服務(wù)。界面上的安裝過(guò)程如下圖显歧。
第八步:根據(jù)客戶(hù)升級(jí)需要在如下界面上添加對(duì)應(yīng)的組件仪或。
第九步:最后獲得對(duì)應(yīng)的如下升級(jí)報(bào)告。
******總結(jié)******
通過(guò)產(chǎn)品升級(jí)測(cè)試的自動(dòng)化士骤,我們省去了大量的人工操作和重復(fù)性操作范删,提高了TDH升級(jí)測(cè)試可靠性,結(jié)構(gòu)化的測(cè)試報(bào)告幫助測(cè)試和開(kāi)發(fā)人員迅速定位到升級(jí)過(guò)程中發(fā)生的問(wèn)題敦间。自動(dòng)化把之前需要2~3天才能完成的升級(jí)測(cè)試縮短到了一天以?xún)?nèi)瓶逃,大大提高了測(cè)試效率,為今后多產(chǎn)品線(xiàn)并行發(fā)布打下了堅(jiān)實(shí)的基礎(chǔ)廓块。
在整個(gè)的自動(dòng)化測(cè)試框架中厢绝,使用Docker技術(shù)是極大提高我們測(cè)試效率的關(guān)鍵。Docker保證了開(kāi)發(fā)環(huán)境到生產(chǎn)環(huán)境的一致性带猴,無(wú)論對(duì)于什么產(chǎn)品昔汉,在該框架下,開(kāi)發(fā)和測(cè)試者只要提供相應(yīng)的鏡像和程序就可以按照模板跑自動(dòng)化任務(wù)。開(kāi)發(fā)人員能夠任意時(shí)間點(diǎn)對(duì)指定代碼或功能進(jìn)行測(cè)試靶病,盡早發(fā)現(xiàn)錯(cuò)誤以降低試錯(cuò)成本会通。在我們的實(shí)際開(kāi)發(fā)中,任何一個(gè)代碼的提交都經(jīng)過(guò)整套測(cè)試流程娄周,從而縮短產(chǎn)品開(kāi)發(fā)周期中開(kāi)發(fā)和測(cè)試之間的依賴(lài)鏈涕侈,有效提高產(chǎn)品迭代速度。