周輝 錢巨
摘要:Web應用在各個領(lǐng)域得到廣泛應用,為保證Web應用程序質(zhì)量,需要對它進行詳盡的測試?;谀_本的自動化測試越來越流行,逐漸的被應用在了Web應用程序測試中。功能測試腳本一般用于Web應用的功能和接口測試,很難發(fā)現(xiàn)Web應用中可能存在的缺陷或者性能瓶頸。很多研究人員通過擴展功能測試腳本或者重新編寫性能測試腳本來測試Web應用程序的缺陷問題。這種方式效率低下,資源開銷大。為此,我們提出了一種基于ANTLR開源庫的測試腳本自動重構(gòu)方法,首先對測試腳本進行優(yōu)化,加速測試腳本執(zhí)行速度,然后對測試腳本進行增強,從而構(gòu)造出一個快速暴露Web應用程序缺陷的性能測試腳本。
關(guān)鍵詞:Web應用;軟件測試;ANTLR;腳本重構(gòu)
中圖分類號:TP311文獻標識碼:A
Abstract:
Web applications have been widely used in various fields,in order to guarantee the quality of Web applications,it is necessary to test Web applications in detailScriptbased automated testing is becoming more and more popular,and it has gradually been applied in Web applications testFunctional test scripts usually used to test the functionality and interfaces of Web applicationsIt is difficult to find the memory defects or performance defects that may exist in the Web applicationsSo many researchers test the defect of the Web applications by extending the functional test script or rewriting the performance test script,however it is inefficientIn order to solve this problem,we propose an automatically refactoring approach of test scripts based on ANTLRThe approach was used to optimize the test script and accelerate test script execution speedIt can expose defects of Web applications by executing enhanced the test script.
Key words:web application;software test;ANTLR;script refactoring
1引言
近年來,隨著信息技術(shù)的飛速發(fā)展,基于網(wǎng)絡(luò)的Web應用軟件以及云應用風靡全球,并被廣泛的應用到社會的各個領(lǐng)域,成為當前和未來的軟件系統(tǒng)開發(fā)的主流。Web應用軟件具有的異構(gòu)、分布、并發(fā)和平臺無關(guān)的特性要求測試人員需要對其進行更加詳盡和審慎的測試[1]。研究人員從多個角度對Web應用測試進行研究主要包括用例生成[7][8]、結(jié)果分析[9]、故障注入[7]等。Lei Xu等[4]提出了一個Web應用測試框架,描述了Web應用測試流程。然而,隨著Web應用軟件變得越來越復雜,傳統(tǒng)的人工測試方法不僅耗時耗力而且效率低下,因此自動化測試方法被越來越多的應用于Web應用程序的測試。Nadia Alshahwan等[5]使用SBST方法對Web應用進行自動化測試和回歸測試?;谀_本驅(qū)動的自動化測試方法是比較主流的自動化測試方式。通過測試工具錄制自動化執(zhí)行腳本或者測試人員編寫測試腳本,并驅(qū)動測試腳本運行Web應用。基于腳本的自動化測試方法不僅節(jié)約時間,而且可以將測試人員從繁雜的手工測試中解放出來,大大提高Web應用程序的測試效率。但是測試工具錄制的測試腳本一般都是功能測試腳本,主要用來測試Web應用程序的功能和接口。因此普通的功能測試腳本很難發(fā)現(xiàn)Web應用程序中內(nèi)存缺陷問題或者性能瓶頸?,F(xiàn)階段,驅(qū)動測試腳本來發(fā)現(xiàn)和檢測Web應用中的缺陷,大部分是通過測試人員的手動循環(huán)執(zhí)行功能測試腳本,或者在測試腳本中添加一些與性能測試相關(guān)的腳本語句。手動的循環(huán)執(zhí)行測試腳本需要過多的人工干預,可能會由于人為因素導致測試結(jié)果的不穩(wěn)定。而在測試腳本中手動的添加代碼,對于海量測試腳本來說,工作量是巨大的。
本文提出了一種基于ANTLR[3]開源庫的Web應用程序測試腳本自動重構(gòu)方法,對功能測試腳本進行自動重構(gòu),通過刪除Web應用測試不相關(guān)的語句對測試腳本進行優(yōu)化,加速測試腳本的執(zhí)行,減少測試時間。可以為功能測試腳本自動添加循環(huán)操作、并發(fā)操作代碼實現(xiàn)對測試腳本的增強。從而將普通的功能測試腳本重構(gòu)為Web應用性能測試腳本。通過執(zhí)行重構(gòu)后的性能測試腳本,可以更快的發(fā)現(xiàn)Web應用中可能存在的缺陷和性能瓶頸,并提高測試效率,節(jié)約測試資源。
2Web應用測試腳本自動優(yōu)化方法
測試腳本自動優(yōu)化是通過將Web應用測試腳本中與Web事件不相關(guān)的測試語句移除。主要包括兩個步驟:腳本代碼狀態(tài)收集和測試腳本優(yōu)化處理。我們是通過將測試腳本中的語句劃分為Web事件語句和非Web事件語句,所謂Web事件就是真正和Web應用程序執(zhí)行相關(guān)的腳本部分。而非Web事件是那些不用于測試執(zhí)行的代碼例如對測試執(zhí)行結(jié)果進行驗證或者將測試執(zhí)行日志保存等。endprint
21運行時聯(lián)網(wǎng)狀態(tài)收集
在測試腳本發(fā)起自動化測試執(zhí)行之前,利用ANTLR工具對測試腳本進行插樁處理。然后再執(zhí)行插樁后的測試腳本來收集測試腳本中語句聯(lián)網(wǎng)信息。 首先,我們需要構(gòu)建一個測試腳本運行時聯(lián)網(wǎng)狀態(tài)收集模型,如圖1所示。
下面對運行時聯(lián)網(wǎng)狀態(tài)信息收集模型的構(gòu)建步驟進行詳細的說明。
1)測試腳本運行時插樁。
輸入數(shù)據(jù)是一個原始的正常Web應用自動化測試腳本。輸出數(shù)據(jù)是插入聯(lián)網(wǎng)信息跟蹤監(jiān)控語句的測試腳本。具體流程如圖2所示。
2)測試腳本跟蹤執(zhí)行
使用Selenium[6]自動化執(zhí)行引擎執(zhí)行測試腳本,在第一步測試腳本插樁中,我們在測試腳本中插入了啟用全局代理語句。因此測試方法執(zhí)行時并不直接將執(zhí)行請求發(fā)送給Web服務器,而是先將請求發(fā)送給代理服務器,通過代理服務器攔截執(zhí)行請求,并進行聯(lián)網(wǎng)狀態(tài)判斷,執(zhí)行測試腳本中的某條語句時,如果代理服務器有流量經(jīng)過說明該執(zhí)行語句對應的腳本語句是一個聯(lián)網(wǎng)腳本即該事件是一個Web事件。由于代理服務器不僅要接收測試腳本執(zhí)行請求,同時還要與測試腳本中插入的腳本行號信息進行通信,因為當我們知道某條語句是Web事件時,如果此時我們不清楚該條語句的行號,那么就無法將聯(lián)網(wǎng)信息與執(zhí)行語句對應起來,為此,我們將代理服務器的Web事件消息轉(zhuǎn)發(fā)和普通的消息通信隔離,我們重新啟用一個端口。并使用線程隔離的方式來共享測試腳本聯(lián)網(wǎng)狀態(tài)。上文介紹,在每一條執(zhí)行語句后面都插入了一個語句行號, 因此在每條測試腳本執(zhí)行之后都會將該語句的行號發(fā)送給代理服務,向代理服務器詢問剛剛執(zhí)行的語句是否聯(lián)網(wǎng),代理服務器會根據(jù)腳本信息是否聯(lián)網(wǎng)發(fā)送給執(zhí)行前端。我們定義了一個數(shù)據(jù)結(jié)構(gòu)來保存每行腳本聯(lián)網(wǎng)信息。
T = {[Line,F(xiàn)lag],...,[Line,F(xiàn)lag]}
Line表示正在執(zhí)行的語句行號,F(xiàn)lag表示正在執(zhí)行的語句是否是Web事件,例如行號為20的測試語句被判定是一個Web事件那么就被以[20,true]的格式被保存起來,所有的語句的聯(lián)網(wǎng)狀態(tài)會都會持久化作為測試腳本自動優(yōu)化重構(gòu)的輸入數(shù)據(jù)。
22測試腳本自動優(yōu)化
運行時聯(lián)網(wǎng)狀態(tài)收集模型用來收集腳本聯(lián)網(wǎng)狀態(tài)數(shù)據(jù),而測試腳本優(yōu)化主要是去除那些與Web應用程序測試執(zhí)行不相關(guān)的語句,也就是非Web事件語句,通過收集每行語句的聯(lián)網(wǎng)信息作為測試腳本語句去除的標準,語句去除原則就是去除最后一條Web事件之后的所有語句。因為在真正與Web應用程序相關(guān)的語句已經(jīng)執(zhí)行完畢,后續(xù)的執(zhí)行語句將不會對Web應用產(chǎn)生任何作用,只是用來記錄腳本執(zhí)行的附加信息或者對測試執(zhí)行結(jié)果進行驗證。
測試腳本優(yōu)化的輸入數(shù)據(jù)是原始腳本和腳本語句聯(lián)網(wǎng)狀態(tài)信息,輸出數(shù)據(jù)是優(yōu)化后的測試腳本。主要流程如圖3所示。我們利用ANTLR工具,在Python的文法下,構(gòu)建Python測試腳本的抽象語法樹。同時對聯(lián)網(wǎng)數(shù)據(jù)進行判斷,找到最后一個Web事件對應的語句行號。然后將行號與抽象語法樹進行匹配,找到最后一個Web事件對應的節(jié)點,在測試方法的語句范圍內(nèi),刪除該節(jié)點之后的所有節(jié)點。最后將抽象語法樹還原成測試腳本。
3Web應用測試腳本自動增強
內(nèi)存膨脹測試腳本增強是指通過對測試腳本進行自動化重構(gòu),將普通功能測試腳本轉(zhuǎn)換成為性能測試腳本。典型的方式是通過為測試腳本填添加循環(huán)操作和并發(fā)操作。
31腳本循環(huán)引入策略
測試腳本循環(huán)是指通過為測試腳本中的測試方法添加循環(huán)語句實現(xiàn)對測試方法的循環(huán)執(zhí)行,從而達到Web應用程序長時間大劑量運行效果,更快的發(fā)現(xiàn)Web應用中可能存在的內(nèi)存膨脹問題。傳統(tǒng)的方法是測試人員手動不斷重復的循環(huán)執(zhí)行測試腳本,而人工循環(huán)操作測試腳本不僅耗時耗力,而且可能導致測試結(jié)果的不穩(wěn)定。另外,手動的在測試腳本中添加循環(huán)操作也會導致人工的過度干預,并且對每個測試腳本都添加循環(huán)操作會產(chǎn)生巨大的工作量,大大降低測試效率。我們提出了一個測試腳本自動添加循環(huán)的方法,通過為測試方法設(shè)置循環(huán)次數(shù),自動的在測試方法中的預定位置插入循環(huán)語句實現(xiàn)腳本循環(huán)執(zhí)行。
Web應用程序試腳本循環(huán)的輸入是一個原始測試腳本和預定循環(huán)次數(shù),輸出是一個增加循環(huán)后的測試腳本。算法偽代碼如算法1所示。
首先給定一個原始測試腳本,利用ANTLR構(gòu)造測試腳本抽象語法樹AST,然后定位循環(huán)語句的插樁位置,由于循環(huán)是作用于整個測試方法,所以需要循環(huán)語句添加到整個方法體的外層。循環(huán)語句的插樁位置測試方法第一個直接子節(jié)點之前。插入循環(huán)語句節(jié)點之后,將抽象語法樹還原成測試腳本。完成循環(huán)語句自動插入。
32腳本并發(fā)引入策略
為了模擬多用戶并發(fā)場景,增加Web應用內(nèi)存膨脹問題暴露的可能性,我們?yōu)闇y試腳本引入了并發(fā)執(zhí)行語句。手動測試腳本并發(fā)執(zhí)行需要測試人員同時運行多個測試腳本,操作復雜,效率低下。我們提出了一種測試腳本自動重構(gòu)策略來為測試腳本添加并發(fā)執(zhí)行。為了避免同時運行多個腳本,我們將多個不同的測試腳本通過外部引入的方式加入到原始測試腳本中。這樣,只需要發(fā)起一個測試腳本的執(zhí)行,會自動執(zhí)行并發(fā)方法,并發(fā)執(zhí)行方法會再以并發(fā)的方式調(diào)用外部引用的測試腳本,從而實現(xiàn)多腳本并發(fā)執(zhí)行。
如圖4所示,腳本并發(fā)引入的輸入數(shù)據(jù)是原始測試腳本、并發(fā)線程數(shù)目以及待并發(fā)的測試腳本集合,輸出數(shù)據(jù)是自動重構(gòu)的并發(fā)測試腳本。首先利用ANTLR在原始腳本中確定并發(fā)測試方法的插入位置。并使用ANTLR構(gòu)造測試腳本抽象語法樹,然后將并發(fā)測試腳本通過外部引入的方式關(guān)聯(lián)到原始腳本上,將引入語句插入到抽象語法樹中。然后根據(jù)模板將并發(fā)線程數(shù)目以及運行庫runtime封裝成并發(fā)方法。最后將并發(fā)方法插入到抽象語法樹中的預定插樁位置。然后將抽象語法樹還原成測試腳本,完成對測試腳本的并發(fā)執(zhí)行引入。
4原型工具實現(xiàn)endprint
為檢驗本文方法的有效性,在Eclipse 平臺上實現(xiàn)了一個Web應用程序測試腳本自動重構(gòu)原型工具。 圖 5 給出了測試腳本自動優(yōu)化界面,從圖中可以看出通過測試腳本自動優(yōu)化后,原始測試方法中的print(“test acc log”)被去除,實現(xiàn)測試腳本優(yōu)化。
圖6給出了測試腳本自動增強界面。以自動為測試腳本添加循環(huán)為例,這里為測試腳本UpdateBook.py的test_update_book測試方法添加10輪循環(huán),自動重構(gòu)后的測試腳本如圖中右邊編輯框所示,測試方法被自動添加了循環(huán)語句,實現(xiàn)測試腳本增強。測試腳本并發(fā)過程同添加循環(huán)一樣。
5結(jié)論
本文提出了一種基于ANTLR的Web應用測試腳本自動重構(gòu)方法。通過構(gòu)建測試腳本運行時聯(lián)網(wǎng)狀態(tài)模型收集腳本聯(lián)網(wǎng)狀態(tài),再利用ANTLR自動去除測試腳本與Web事件不相關(guān)的語句實現(xiàn)腳本自動優(yōu)化。通過為測試腳本添加循環(huán)、并發(fā)語句來實現(xiàn)對測試腳本的增強。測試腳本的自動重構(gòu)不僅提高了測試效率,節(jié)約了測試資源,而且能夠更快的發(fā)現(xiàn)Web應用中存在的內(nèi)存缺陷和性能瓶頸。
參考文獻
[1]路曉麗Web應用軟件的測試技術(shù)研究[D]西安:西北大學,2006
[2]楊佩星面向能耗的測試用例生成技術(shù)研究[D],南京:南京航空航天大學,2016.
[3]ANTLR.http://www.antlr.org/
[4]XU L,XU BA Framework for Web Applications Testing[C]// International Conference on CyberworldsIEEE Computer Society,2004:300-305.
[5]ALSHAHWAN N,HARMAN MAutomated web application testing using search based software engineering[J]2011,43(30):3-12.
[6]Seleniumhttp://docs.seleniumhq.org.
[7]HANNA S,MUNRO M,F(xiàn)aultbased Web services testing,5th International Conference on Information Technology[C] //New Generations (ITNG)USA,2008,471-476.
[8]LI Z J,ZHU J,ZHANG L J,et alTowards a Practical and EffectiveApproach for Web Services Test Case Generation[J]Automation of Software Test,2009,106-114.
[9]ATKINSON C,BRENNER D,F(xiàn)ALCONE G,et alSpecifying highassurance services[J]Computer,2008,41,64-71.endprint