Web2.0 技術使 Web 界面更加豐富多彩,使信息交流更加靈活,同時也使得相關的 Web 技術
測試需求越來越多。那么,如何提高 Web 界面的測試效率,保證新技術得到高質量應用?是否可以讓測試人員脫離枯燥地點擊鼠標,讓機器自動地根據腳本運行?隨著項目需求的變化,能否有一個比較快速地
配置管理測試任務的方法?所有這些都可以通過一個智能的 Web 界面測試系統來實現。這個系統結合 TestNG, Ant,
Selenium 還有 Flex 技術,實現方式簡單、運行高效靈活,對
單元測試,
功能測試和集成測試都有益,能夠提高團隊的
工作效率。
介紹 Web2.0 相關技術
Web2.0 是一個體現當代 WWW 技術發展趨勢的流行概念。它極力促進創造性、信息交互性以及用戶間協作性的 Web 設計思想的推廣。這些想法帶來了各種豐富多彩的基于 Web 的互動和資訊服務的開發和演變。例如,社交網站,WIKI 以及博客。
Web2.0 最突出的特色就是豐富的客戶端技術。主要有三大類:
Ajax 和 JSON
Ajax(Asynchronous JavaScript + XML)是 Web2.0 的主要技術。網頁瀏覽不再是單擊一下,然后等待整個頁面重新裝載,而是可以用鼠標順暢地滾動地圖,等待局部數據的自動刷新。典型的事例應用是
Google Map。
JSON(JavaScript Object Notation)是 Ajax 的衍生技術之一。Web 數據通常通過 XML 傳輸。而 JSON 對象是一系列以逗號分隔的 name:value 對,與 XML 相比更加的簡潔,傳輸效率高,適合大規模數據傳輸。典型的應用事例是 Live Search Box。
Restful
REST(Representational State Transfer)是一種輕量級的面向
數據庫的 Web 服務架構。REST 架構遵循 CRUD 原則,對于資源只需要四種行為:Create(創建)、Read(讀取)、Update(更新)和 Delete(刪除)就可以完成對其操作和處理。典型的應用事例包括 Facebook 和 Flickr。
RIA
RIA(Rich Internet Application)是如今非常流行的 Web 技術。它的界面類似于一般的桌面程序,比一般的 Web 程序更加豐富并且互動。目前比較流行的技術有三項:Abobe Flex,
微軟的 Silverlight 和 Sun 推廣的 JavaFX。三種技術都有自己的 SDK 和開發工具。
介紹測試系統流程
以上我們簡要介紹了 Web2.0 的概念和相關客戶端技術。為確保客戶端產品的質量,我們需要使用與此相應的 Web 測試工具,從而方便地融合于產品測試中。此外,為適應 Web 開發的靈活性,我們同時需要一個能夠快速配置、部署、運行和匯報結果的測試系統,從而實現智能高效的測試流程,降低軟件研發的成本。
基于以上論述,下面將介紹一個智能的 Web 界面測試系統。該系統有四大模塊組成,主體主要由
Python 語言實現,結合幾種開發工具和技術,包括 Ant、Selenium、TestNG、XML 和 Flex。系統有兩個控制方式:時間和 Web 管理站點。時間邏輯在 Python 腳本中實現,當時間到來時系統會按順序下載源代碼、部署應用程序、運行自動測試、發布報告;而 Web 管理站點通過 Flex 和 JAVA 技術來實現,用戶可以按需在線配置某些模塊,并要求立即執行自動測試。
下面將詳細介紹每個模塊的具體工作內容。測試流程參見圖 1。
圖 1. 測試系統概述
源代碼和安裝包的按需下載
在
軟件開發過程中,每天都會因新的功能而更改源代碼。此外,很多項目需要國際團隊合作,這些情況下代碼的更新頻率更加高。本土和國外團隊經常需要共享源代碼,而源代碼可能被存放在固定的站點上面。當源代碼文件量大而站點距離遙遠的時候,下載代碼的任務就比較耗時。為了節省這方面的時間,提高團隊整體的工作效率,有必要讓這部分工作自動化起來。所以,系統首先實現了一個結合 Python 和 XML 的下載控制模塊。它的邏輯比較簡單(參見圖 2)。Python 程序定時讀取配置文件,判斷該任務當前是否可以運行。如果此刻時間和配置的時間一致,就訪問站點,下載代碼包。否則,放入等待隊列,獲取下一個任務。在等待隊列里面的任務會在一定時間后重新啟動。

