朱佳藝,劉從軍
(江蘇科技大學(xué) 計算機(jī)學(xué)院,江蘇 鎮(zhèn)江 212003)
隨著信息技術(shù)的發(fā)展,Web 應(yīng)用越來越流行,如今越來越多的軟件系統(tǒng)都是Web 應(yīng)用程序,基于Web 的應(yīng)用承載著越來越復(fù)雜的業(yè)務(wù)邏輯和越來越龐大的信息平臺結(jié)構(gòu),且發(fā)布周期短,更新迭代快[1],這就要求Web 應(yīng)用程序測試具有全面性、可擴(kuò)展性和高效性。承載Web 應(yīng)用的瀏覽器具有多樣化和多元化的特征,因而增加了Web 應(yīng)用測試的復(fù)雜性和工作量。因此,應(yīng)該更多地關(guān)注Web 應(yīng)用程序測試的效率、可重用性和全面性[2]。
軟件測試的目的是盡可能早地發(fā)現(xiàn)軟件中的缺陷。軟件測試的花費占整個軟件開發(fā)生命周期的30%~60%,具體取決于產(chǎn)品的關(guān)鍵性和復(fù)雜性。軟件測試是一個驗證軟件功能性和非功能性要求的過程,有助于基于軟件的功能性、可靠性、可用性、效率、可維護(hù)性和可移植性等屬性是否符合ISO-9126-1標(biāo)準(zhǔn)來控制產(chǎn)品質(zhì)量[3]。
測試人員對Web 應(yīng)用程序進(jìn)行驗收測試通常采用手動測試的方法,而手動測試是個耗時的過程,而且需要人為的干預(yù),容易出現(xiàn)人為錯誤,從而浪費時間。為解決這些問題,自動化測試應(yīng)運而生。自動化測試是一個自動測試的過程,包括設(shè)計、執(zhí)行測試腳本和使用高效的自動化工具。自動化測試可以提高軟件測試質(zhì)量,使人為干預(yù)在軟件測試中占比最小化[4]。
常見的Web 自動化測試工具如QTP、Win Runner Load Runner、Robot、SilkTest、Selenium 等在自動化測試中得到了廣泛應(yīng)用。Selenium 可以說是最全面、最流行的開源Web自動化測試工具[5],特別對使用了BackBase 框架的Web 應(yīng)用程序提供了良好支持 。
大型軟件開發(fā)公司有相對成熟的測試技術(shù),如Automated Testing Specialists Inc.提出數(shù)據(jù)驅(qū)動測試技術(shù)[6],Mercury Interactive Inc.推出關(guān)鍵字驅(qū)動測試技術(shù)[6]。文獻(xiàn)[7]采用Selenium 工具對某系統(tǒng)進(jìn)行了完整的自動化測試,但所進(jìn)行的研究只針對特定系統(tǒng),腳本無法復(fù)用在其他系統(tǒng)上;文獻(xiàn)[8]設(shè)計一個基于Selenium 的自動化測試框架,并結(jié)合Jenkins、Pytest 等工具,具有穩(wěn)定性、靈活性、可重用拓展、輕量級等特點,其采用數(shù)據(jù)驅(qū)動模式對難定位的元素進(jìn)行二次處理,對驗證碼進(jìn)行簡單識別;文獻(xiàn)[9]設(shè)計的基于Selenium 的自動化測試框架支持兼容性測試、日志記錄、頁面截圖、測試報告自動生成,但并沒有對驗證碼的識別進(jìn)行處理,也沒有自動構(gòu)建和部署測試的功能。
本文提出的基于Selenium 的自動化測試框架相比于文獻(xiàn)[7]-[9]的創(chuàng)新之處在于:框架可以復(fù)用,并不局限于某一系統(tǒng);能部署在多臺機(jī)器上同時進(jìn)行測試,既節(jié)省了時間,又測試了兼容性;對驗證碼的識別更簡單。實驗結(jié)果表明,該框架對于提升測試的可重用性、可擴(kuò)展性、全面性、準(zhǔn)確性具有較好效果。
測試人員首先分析軟件需求,根據(jù)需求設(shè)計測試用例。測試用例通過評審后,傳統(tǒng)會根據(jù)測試用例中描述的步驟流程對應(yīng)用進(jìn)行手工測試,然后將得到的真實結(jié)果與預(yù)期結(jié)果進(jìn)行對比。因此,為了節(jié)省人力、物力、時間、資源等成本,提高測試效率與準(zhǔn)確度,研究者提出了自動化測試的概念。自動化測試是指將人為手動執(zhí)行的測試行為轉(zhuǎn)化為機(jī)器自動執(zhí)行的過程[10]。
自動化測試有很多類型,比如功能的自動化測試、性能的自動化測試等。功能自動化測試是指借助自動化工具或框架來部署并執(zhí)行測試腳本,從而自動化測試并驗證軟件功能[11];性能自動化測試是指通過工具或框架模擬成千上萬的用戶向系統(tǒng)發(fā)出請求,從而測試系統(tǒng)的處理能力、負(fù)載能力、穩(wěn)定性與吞吐量等[12]。
自動化測試的項目大多滿足以下3 個條件:①軟件需求穩(wěn)定。如果軟件需求經(jīng)常修改,或者變動跨度較大,則需要修改測試用例,并修改測試腳本,導(dǎo)致維護(hù)、測試腳本的成本可能高于節(jié)省的測試成本,與當(dāng)初的目的背道而馳。所以對于變動較大部分可進(jìn)行手工測試,等到趨于穩(wěn)定之后再轉(zhuǎn)化成自動化測試;②項目周期長。項目本身就需要大量時間完成,或者是一個長期迭代的項目,因此有充足的時間來完善自動化測試框架;③自動化測試腳本可重用。即開發(fā)出來的自動化測試腳本可在本項目中重用,或者在其他項目中使用,從而提高自動化測試腳本的利用率,達(dá)到一舉多得的效果[13]。
自動化工具是為了支持各種測試活動而開發(fā)的軟件,也稱為測試管理工具。針對不同的測試需求,如功能測試、性能測試、安全測試、Web 服務(wù)測試、數(shù)據(jù)庫測試、可用性測試等有不同的工具。市面上可用的自動化工具可分為開源工具和付費工具。一旦手動測試用例被自動化,即可通過使用自動化工具執(zhí)行腳本節(jié)省手動執(zhí)行測試用例所花費的精力[14]。表1 是一些幫助測試腳本設(shè)計和執(zhí)行的自動化工具。
Table 1 Comparison of automated test tools表1 自動化測試工具比較
根據(jù)目前市場上每個項目預(yù)算分配的現(xiàn)狀和趨勢,購買或更新許可工具的成本非常高,可能超過分配的預(yù)算。因此,使用商業(yè)自動化工具的另一種解決方案是從商業(yè)工具改編或遷移到開源工具。在上面提到的自動化工具中,像Selenium 這樣的開源工具是非常有效的,與獲得許可的自動化工具相比,其具有許多優(yōu)勢并支持多種功能。
目前,Web 自動化測試工具種類繁多、五花八門。因此,選擇標(biāo)準(zhǔn)應(yīng)該從以下幾方面來考慮:①發(fā)展趨勢要穩(wěn)定上升;②需要有一個活躍的社區(qū)能夠進(jìn)行討論;③需要是開源軟件;④支持主流的編程語言(Java、Python);⑤能支持主流瀏覽器(谷歌、IE、火狐等)。
綜合以上幾方面考慮,本文采用的技術(shù)架構(gòu)為Python+Selenium。
Selenium 里包含許多工具,有Selenium IDE、Selenium Grid、Selenium RC(Selenium 1.0)和Selenium webdriver(Selenium 2.0)[15]。Selenium 能模擬用戶操作直接在瀏覽器上運行,主要功能包括:①可在不同瀏覽器上測試與瀏覽器的兼容性;②測試系統(tǒng)功能[16]。
Selenium IDE 是一個瀏覽器插件,用于構(gòu)建測試腳本,支持Chrome 和Firefox 瀏覽器。其還可用于記錄、編輯和調(diào)試Selenium 測試用例,記錄所有由最終用戶執(zhí)行的操作,并生成測試腳本,同時實現(xiàn)回放。
Selenium Grid 是一種測試輔助工具,可以通過在多臺計算機(jī)上進(jìn)行分布式擴(kuò)容,并通過一個中心點管理多個環(huán)境,從而輕松地組合多種瀏覽器與多種OS運行測試。
在很長一段時間內(nèi),Selenium remote control(RC)是Selenium 的核心部分,由于其使用了Selenium core,也即Java script 函數(shù),運行起來比Selenium webdriver 慢很多。在執(zhí)行測試腳本前,驅(qū)動與server 通信,將命令傳遞給server,并且其不支持Ajax 程序。為避免Selenium RC 的限制,人們?nèi)诤蟂elenium 和webdriver,并提出Selenium webdriver[17]。
Selenium webdriver也被稱為Selenium2.0,Selenium webdriver 是直接驅(qū)動瀏覽器的,因此運行起來比Selenium RC 快很多。Selenium webdriver 具有以下優(yōu)點:①改善了當(dāng)前Web 應(yīng)用程序的測試問題,支持多種瀏覽器;②支持Ajax 應(yīng)用;③支持多種語言編寫測試腳本,如Java、C#、Ruby、Perl、Python 等[18];④支持在多平臺上運行,如Windows、Linux 和Mac 等,便于測試人員進(jìn)行Web 應(yīng)用程序跨平臺、跨瀏覽器的兼容性測試;⑤可使用Selenium Grid 進(jìn)行分布式測試;⑥使用Selenium IDE 可進(jìn)行錄制、回放和腳本生成。
Selenium WebDriver 與瀏覽器的通信流程如下:①對于每一條Selenium 腳本,創(chuàng)建一個http 請求,并發(fā)送給瀏覽器的驅(qū)動;②瀏覽器驅(qū)動中包含一個HTTP Server 用來接收這些http 請求;③HTTP Server 接收到請求后,根據(jù)請求具體操控對應(yīng)的瀏覽器;④瀏覽器執(zhí)行具體的測試步驟;⑤瀏覽器將步驟執(zhí)行結(jié)果返回給HTTP Server;⑥HTTP Server 又將結(jié)果返回給Selenium 的腳本,如果是錯誤的http代碼,則會在控制臺看到對應(yīng)的報錯信息[19]。具體通信流程如圖1所示。
Fig.1 Communication flow圖1 通信流程
基于對Web 項目實際需求功能的分析,對本文提出框架所支持的測試類型進(jìn)行分析,如圖2所示。
Fig.2 Test types圖2 測試類型
(1)功能自動化測試。Web 的功能測試屬于黑盒測試,不關(guān)注內(nèi)部具體實現(xiàn)邏輯,模擬手動操作對相關(guān)功能進(jìn)行測試。主要關(guān)注是否能打開網(wǎng)頁鏈接,網(wǎng)頁顯示內(nèi)容是否正確,元素的定位、識別、點擊、滑動、輸入文本等功能是否能實現(xiàn),驗證碼是否識別正確,頁面上自動彈出的提示框是否正確處理[20]。
(2)兼容性測試。Web 項目要想被廣泛應(yīng)用,兼容性至關(guān)重要。需要在不同的瀏覽器、操作系統(tǒng)上能夠被正常使用,因此要在一些主流的操作系統(tǒng)如Windows、MacOS、Linux 以及主流的瀏覽器如Chrome、IE、Firefox 上進(jìn)行兼容性測試。
(3)性能測試。系統(tǒng)響應(yīng)時間、并發(fā)用戶數(shù)、資源利用率等是測試的關(guān)鍵,該框架將從這幾個方面對Web 應(yīng)用進(jìn)行測試。
(4)分布式測試。分布式測試是指在版本迭代的回歸測試和兼容性測試時,在多臺機(jī)器、多個版本的操作系統(tǒng)和瀏覽器上并行執(zhí)行測試,從而縮短測試時間、提高測試效率。
本文所設(shè)計的框架主要包含以下幾個功能:編寫測試腳本、執(zhí)行測試腳本、生成測試報告、定位分析測試結(jié)果。
(1)編寫測試腳本。測試腳本是測試框架中最重要的部分,因為產(chǎn)品在不停迭代,測試用例也會不停地修改,所以腳本編寫要考慮到后期維護(hù)成本??紤]到這點,編寫測試腳本功能將分為4層,如圖3所示。
配置層用來存放config 配置文件和數(shù)據(jù)文件;數(shù)據(jù)庫層對系統(tǒng)數(shù)據(jù)庫進(jìn)行管理;API 層采用PageObject 設(shè)計模式,將頁面元素定位方式、操作方法與測試腳本分離;測試用例層通過調(diào)用配置層和API 層封裝的方法完成測試用例的編寫。
(2)執(zhí)行測試腳本。主要分為并發(fā)執(zhí)行與集成自動化測試兩部分,如圖4所示。
Fig.3 Writing test script圖3 編寫測試腳本
Fig.4 Executing the test script圖4 執(zhí)行測試腳本
測試用例多線程的并發(fā)執(zhí)行能夠提高自動化測試框架的執(zhí)行效率。采用Jenkins 持續(xù)集成工具,通過自動化部署可以完成持續(xù)集成[21]、自動構(gòu)建并執(zhí)行測試腳本等諸多重復(fù)工作,從而減少資源的消耗。
(3)生成測試報告。測試執(zhí)行完畢之后將自動生成測試報告,并將測試報告以郵件形式自動發(fā)送給相關(guān)人員,可以是測試人員也可以是與項目相關(guān)的其他人員。
(4)定位與分析測試結(jié)果。主要通過log 和失敗的截圖進(jìn)行定位與分析,log 中記錄自動化測試用例的名稱、操作步驟與執(zhí)行失敗的原因。當(dāng)發(fā)現(xiàn)自動化測試用例執(zhí)行失敗時能自動進(jìn)行截圖,并將截圖保存在指定位置。
(1)性能需求分析。利用Selenium Grid 測試輔助工具在多臺計算機(jī)上進(jìn)行分布式測試,并通過一個中心點管理多個環(huán)境,從而對多種瀏覽器與多種OS 組合進(jìn)行并行運行測試。用多線程或多進(jìn)程降低自動化測試的總耗時,但容易造成內(nèi)存溢出,所以執(zhí)行完一個.py 文件,必須執(zhí)行driver.close(),關(guān)閉瀏覽器后可釋放內(nèi)存。執(zhí)行測試用例時間不能太長,否則就失去了自動化的意義,一般來說100條測試用例的運行時間需要控制在2h以內(nèi)。
(2)易用性需求分析。測試人員不需要對編程語言非常熟練或?qū)y試框架的內(nèi)部邏輯非常熟悉,只需搭建簡單的測試環(huán)境,輸入簡單的命令,即能進(jìn)行自動化測試,生成測試報告,并將報告以郵件形式自動發(fā)送給相關(guān)人員。
(3)可維護(hù)性需求分析。軟件開發(fā)是一個迭代的過程,功能會不斷的增加和完善,所以測試用例會不斷增加,測試腳本也會隨之不斷修改和完善。因此,要求腳本能不斷作出調(diào)整,以便框架能長期使用。
(4)穩(wěn)定性需求分析。框架不是只執(zhí)行一次,可能每天都要執(zhí)行,也可能每隔一段時間就要執(zhí)行。為了保證框架的長期使用,框架要有較強(qiáng)的健壯性和穩(wěn)定性。當(dāng)輸入測試數(shù)據(jù)時會改變測試環(huán)境,而這種改變可能會影響后續(xù)測試用例的執(zhí)行,所以為了保證后續(xù)測試順利執(zhí)行,框架還要支持測試場景的恢復(fù)。
(5)可靠性需求分析。最基本的要求是要保證測試結(jié)果真實、可靠。測試數(shù)據(jù)也從一定程度上保證了測試的質(zhì)量和完善性,所以測試數(shù)據(jù)不要隨意更改,如要進(jìn)行增刪改操作,需要記錄在操作日志中。
本文基于Selenium、Jenkins、Pytest 設(shè)計的自動化測試框架總體結(jié)構(gòu)如圖5 所示。將編寫、維護(hù)好的工程代碼提交到Jenkins 平臺集成,也可以從Jenkins 獲取工程代碼,或者部署到各個機(jī)器上并行執(zhí)行自動化測試。執(zhí)行完畢后將自動生成測試報告,并用郵件發(fā)送給相關(guān)人員。
Fig.5 Overall structure of automation test framework圖5 自動化測試框架總體結(jié)構(gòu)
自動化測試框架詳細(xì)結(jié)構(gòu)如圖6所示。
(1)Testcases 包用來存儲各個模塊的測試用例腳本,其包含Web 應(yīng)用程序的常見功能,如登錄、注冊、關(guān)鍵詞輸入、按鈕點擊、復(fù)選框選擇等。定位頁面元素一般通過其id、xpath、link text 或css locators 來定位,即使元素名稱改變也不需要修改測試腳本,從而簡化了維護(hù)和修改測試用例的工作。每個.py 文件的命名方式都是有意義的命名,如登錄模塊是login.py,使測試人員在維護(hù)或搭建環(huán)境時,能快速定位到自己所需的腳本。
Fig.6 Detailed structure of automation test framework圖6 自動化測試框架詳細(xì)結(jié)構(gòu)
(2)Lib 包中存放一些需要用到的第三方庫,如識別驗證碼的第三方庫ShowapiRequest。
(3)Screenshots 目錄用來存儲測試過程中的所有截圖,主要是失敗用例截圖和需要識別的截圖。通過失敗用例截圖,測試人員可非常容易地抓取到錯誤發(fā)生時的程序狀態(tài),有助于開發(fā)人員分析issue。將日期和時間設(shè)為截圖的名字,并將圖片文件存儲在指定目錄下。
(4)Util 包用來實現(xiàn)工具類,比如獲取圖片驗證碼和生成隨機(jī)字符串。獲取圖片驗證碼的思路是先用截屏的方法browser.save_screenshot 截下整張圖并保存到screenshots目錄下,再用摳圖的方法im.crop 摳下驗證碼并保存。用第三方庫ShowapiRequest 識別保存下來的驗證碼,最后返回一個識別后的驗證碼。輸入用戶名時即可用隨機(jī)字符串類隨機(jī)生成,否則可能會與后臺數(shù)據(jù)庫的用戶名重復(fù)。
(5)Data 目錄存儲測試數(shù)據(jù)。在Web 應(yīng)用程序中,終端用戶通常需要輸入一些信息,比如登錄系統(tǒng)通常需要輸入用戶名和密碼來登錄,像此類輸入會存儲在data 中。測試人員可以從data 中獲取輸入內(nèi)容,而不需要在應(yīng)用程序中輸入相同信息。測試人員可以在該目錄下存儲Web 應(yīng)用程序所需的輸入值。
(6)Log 目錄存儲Log 日志,特別是失敗用例的Log 至關(guān)重要,里面會記錄issue 的關(guān)鍵時間點和信息,便于開發(fā)人員進(jìn)行分析。
(7)Reports 目錄存儲測試報告,測試完畢后自動生成測試報告。Selenium 沒有生成報告的內(nèi)置功能[22],所以本文設(shè)計的框架采用allure 插件生成測試報告,最后將報告用郵件發(fā)送給相關(guān)人員。
(8)Config 目錄存儲配置文件,主要是一些環(huán)境的配置,如測試機(jī)器IP 地址、操作系統(tǒng)與瀏覽器相關(guān)信息、測試次數(shù)等。
使用了該自動化測試框架之后,測試效率有了很大改善,測試人員可完成比傳統(tǒng)方法多兩倍的工作量,從而減少了測試的人力資源。有時測試用例失敗是由于Selenium webdriver 同步性的問題,而不是由于應(yīng)用程序本身的缺陷。該框架減少了因同步性問題導(dǎo)致失敗的概率,增加了通過的概率。綜上所述,所提出的框架比改進(jìn)前的自動化測試框架準(zhǔn)確性更高。
執(zhí)行5 次具有250 條測試用例的測試集,得到了如表2所示的結(jié)果。穩(wěn)定執(zhí)行率是指通過的用例數(shù)和產(chǎn)品功能導(dǎo)致失敗的用例數(shù)總和與總執(zhí)行用例數(shù)的比值。因為產(chǎn)品功能導(dǎo)致失敗的用例,失敗原因并非框架本身的因素,所以將產(chǎn)品功能導(dǎo)致失敗的用例作為穩(wěn)定的用例計算。
Table 2 Situation of test cases execution表2 測試用例執(zhí)行情況
將5 次結(jié)果進(jìn)行匯總得到表3。穩(wěn)定執(zhí)行率表明框架穩(wěn)定執(zhí)行的測試用例比例,并且給出的結(jié)果與手動測試用例給出的結(jié)果一樣準(zhǔn)確。有時應(yīng)用程序工作正常,但是測試用例失敗是因為同步性的問題。新提出的框架使測試用例同步正確,所以失敗率比改進(jìn)前的自動化測試框架有所降低。改進(jìn)前的框架是指腳本無法復(fù)用的、無法部署多臺機(jī)器進(jìn)行并行測試的、沒有驗證碼識別等特殊處理的框架,所以導(dǎo)致維護(hù)費用高、執(zhí)行時間過長、失敗率高。
Table 3 Comparative results of the proposed framework and old framework表3 新提出框架與改進(jìn)前框架的對比結(jié)果
下面對本文所提出的自動化測試框架進(jìn)行評估。作為一個新的自動化測試框架,需要多種類型、多方面的評估,特別是可重用性、可擴(kuò)展性、兼容性和全面性等方面的性能。評估得到的實驗對比結(jié)果如表4所示。
Table 4 Experimental comparison results表4 實驗對比結(jié)果
本文提出基于Selenium 的新的自動化測試框架來測試Web 應(yīng)用程序,該框架可減少編寫測試用例所需時間,并提高測試用例通過率,為測試人員提供了一個方便配置不同瀏覽器進(jìn)行Web 應(yīng)用測試的工具,減少了測試人員工作量。通過使用該框架,可生成定制化的測試報告,也可利用失敗測試用例的截圖分析失敗原因,測試人員可在data 目錄中維護(hù)所有數(shù)據(jù)。該框架能很好地適用于動態(tài)變化的應(yīng)用程序,自動化測試的腳本也易于理解,因此使用該自動化框架可幫助團(tuán)隊更高效地測試Web 程序。但由于時間限制,本框架關(guān)于驗證碼的識別還不夠完善,對于簡單的驗證碼可以使用pytest中的pytesseract 模塊和PIL模塊進(jìn)行識別,而對于復(fù)雜的驗證碼,則需要使用第三方的API。希望在后期的研究中,可實現(xiàn)不再依賴第三方庫也能識別復(fù)雜的驗證碼。