周輝 錢巨
摘要:Web應(yīng)用在各個(gè)領(lǐng)域得到廣泛應(yīng)用,為保證Web應(yīng)用程序質(zhì)量,需要對(duì)它進(jìn)行詳盡的測(cè)試?;谀_本的自動(dòng)化測(cè)試越來越流行,逐漸的被應(yīng)用在了Web應(yīng)用程序測(cè)試中。功能測(cè)試腳本一般用于Web應(yīng)用的功能和接口測(cè)試,很難發(fā)現(xiàn)Web應(yīng)用中可能存在的缺陷或者性能瓶頸。很多研究人員通過擴(kuò)展功能測(cè)試腳本或者重新編寫性能測(cè)試腳本來測(cè)試Web應(yīng)用程序的缺陷問題。這種方式效率低下,資源開銷大。為此,我們提出了一種基于ANTLR開源庫的測(cè)試腳本自動(dòng)重構(gòu)方法,首先對(duì)測(cè)試腳本進(jìn)行優(yōu)化,加速測(cè)試腳本執(zhí)行速度,然后對(duì)測(cè)試腳本進(jìn)行增強(qiáng),從而構(gòu)造出一個(gè)快速暴露Web應(yīng)用程序缺陷的性能測(cè)試腳本。
關(guān)鍵詞:Web應(yīng)用;軟件測(cè)試;ANTLR;腳本重構(gòu)
中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼: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應(yīng)用軟件以及云應(yīng)用風(fēng)靡全球,并被廣泛的應(yīng)用到社會(huì)的各個(gè)領(lǐng)域,成為當(dāng)前和未來的軟件系統(tǒng)開發(fā)的主流。Web應(yīng)用軟件具有的異構(gòu)、分布、并發(fā)和平臺(tái)無關(guān)的特性要求測(cè)試人員需要對(duì)其進(jìn)行更加詳盡和審慎的測(cè)試[1]。研究人員從多個(gè)角度對(duì)Web應(yīng)用測(cè)試進(jìn)行研究主要包括用例生成[7][8]、結(jié)果分析[9]、故障注入[7]等。Lei Xu等[4]提出了一個(gè)Web應(yīng)用測(cè)試框架,描述了Web應(yīng)用測(cè)試流程。然而,隨著Web應(yīng)用軟件變得越來越復(fù)雜,傳統(tǒng)的人工測(cè)試方法不僅耗時(shí)耗力而且效率低下,因此自動(dòng)化測(cè)試方法被越來越多的應(yīng)用于Web應(yīng)用程序的測(cè)試。Nadia Alshahwan等[5]使用SBST方法對(duì)Web應(yīng)用進(jìn)行自動(dòng)化測(cè)試和回歸測(cè)試?;谀_本驅(qū)動(dòng)的自動(dòng)化測(cè)試方法是比較主流的自動(dòng)化測(cè)試方式。通過測(cè)試工具錄制自動(dòng)化執(zhí)行腳本或者測(cè)試人員編寫測(cè)試腳本,并驅(qū)動(dòng)測(cè)試腳本運(yùn)行Web應(yīng)用。基于腳本的自動(dòng)化測(cè)試方法不僅節(jié)約時(shí)間,而且可以將測(cè)試人員從繁雜的手工測(cè)試中解放出來,大大提高Web應(yīng)用程序的測(cè)試效率。但是測(cè)試工具錄制的測(cè)試腳本一般都是功能測(cè)試腳本,主要用來測(cè)試Web應(yīng)用程序的功能和接口。因此普通的功能測(cè)試腳本很難發(fā)現(xiàn)Web應(yīng)用程序中內(nèi)存缺陷問題或者性能瓶頸?,F(xiàn)階段,驅(qū)動(dòng)測(cè)試腳本來發(fā)現(xiàn)和檢測(cè)Web應(yīng)用中的缺陷,大部分是通過測(cè)試人員的手動(dòng)循環(huán)執(zhí)行功能測(cè)試腳本,或者在測(cè)試腳本中添加一些與性能測(cè)試相關(guān)的腳本語句。手動(dòng)的循環(huán)執(zhí)行測(cè)試腳本需要過多的人工干預(yù),可能會(huì)由于人為因素導(dǎo)致測(cè)試結(jié)果的不穩(wěn)定。而在測(cè)試腳本中手動(dòng)的添加代碼,對(duì)于海量測(cè)試腳本來說,工作量是巨大的。
本文提出了一種基于ANTLR[3]開源庫的Web應(yīng)用程序測(cè)試腳本自動(dòng)重構(gòu)方法,對(duì)功能測(cè)試腳本進(jìn)行自動(dòng)重構(gòu),通過刪除Web應(yīng)用測(cè)試不相關(guān)的語句對(duì)測(cè)試腳本進(jìn)行優(yōu)化,加速測(cè)試腳本的執(zhí)行,減少測(cè)試時(shí)間??梢詾楣δ軠y(cè)試腳本自動(dòng)添加循環(huán)操作、并發(fā)操作代碼實(shí)現(xiàn)對(duì)測(cè)試腳本的增強(qiáng)。從而將普通的功能測(cè)試腳本重構(gòu)為Web應(yīng)用性能測(cè)試腳本。通過執(zhí)行重構(gòu)后的性能測(cè)試腳本,可以更快的發(fā)現(xiàn)Web應(yīng)用中可能存在的缺陷和性能瓶頸,并提高測(cè)試效率,節(jié)約測(cè)試資源。
2Web應(yīng)用測(cè)試腳本自動(dòng)優(yōu)化方法
測(cè)試腳本自動(dòng)優(yōu)化是通過將Web應(yīng)用測(cè)試腳本中與Web事件不相關(guān)的測(cè)試語句移除。主要包括兩個(gè)步驟:腳本代碼狀態(tài)收集和測(cè)試腳本優(yōu)化處理。我們是通過將測(cè)試腳本中的語句劃分為Web事件語句和非Web事件語句,所謂Web事件就是真正和Web應(yīng)用程序執(zhí)行相關(guān)的腳本部分。而非Web事件是那些不用于測(cè)試執(zhí)行的代碼例如對(duì)測(cè)試執(zhí)行結(jié)果進(jìn)行驗(yàn)證或者將測(cè)試執(zhí)行日志保存等。endprint
21運(yùn)行時(shí)聯(lián)網(wǎng)狀態(tài)收集
在測(cè)試腳本發(fā)起自動(dòng)化測(cè)試執(zhí)行之前,利用ANTLR工具對(duì)測(cè)試腳本進(jìn)行插樁處理。然后再執(zhí)行插樁后的測(cè)試腳本來收集測(cè)試腳本中語句聯(lián)網(wǎng)信息。 首先,我們需要構(gòu)建一個(gè)測(cè)試腳本運(yùn)行時(shí)聯(lián)網(wǎng)狀態(tài)收集模型,如圖1所示。
下面對(duì)運(yùn)行時(shí)聯(lián)網(wǎng)狀態(tài)信息收集模型的構(gòu)建步驟進(jìn)行詳細(xì)的說明。
1)測(cè)試腳本運(yùn)行時(shí)插樁。
輸入數(shù)據(jù)是一個(gè)原始的正常Web應(yīng)用自動(dòng)化測(cè)試腳本。輸出數(shù)據(jù)是插入聯(lián)網(wǎng)信息跟蹤監(jiān)控語句的測(cè)試腳本。具體流程如圖2所示。
2)測(cè)試腳本跟蹤執(zhí)行
使用Selenium[6]自動(dòng)化執(zhí)行引擎執(zhí)行測(cè)試腳本,在第一步測(cè)試腳本插樁中,我們?cè)跍y(cè)試腳本中插入了啟用全局代理語句。因此測(cè)試方法執(zhí)行時(shí)并不直接將執(zhí)行請(qǐng)求發(fā)送給Web服務(wù)器,而是先將請(qǐng)求發(fā)送給代理服務(wù)器,通過代理服務(wù)器攔截執(zhí)行請(qǐng)求,并進(jìn)行聯(lián)網(wǎng)狀態(tài)判斷,執(zhí)行測(cè)試腳本中的某條語句時(shí),如果代理服務(wù)器有流量經(jīng)過說明該執(zhí)行語句對(duì)應(yīng)的腳本語句是一個(gè)聯(lián)網(wǎng)腳本即該事件是一個(gè)Web事件。由于代理服務(wù)器不僅要接收測(cè)試腳本執(zhí)行請(qǐng)求,同時(shí)還要與測(cè)試腳本中插入的腳本行號(hào)信息進(jìn)行通信,因?yàn)楫?dāng)我們知道某條語句是Web事件時(shí),如果此時(shí)我們不清楚該條語句的行號(hào),那么就無法將聯(lián)網(wǎng)信息與執(zhí)行語句對(duì)應(yīng)起來,為此,我們將代理服務(wù)器的Web事件消息轉(zhuǎn)發(fā)和普通的消息通信隔離,我們重新啟用一個(gè)端口。并使用線程隔離的方式來共享測(cè)試腳本聯(lián)網(wǎng)狀態(tài)。上文介紹,在每一條執(zhí)行語句后面都插入了一個(gè)語句行號(hào), 因此在每條測(cè)試腳本執(zhí)行之后都會(huì)將該語句的行號(hào)發(fā)送給代理服務(wù),向代理服務(wù)器詢問剛剛執(zhí)行的語句是否聯(lián)網(wǎng),代理服務(wù)器會(huì)根據(jù)腳本信息是否聯(lián)網(wǎng)發(fā)送給執(zhí)行前端。我們定義了一個(gè)數(shù)據(jù)結(jié)構(gòu)來保存每行腳本聯(lián)網(wǎng)信息。
T = {[Line,F(xiàn)lag],...,[Line,F(xiàn)lag]}
Line表示正在執(zhí)行的語句行號(hào),F(xiàn)lag表示正在執(zhí)行的語句是否是Web事件,例如行號(hào)為20的測(cè)試語句被判定是一個(gè)Web事件那么就被以[20,true]的格式被保存起來,所有的語句的聯(lián)網(wǎng)狀態(tài)會(huì)都會(huì)持久化作為測(cè)試腳本自動(dòng)優(yōu)化重構(gòu)的輸入數(shù)據(jù)。
22測(cè)試腳本自動(dòng)優(yōu)化
運(yùn)行時(shí)聯(lián)網(wǎng)狀態(tài)收集模型用來收集腳本聯(lián)網(wǎng)狀態(tài)數(shù)據(jù),而測(cè)試腳本優(yōu)化主要是去除那些與Web應(yīng)用程序測(cè)試執(zhí)行不相關(guān)的語句,也就是非Web事件語句,通過收集每行語句的聯(lián)網(wǎng)信息作為測(cè)試腳本語句去除的標(biāo)準(zhǔn),語句去除原則就是去除最后一條Web事件之后的所有語句。因?yàn)樵谡嬲cWeb應(yīng)用程序相關(guān)的語句已經(jīng)執(zhí)行完畢,后續(xù)的執(zhí)行語句將不會(huì)對(duì)Web應(yīng)用產(chǎn)生任何作用,只是用來記錄腳本執(zhí)行的附加信息或者對(duì)測(cè)試執(zhí)行結(jié)果進(jìn)行驗(yàn)證。
測(cè)試腳本優(yōu)化的輸入數(shù)據(jù)是原始腳本和腳本語句聯(lián)網(wǎng)狀態(tài)信息,輸出數(shù)據(jù)是優(yōu)化后的測(cè)試腳本。主要流程如圖3所示。我們利用ANTLR工具,在Python的文法下,構(gòu)建Python測(cè)試腳本的抽象語法樹。同時(shí)對(duì)聯(lián)網(wǎng)數(shù)據(jù)進(jìn)行判斷,找到最后一個(gè)Web事件對(duì)應(yīng)的語句行號(hào)。然后將行號(hào)與抽象語法樹進(jìn)行匹配,找到最后一個(gè)Web事件對(duì)應(yīng)的節(jié)點(diǎn),在測(cè)試方法的語句范圍內(nèi),刪除該節(jié)點(diǎn)之后的所有節(jié)點(diǎn)。最后將抽象語法樹還原成測(cè)試腳本。
3Web應(yīng)用測(cè)試腳本自動(dòng)增強(qiáng)
內(nèi)存膨脹測(cè)試腳本增強(qiáng)是指通過對(duì)測(cè)試腳本進(jìn)行自動(dòng)化重構(gòu),將普通功能測(cè)試腳本轉(zhuǎn)換成為性能測(cè)試腳本。典型的方式是通過為測(cè)試腳本填添加循環(huán)操作和并發(fā)操作。
31腳本循環(huán)引入策略
測(cè)試腳本循環(huán)是指通過為測(cè)試腳本中的測(cè)試方法添加循環(huán)語句實(shí)現(xiàn)對(duì)測(cè)試方法的循環(huán)執(zhí)行,從而達(dá)到Web應(yīng)用程序長(zhǎng)時(shí)間大劑量運(yùn)行效果,更快的發(fā)現(xiàn)Web應(yīng)用中可能存在的內(nèi)存膨脹問題。傳統(tǒng)的方法是測(cè)試人員手動(dòng)不斷重復(fù)的循環(huán)執(zhí)行測(cè)試腳本,而人工循環(huán)操作測(cè)試腳本不僅耗時(shí)耗力,而且可能導(dǎo)致測(cè)試結(jié)果的不穩(wěn)定。另外,手動(dòng)的在測(cè)試腳本中添加循環(huán)操作也會(huì)導(dǎo)致人工的過度干預(yù),并且對(duì)每個(gè)測(cè)試腳本都添加循環(huán)操作會(huì)產(chǎn)生巨大的工作量,大大降低測(cè)試效率。我們提出了一個(gè)測(cè)試腳本自動(dòng)添加循環(huán)的方法,通過為測(cè)試方法設(shè)置循環(huán)次數(shù),自動(dòng)的在測(cè)試方法中的預(yù)定位置插入循環(huán)語句實(shí)現(xiàn)腳本循環(huán)執(zhí)行。
Web應(yīng)用程序試腳本循環(huán)的輸入是一個(gè)原始測(cè)試腳本和預(yù)定循環(huán)次數(shù),輸出是一個(gè)增加循環(huán)后的測(cè)試腳本。算法偽代碼如算法1所示。
首先給定一個(gè)原始測(cè)試腳本,利用ANTLR構(gòu)造測(cè)試腳本抽象語法樹AST,然后定位循環(huán)語句的插樁位置,由于循環(huán)是作用于整個(gè)測(cè)試方法,所以需要循環(huán)語句添加到整個(gè)方法體的外層。循環(huán)語句的插樁位置測(cè)試方法第一個(gè)直接子節(jié)點(diǎn)之前。插入循環(huán)語句節(jié)點(diǎn)之后,將抽象語法樹還原成測(cè)試腳本。完成循環(huán)語句自動(dòng)插入。
32腳本并發(fā)引入策略
為了模擬多用戶并發(fā)場(chǎng)景,增加Web應(yīng)用內(nèi)存膨脹問題暴露的可能性,我們?yōu)闇y(cè)試腳本引入了并發(fā)執(zhí)行語句。手動(dòng)測(cè)試腳本并發(fā)執(zhí)行需要測(cè)試人員同時(shí)運(yùn)行多個(gè)測(cè)試腳本,操作復(fù)雜,效率低下。我們提出了一種測(cè)試腳本自動(dòng)重構(gòu)策略來為測(cè)試腳本添加并發(fā)執(zhí)行。為了避免同時(shí)運(yùn)行多個(gè)腳本,我們將多個(gè)不同的測(cè)試腳本通過外部引入的方式加入到原始測(cè)試腳本中。這樣,只需要發(fā)起一個(gè)測(cè)試腳本的執(zhí)行,會(huì)自動(dòng)執(zhí)行并發(fā)方法,并發(fā)執(zhí)行方法會(huì)再以并發(fā)的方式調(diào)用外部引用的測(cè)試腳本,從而實(shí)現(xiàn)多腳本并發(fā)執(zhí)行。
如圖4所示,腳本并發(fā)引入的輸入數(shù)據(jù)是原始測(cè)試腳本、并發(fā)線程數(shù)目以及待并發(fā)的測(cè)試腳本集合,輸出數(shù)據(jù)是自動(dòng)重構(gòu)的并發(fā)測(cè)試腳本。首先利用ANTLR在原始腳本中確定并發(fā)測(cè)試方法的插入位置。并使用ANTLR構(gòu)造測(cè)試腳本抽象語法樹,然后將并發(fā)測(cè)試腳本通過外部引入的方式關(guān)聯(lián)到原始腳本上,將引入語句插入到抽象語法樹中。然后根據(jù)模板將并發(fā)線程數(shù)目以及運(yùn)行庫runtime封裝成并發(fā)方法。最后將并發(fā)方法插入到抽象語法樹中的預(yù)定插樁位置。然后將抽象語法樹還原成測(cè)試腳本,完成對(duì)測(cè)試腳本的并發(fā)執(zhí)行引入。
4原型工具實(shí)現(xiàn)endprint
為檢驗(yàn)本文方法的有效性,在Eclipse 平臺(tái)上實(shí)現(xiàn)了一個(gè)Web應(yīng)用程序測(cè)試腳本自動(dòng)重構(gòu)原型工具。 圖 5 給出了測(cè)試腳本自動(dòng)優(yōu)化界面,從圖中可以看出通過測(cè)試腳本自動(dòng)優(yōu)化后,原始測(cè)試方法中的print(“test acc log”)被去除,實(shí)現(xiàn)測(cè)試腳本優(yōu)化。
圖6給出了測(cè)試腳本自動(dòng)增強(qiáng)界面。以自動(dòng)為測(cè)試腳本添加循環(huán)為例,這里為測(cè)試腳本UpdateBook.py的test_update_book測(cè)試方法添加10輪循環(huán),自動(dòng)重構(gòu)后的測(cè)試腳本如圖中右邊編輯框所示,測(cè)試方法被自動(dòng)添加了循環(huán)語句,實(shí)現(xiàn)測(cè)試腳本增強(qiáng)。測(cè)試腳本并發(fā)過程同添加循環(huán)一樣。
5結(jié)論
本文提出了一種基于ANTLR的Web應(yīng)用測(cè)試腳本自動(dòng)重構(gòu)方法。通過構(gòu)建測(cè)試腳本運(yùn)行時(shí)聯(lián)網(wǎng)狀態(tài)模型收集腳本聯(lián)網(wǎng)狀態(tài),再利用ANTLR自動(dòng)去除測(cè)試腳本與Web事件不相關(guān)的語句實(shí)現(xiàn)腳本自動(dòng)優(yōu)化。通過為測(cè)試腳本添加循環(huán)、并發(fā)語句來實(shí)現(xiàn)對(duì)測(cè)試腳本的增強(qiáng)。測(cè)試腳本的自動(dòng)重構(gòu)不僅提高了測(cè)試效率,節(jié)約了測(cè)試資源,而且能夠更快的發(fā)現(xiàn)Web應(yīng)用中存在的內(nèi)存缺陷和性能瓶頸。
參考文獻(xiàn)
[1]路曉麗Web應(yīng)用軟件的測(cè)試技術(shù)研究[D]西安:西北大學(xué),2006
[2]楊佩星面向能耗的測(cè)試用例生成技術(shù)研究[D],南京:南京航空航天大學(xué),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