圖 2. 下載流程
下載配置文件的內容參見以下代碼:
清單 1.下載配置文件的代碼
讀取下載配置文件的代碼如下:
清單 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') // 定義一個下載任務 task = MyDownloadTask() task.create(name, weekday, time, source, target, type) // 加入下載任務列表 tasklist.append(task) return tasklist |
實現具體的下載邏輯如下:
清單 3.實現下載的代碼
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() // 使用用戶名和密碼通過防火墻 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) // 從站點下載文件 content = urllib.request.urlopen(self. source).read() f=open(self.target + self.buildno,"wb") f.write(content) f.close() |
此例指出目前有一項下載任務,下載類型是源代碼,鏈接為 https://sample.sourcecode.com, 將其保持到 C 盤 sourcetar 文件夾下,時間為每天早上 7 點鐘。(-1 代表任意時間)。項目組可以根據需要增加下載項。比如,我們項目組由于資源文件經常要修改,所以需要每天上午和下午都要檢測是否有新的代碼包,所以配置了兩個下載任務。上午的時間一般都在 7 點,這樣可以在每位同事上班打開電腦的那個時刻就獲得大洋彼岸美國項目組下班時候的最新進展。
正如前文所述,該測試系統中我們提供一個 Web 管理站點,用戶可以根據項目的需要配置下載任務,不必麻煩系統管理員來修改下載配置文件。該模塊使用 Flex 和 Java 技術實現(參見圖 3)。用戶可以通過它了解當前系統已有的下載任務。此外,用戶也可以通過管理站點創建,修改和刪除下載任務。這些更改最終都會被保存到 XML 配置文件中。

圖 3. 下載管理界面
應用程序的部署
對 Web 應用程序而言,測試的第一步是部署。有了源代碼后,測試系統使用 Ant 編寫的腳本編譯源代碼,停止當前已有的 Web 服務器,部署產品代碼,然后重新啟動 Web 服務器。在這段時間中,產品的測試環境可能暫時無法訪問(參見以下代碼)。
清單 4.代碼部署
def deploybuild(self): … // 清理文件夾,將源代碼解壓到 d 盤 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") // 關閉 web 服務 os.system("net stop ”servicename""); … // 部署系統 // 開啟 web 服務 os.system("net start "servicename"") |
運行自動測試腳本
當新版本的 Web 應用程序部署完后,測試系統就開始進入自動測試。本系統使用 SVN 對測試腳本進行版本控制。所以有必要在一開始通過 SVN 更新最近的測試腳本。這里使用 Ant 來調用 SVN 的命令行工具,參見下圖。
使用如下 Python 腳本調用相應的 Ant 任務:
清單 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") svn"/> |
事例中的任務 download-testcase 用來從站點 9.19.199.9 的 web/v100 目錄下載最新版本的測試腳本。start-selenium 任務將啟動 selenium 的 proxy server,然后按照 TestNG 配置的順序運行測試腳本。
測試系統的腳本應用 Selenium 和 TestNG 的測試工具,實現對各類型 Web 界面的測試需求。在第三節中將詳細介紹 Selenium 工具在本系統的應用,并在第四章中介紹 TestNG 工具在配置 Selenium 測試腳本中的作用。
為適應項目開發周期不同階段的測試需求,Web 管理站點將列出當前所以測試案例。用戶可以自由地挑選下次測試需要的用例。當用戶選擇保存后,這些測試腳本就會在下次系統自動部署時候被運行。如果用戶選擇運行,那么系統可以馬上在當前已部署的產品環境上運行測試腳本。
發布自動測試報告
運行完自動測試用例后,測試結果自動生成于測試工具目錄下面。這樣會覆蓋原先的文件,不利于項目的跟蹤和信息的交流。所以,我們的測試系統會將測試報告發布到 Web 管理站點。用戶只需按照上面的時間點擊鏈接,就可以看到每次測試的運行結果(參見圖 4)。
圖 4. 測試報告界面