軟件測試中的一個(gè)智能的 Web 界面測試系統
Web2.0 是相對Web1.0 的新的一類(lèi)互聯(lián)網(wǎng)應用的統稱(chēng)。2001年秋天互聯(lián)網(wǎng)公司(dot-com)泡沫的破滅標志著(zhù)互聯(lián)網(wǎng)的一個(gè)轉折點(diǎn)。許多人斷定互聯(lián)網(wǎng)被過(guò)分炒作,事實(shí)上網(wǎng)絡(luò )泡沫和相繼而來(lái)的股市大衰退看起來(lái)像是所有技術(shù)革命的共同特征。股市大衰退通常標志著(zhù)蒸蒸日上的技術(shù)已經(jīng)開(kāi)始占領(lǐng)中央舞臺。假冒者被驅逐,而真正成功的故事展示了它們的力量,同時(shí)人們開(kāi)始理解了是什么將一個(gè)故事同另外一個(gè)區分開(kāi)來(lái)。 在那個(gè)會(huì )議之后的一年半的時(shí)間里,“Web 2.0”一詞已經(jīng)深入人心,從Google上可以搜索到4.7億 web2.0
以上的鏈接。但是,至今關(guān)于Web 2.0的含義仍存在極大的分歧,一些人將Web 2.0貶低為毫無(wú)疑義的一個(gè)行銷(xiāo)炒作口號,而其他一些人則將之理解為一種新的傳統理念。 在我們當初的頭腦風(fēng)暴中,我們已經(jīng)用一些例子,公式化地表達了我們對Web 2.0的理解:
Web 1.0 Web 2.0
1 DoubleClick Google AdSense
2 Ofoto Flickr
3 Akamai BitTorrent
4 mp3.com Napster
5 大英百科全書(shū)在線(xiàn)(Britannica Online) 維基百科全書(shū)(Wikipedia)
6 個(gè)人網(wǎng)站 博客(blogging)
7 evite upcoming.org和EVDB
8 域名投機 搜索引擎優(yōu)化[1][2]
9 屏幕抓。╯creen scraping) 網(wǎng)絡(luò )服務(wù)(web services)
10 發(fā)布 參與
11 內容管理系統 維基
12 目錄(分類(lèi)) 標簽(“分眾分類(lèi)”,folksonomy)
13 粘性 聚合
這個(gè)列表還會(huì )不斷繼續下去。但是到底是什么,使得我們認定一個(gè)應用程序或一種方式為作為所謂“Web 1.0”,而把另外一個(gè)叫做“Web 2.0”呢?(這個(gè)問(wèn)題尤為緊迫,因為Web 2.0的觀(guān)念 web2.0
已經(jīng)傳播的如此廣泛,以至于很多公司正在將這個(gè)詞加到他們的行銷(xiāo)炒作中,但卻沒(méi)有真正理解其含義。同時(shí)這個(gè)問(wèn)題也尤為困難,因為許多嗜好口號的創(chuàng )業(yè)公司顯然不是Web 2.0,而一些我們認為是Web 2.0的應用程序,例如Napster和BitTorrent,甚至不是真正適當的網(wǎng)絡(luò )程序。 然而,拋開(kāi)紛繁蕪雜的Web 2.0現象,進(jìn)而將其放到科技發(fā)展與社會(huì )變革的大視野下來(lái)看,Web 2.0可以說(shuō)是信息技術(shù)發(fā)展引發(fā)網(wǎng)絡(luò )革命所帶來(lái)的面向未來(lái)、以人為本的創(chuàng )新2.0模式在互聯(lián)網(wǎng)領(lǐng)域的典型體現,是由專(zhuān)業(yè)人員織網(wǎng)到所有用戶(hù)參與織網(wǎng)的創(chuàng )新民主化進(jìn)程的生動(dòng)注釋。Web2.0 是一個(gè)體現當代 WWW 技術(shù)發(fā)展趨勢的流行概念。它極力促進(jìn)創(chuàng )造性、信息交互性以及用戶(hù)間協(xié)作性的 Web 設計思想的推廣。這些想法帶來(lái)了各種豐富多彩的基于 Web 的互動(dòng)和資訊服務(wù)的開(kāi)發(fā)和演變。例如,社交網(wǎng)站,WIKI 以及博客。
Web2.0 最突出的特色就是豐富的客戶(hù)端技術(shù)。主要有三大類(lèi):
- Ajax 和 JSON
Ajax(Asynchronous JavaScript + XML)是 Web2.0 的主要技術(shù)。網(wǎng)頁(yè)瀏覽不再是單擊一下,然后等待整個(gè)頁(yè)面重新裝載,而是可以用鼠標順暢地滾動(dòng)地圖,等待局部數據的自動(dòng)刷新。典型的事例應用是 Google Map。
JSON(JavaScript Object Notation)是 Ajax 的衍生技術(shù)之一。Web 數據通常通過(guò) XML 傳輸。而 JSON 對象是一系列以逗號分隔的 name:value 對,與 XML 相比更加的簡(jiǎn)潔,傳輸效率高,適合大規模數據傳輸。典型的應用事例是 Live Search Box。
- Restful
REST(Representational State Transfer)是一種輕量級的面向數據庫的 Web 服務(wù)架構。REST 架構遵循 CRUD 原則,對于資源只需要四種行為:Create(創(chuàng )建)、Read(讀。、Update(更新)和 Delete(刪除)就可以完成對其操作和處理。典型的應用事例包括 Facebook 和 Flickr。
- RIA
RIA(Rich Internet Application)是如今非常流行的 Web 技術(shù)。它的界面類(lèi)似于一般的桌面程序,比一般的 Web 程序更加豐富并且互動(dòng)。目前比較流行的技術(shù)有三項:Abobe Flex, 微軟的 Silverlight 和 Sun 推廣的 JavaFX。三種技術(shù)都有自己的 SDK 和開(kāi)發(fā)工具。
介紹測試系統流程
以上我們簡(jiǎn)要介紹了 Web2.0 的概念和相關(guān)客戶(hù)端技術(shù)。為確?蛻(hù)端產(chǎn)品的質(zhì)量,我們需要使用與此相應的 Web 測試工具,從而方便地融合于產(chǎn)品測試中。此外,為適應 Web 開(kāi)發(fā)的靈活性,我們同時(shí)需要一個(gè)能夠快速配置、部署、運行和匯報結果的測試系統,從而實(shí)現智能高效的測試流程,降低軟件研發(fā)的成本。
基于以上論述,下面將介紹一個(gè)智能的 Web 界面測試系統。該系統有四大模塊組成,主體主要由 Python 語(yǔ)言實(shí)現,結合幾種開(kāi)發(fā)工具和技術(shù),包括 Ant、Selenium、TestNG、XML 和 Flex。系統有兩個(gè)控制方式:時(shí)間和 Web 管理站點(diǎn)。時(shí)間邏輯在 Python 腳本中實(shí)現,當時(shí)間到來(lái)時(shí)系統會(huì )按順序下載源代碼、部署應用程序、運行自動(dòng)測試、發(fā)布報告;而 Web 管理站點(diǎn)通過(guò) Flex 和 JAVA 技術(shù)來(lái)實(shí)現,用戶(hù)可以按需在線(xiàn)配置某些模塊,并要求立即執行自動(dòng)測試。
下面將詳細介紹每個(gè)模塊的具體工作內容。測試流程參見(jiàn)圖 1。
圖 1. 測試系統概述
源代碼和安裝包的按需下載
在軟件開(kāi)發(fā)過(guò)程中,每天都會(huì )因新的功能而更改源代碼。此外,很多項目需要國際團隊合作,這些情況下代碼的更新頻率更加高。本土和國外團隊經(jīng)常需要共享源代碼,而源代碼可能被存放在固定的站點(diǎn)上面。當源代碼文件量大而站點(diǎn)距離遙遠的時(shí)候,下載代碼的任務(wù)就比較耗時(shí)。為了節省這方面的時(shí)間,提高團隊整體的工作效率,有必要讓這部分工作自動(dòng)化起來(lái)。所以,系統首先實(shí)現了一個(gè)結合 Python 和 XML 的下載控制模塊。它的邏輯比較簡(jiǎn)單(參見(jiàn)圖 2)。Python 程序定時(shí)讀取配置文件,判斷該任務(wù)當前是否可以運行。如果此刻時(shí)間和配置的時(shí)間一致,就訪(fǎng)問(wèn)站點(diǎn),下載代碼包。否則,放入等待隊列,獲取下一個(gè)任務(wù)。在等待隊列里面的任務(wù)會(huì )在一定時(shí)間后重新啟動(dòng)。
圖 2. 下載流程
下載配置文件的內容參見(jiàn)以下代碼:
清單 1.下載配置文件的代碼<?xml version="1.0" encoding="utf-8"?> <items> <item name="download source files" type="source" weekday="-1" time="7:-1" source="https://sample.sourcecode.com" target="C:\sourcetar\"/> </items> |
讀取下載配置文件的代碼如下:
清單 2.讀取下載配置文件的代碼from xml.dom.minidom import parse, parseString from MyDownloadTask import MyDownloadTask def readFromProperty(xmlfile): tasklist = [] dom = parse(xmlfile) for node in dom.getElementsByTagName('item'): name = node.getAttribute('name') weekday = node.getAttribute('weekday') time = node.getAttribute('time') source = node.getAttribute('source') target = node.getAttribute('target') type = node.getAttribute('type') // 定義一個(gè)下載任務(wù) task = MyDownloadTask() task.create(name, weekday, time, source, target, type) // 加入下載任務(wù)列表 tasklist.append(task) return tasklist |
實(shí)現具體的下載邏輯如下:
清單 3.實(shí)現下載的代碼class MyDownloadTask(object): …… // 定義一些變量 def create(self, name, weekday, time, source, target, type): self.name = name self.weekday = int(weekday) self.source = source self.target = target index = time.find(":") self.hour = int(time[0:index]) self.minute = int(time[index+1:]) self.type = type def run() // 使用用戶(hù)名和密碼通過(guò)防火墻 password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm() password_mgr.add_password(None, self.source, username, password) handler = urllib.request.HTTPBasicAuthHandler(password_mgr) opener = urllib.request.build_opener(handler) urllib.request.install_opener (opener) // 從站點(diǎn)下載文件 content = urllib.request.urlopen(self. source).read() f=open(self.target + self.buildno,"wb") f.write(content) f.close() |
此例指出目前有一項下載任務(wù),下載類(lèi)型是源代碼,鏈接為 https://sample.sourcecode.com, 將其保持到 C 盤(pán) sourcetar 文件夾下,時(shí)間為每天早上 7 點(diǎn)鐘。(-1 代表任意時(shí)間)。項目組可以根據需要增加下載項。比如,我們項目組由于資源文件經(jīng)常要修改,所以需要每天上午和下午都要檢測是否有新的代碼包,所以配置了兩個(gè)下載任務(wù)。上午的時(shí)間一般都在 7 點(diǎn),這樣可以在每位同事上班打開(kāi)電腦的那個(gè)時(shí)刻就獲得大洋彼岸美國項目組下班時(shí)候的最新進(jìn)展。
正如前文所述,該測試系統中我們提供一個(gè) Web 管理站點(diǎn),用戶(hù)可以根據項目的需要配置下載任務(wù),不必麻煩系統管理員來(lái)修改下載配置文件。該模塊使用 Flex 和 Java 技術(shù)實(shí)現(參見(jiàn)圖 3)。用戶(hù)可以通過(guò)它了解當前系統已有的下載任務(wù)。此外,用戶(hù)也可以通過(guò)管理站點(diǎn)創(chuàng )建,修改和刪除下載任務(wù)。這些更改最終都會(huì )被保存到 XML 配置文件中。
圖 3. 下載管理界面
應用程序的部署
對 Web 應用程序而言,測試的第一步是部署。有了源代碼后,測試系統使用 Ant 編寫(xiě)的腳本編譯源代碼,停止當前已有的 Web 服務(wù)器,部署產(chǎn)品代碼,然后重新啟動(dòng) Web 服務(wù)器。在這段時(shí)間中,產(chǎn)品的測試環(huán)境可能暫時(shí)無(wú)法訪(fǎng)問(wèn)(參見(jiàn)以下代碼)。
清單 4.代碼部署def deploybuild(self): … // 清理文件夾,將源代碼解壓到 d 盤(pán) buildtar 目錄 try: tar = tarfile.open(self.target + myHtml.srcbuild, "r:gz") for tarinfo in tar: print(tarinfo.name, "is", tarinfo.size, "bytes in size") tar.extractall("d:/buildtar") tar.close() except : … // 編譯源代碼 os.chdir("d:/buildtar") os.system("Ant all") // 關(guān)閉 web 服務(wù) os.system("net stop \”servicename\""); … // 部署系統 // 開(kāi)啟 web 服務(wù) os.system("net start \"servicename\"") |
當新版本的 Web 應用程序部署完后,測試系統就開(kāi)始進(jìn)入自動(dòng)測試。本系統使用 SVN 對測試腳本進(jìn)行版本控制。所以有必要在一開(kāi)始通過(guò) SVN 更新最近的測試腳本。這里使用 Ant 來(lái)調用 SVN 的命令行工具,參見(jiàn)下圖。
使用如下 Python 腳本調用相應的 Ant 任務(wù):
清單 5.Python 腳本def runseleniumtestcase(self): // 下載測試腳本 os.chdir("d:/") os.system("Ant download-testcase -buildfile=task.xml") // 運行測試腳本 os.chdir("d:/v510") os.system("Ant start-selenium -buildfile=build.xml") <target name="download-testcase"> <delete dir ="v100"/> <property environment="env"/> <exec executable="cmd"> <env key="PATH" path="${env.PATH}:C:/Program Files/CollabNet Subversion Client"/> <arg value="/c"/> <arg value="svn"/> <arg value="checkout"/> <arg value="svn://9.19.199.9/web/v100"/> </exec> </target> |
事例中的任務(wù) download-testcase 用來(lái)從站點(diǎn) 9.19.199.9 的 web/v100 目錄下載最新版本的測試腳本。start-selenium 任務(wù)將啟動(dòng) selenium 的 proxy server,然后按照 TestNG 配置的順序運行測試腳本。
測試系統的腳本應用 Selenium 和 TestNG 的測試工具,實(shí)現對各類(lèi)型 Web 界面的測試需求。在第三節中將詳細介紹 Selenium 工具在本系統的應用,并在第四章中介紹 TestNG 工具在配置 Selenium 測試腳本中的作用。
為適應項目開(kāi)發(fā)周期不同階段的測試需求,Web 管理站點(diǎn)將列出當前所以測試案例。用戶(hù)可以自由地挑選下次測試需要的用例。當用戶(hù)選擇保存后,這些測試腳本就會(huì )在下次系統自動(dòng)部署時(shí)候被運行。如果用戶(hù)選擇運行,那么系統可以馬上在當前已部署的產(chǎn)品環(huán)境上運行測試腳本。
發(fā)布自動(dòng)測試報告
文章來(lái)源于領(lǐng)測軟件測試網(wǎng) http://kjueaiud.com/