王曙燕,鄭佳妮,孫家澤
(西安郵電大學(xué) 計算機學(xué)院,西安710121)
隨著客戶端更豐富的用戶交互和后端的大量Web服務(wù)的發(fā)展,Web應(yīng)用的質(zhì)量問題也日漸受到關(guān)注。測試用例生成是軟件測試中最耗費人力的任務(wù)之一,對測試的有效性和效率至關(guān)重要。
現(xiàn)代Web應(yīng)用程序采用多層體系結(jié)構(gòu),需要端到端測試技術(shù)來確保Web應(yīng)用程序的整體行為[1]?;谀P偷臏y試用例生成方法通過構(gòu)建被測應(yīng)用的行為模型,根據(jù)不同的測試需求和覆蓋準(zhǔn)則,遍歷模型生成測試路徑并耦合模擬數(shù)據(jù)進而生成測試用例,在Web應(yīng)用自動化測試領(lǐng)域具有重要的研究意義[2]。
基于模型的測試方法中使用的模型有:導(dǎo)航模型、有限狀態(tài)機(Finite Stete Machine, FSM)模型以及擴展有限狀態(tài)機(Enhanced Finite State Machine, EFSM)模型、統(tǒng)一建模語言(Unified Modeling Language, UML)圖模型等。文獻[3]定義了Web應(yīng)用模式并構(gòu)造其關(guān)系圖以建立路徑生成圖,提出一種測試路徑生成方法。文獻[4]在該關(guān)系圖的基礎(chǔ)上,提出了一種基于狀態(tài)遷移的Web應(yīng)用功能測試用例生成方法,構(gòu)造頁面狀態(tài)遷移圖(State Transition Diagram of Pages, STDP)、事件遷移表和導(dǎo)航遷移表對Web應(yīng)用的鏈接關(guān)系進行表示,并結(jié)合事件遷移表和導(dǎo)航遷移表中的信息記錄構(gòu)造測試用例,有效提高了錯誤檢測率,但該方法生成的測試路徑存在冗余的情況。文獻[5]中提出了一種以UML建模應(yīng)用行為以生成測試用例的方法,文獻[6]中提出了一種基于有限狀態(tài)機的測試生成與約束相結(jié)合的方法,有效減少使用FSM時的狀態(tài)爆炸,但FSM建模的抽象范圍會受到一定的限制。
文獻[7]中提出了一種通過自動動態(tài)分析Web應(yīng)用中用戶界面狀態(tài)的更改來推斷出導(dǎo)航路徑和狀態(tài)機,可用于動態(tài)Web測試,但是輸入策略的隨機性導(dǎo)致無法完整爬取整個應(yīng)用,模型也存在狀態(tài)空間爆炸的問題,重復(fù)爬取頁面產(chǎn)生冗余狀態(tài)會生成無效測試用例。頁面對象設(shè)計模式[8]廣泛用于Web測試中,降低網(wǎng)頁的測試代碼生成和維護成本,即在網(wǎng)頁和測試代碼之間引入了一個中間層對網(wǎng)頁元素所在頁面進行有意義的抽象,使得測試代碼僅包含測試邏輯代碼。為了減小Web應(yīng)用導(dǎo)航圖規(guī)模,文獻[9]中提出了一種動態(tài)Web應(yīng)用程序的自動測試生成技術(shù),通過自動生成頁面對象有效地將測試代碼與網(wǎng)頁分離,基于頁面對象執(zhí)行迭代反饋定向隨機測試用例生成。由于使用一個頁面對象來抽象每個單獨網(wǎng)頁的用戶界面,沒有考慮頁面對象抽象范圍對Web測試有效性的影響。文獻[10]將頁面對象移動到狀態(tài)級別,通過UML狀態(tài)圖轉(zhuǎn)換為遷移樹的形式,利用狀態(tài)頁面對象設(shè)計測試場景,并將遷移樹根節(jié)點到葉子節(jié)點的路徑作為測試路徑進一步生成測試用例。
一種新型深部調(diào)驅(qū)用無機復(fù)合轉(zhuǎn)向劑的研制及性能評價……………………………………………………………(4):62
針對以上問題,本文提出了一種基于頁面對象的Web應(yīng)用測試用例生成方法,針對被測Web應(yīng)用進行功能測試塊分析,并對可復(fù)用功能塊定義功能頁面對象,根據(jù)導(dǎo)航頁面對象(Page Objects,POs)對Web應(yīng)用進行建模,生成頁面對象導(dǎo)航圖,并結(jié)合圖的廣度優(yōu)先遍歷以及最短路徑算法提出頁面對象圖算法(Page Object Graph Algorithm, POGA)遍歷導(dǎo)航圖提取測試路徑集,進而生成可直接執(zhí)行的測試用例。該方法不僅約簡了Web應(yīng)用模型的狀態(tài)數(shù)量,還消除了測試路徑的冗余,降低了測試成本。此外,由于細化Web頁面的抽象范圍,提高了頁面對象的復(fù)用率。
測試用例的生成過程主要包括4個部分:原始頁面對象分類、構(gòu)建Web應(yīng)用導(dǎo)航圖、測試路徑集提取、測試用例生成。頁面對象導(dǎo)航圖生成測試用例方法流程如圖1所示。
圖1 測試用例生成方法流程Fig. 1 Flow chart of test case generation method
步驟1 原始頁面對象分類。分析Web應(yīng)用的待測功能,并編寫頁面對象類,用方法封裝元素操作。定義導(dǎo)航頁面對象類和功能頁面對象類。
步驟2 構(gòu)建Web應(yīng)用導(dǎo)航圖。以導(dǎo)航頁面對象作為圖的節(jié)點、導(dǎo)航方法作為圖的邊構(gòu)建Web應(yīng)用導(dǎo)航圖。
步驟3~4 測試路徑集提取。采用POGA遍歷導(dǎo)航圖,提取測試路徑集,并根據(jù)每條路徑的參數(shù)列表產(chǎn)生模擬數(shù)據(jù)。
步驟5 測試用例生成。提取測試路徑,初始化頁面對象類,生成可執(zhí)行的測試用例。
異步Javascript和XML(Asynchronous Javascript And XML, AJAX)技術(shù)在當(dāng)前Web開發(fā)中應(yīng)用廣泛,編寫相應(yīng)的頁面對象時不同于傳統(tǒng)網(wǎng)站[11-12],本文使用頁面對象類生成工具對被測Web應(yīng)用生成原始頁面對象,再進行Web應(yīng)用功能塊分析,將原始頁面對象進行分類,以Github上的開源網(wǎng)站litemall小商城后臺管理員系統(tǒng)作為本文方法演示案例,由于單網(wǎng)頁應(yīng)用頁面模板渲染的特點,對于任何改變DOM結(jié)構(gòu)的操作都認為是新操作來重新生成測試用例會浪費相當(dāng)?shù)臅r間和人力[13-14]。在用戶管理模塊下會員管理和收貨地址兩個子模塊中,由于使用了同一頁面模板,僅表單輸入文本內(nèi)容不同,因此可將查找功能點作為一個功能頁面對象類,并在其中封裝查找的抽象方法,在頁面導(dǎo)航時僅需調(diào)用查找頁面對象類查找方法即可。如圖2所示,兩個導(dǎo)航頁面對象UserPage、AddressPage,SearchPage為查找功能頁面對象。
國內(nèi)學(xué)者主要從科技人才集聚、人才集聚效應(yīng)、人才集聚環(huán)境等方面對人才集聚進行研究。盛亞、于卓靈(2015),從浙江省現(xiàn)有人才政策對科技人才集聚的影響進行實證分析,提出浙江省進一步有效實現(xiàn)區(qū)域人才集聚的政策建議。牛沖槐、賀召賢、張永紅(2010),從政策引導(dǎo)調(diào)控科技型人才流向、建立和完善人才流動法律框架、建設(shè)良好的基礎(chǔ)設(shè)施等角度提高人才集聚的吸引力,從而保證科技型人才的供給基礎(chǔ)。張同全(2008),從人才集聚規(guī)模、人才流動的特點等方面,建立了人才集聚效應(yīng)評價體系。
圖2 功能頁面對象示例圖Fig. 2 Function page object example diagram
但這并沒有阻止人們拯救洛麗塔的決心,人們擁向海洋館,手里拿著一面自制的旗幟,呼吁游客抵制觀看洛麗塔的表演,“它已經(jīng)很累了,難道我們要為滿足自己欲望讓它無休止地演出嗎?”
生態(tài)城市是在世界上出現(xiàn)嚴(yán)重的環(huán)境問題以及資源短缺問題之后提出的,是以生態(tài)學(xué)作為理論基礎(chǔ),圍繞整個城市生態(tài)系統(tǒng)進行研究,通過對系統(tǒng)工程技術(shù)、生物技術(shù)、環(huán)境工程技術(shù)等等較為先進的技術(shù)手段,對人與自然環(huán)境之間的關(guān)系進行分析和處理,從而更好的去解決城市在發(fā)展過程當(dāng)中所出現(xiàn)的問題,對自然界的資源進行科學(xué)、合理的運用和保護,對已經(jīng)受損的生態(tài)系統(tǒng)進行修復(fù),從而建立人與自然持續(xù)發(fā)展的城市。通過對生態(tài)城市的內(nèi)涵進行分析,實際上是和人們的生活息息相關(guān)的,使人們所追求的理想城市狀態(tài)。
導(dǎo)航圖以及頁面對象定義如下。
由于頁面對象設(shè)計模式具有良好的封裝性,且當(dāng)前頁面對象返回下一頁面對象[15-16],功能頁面對象使用UML類圖進行表示,如圖3所示為根據(jù)算法1所生成的案例網(wǎng)站部分導(dǎo)航圖,加粗的遷移邊代表閉環(huán)或自環(huán)現(xiàn)象。
定義1 導(dǎo)航頁面對象(POs)。導(dǎo)航頁面對象類中定義導(dǎo)航方法,導(dǎo)航方法使用功能頁面對象中封裝的元素操作方法,構(gòu)成導(dǎo)航方法集合Methods,其中,(POi,POj)∈POs,POi、POj是頁面對象集合中兩個任意的頁面對象類,mi∈Methods是POi中定義的導(dǎo)航方法,返回頁面對象類POj。
定義2 頁面對象導(dǎo)航圖(Page Object Graph,POG)。每個導(dǎo)航頁面對象類中的導(dǎo)航方法顯式指定了待返回的下一個頁面對象類,由生成的頁面對象集合POs,構(gòu)建導(dǎo)航圖POG=〈N,E〉,其中,N是節(jié)點集合,映射為頁面對象集合POs,E表示有向邊集合,映射為導(dǎo)航方法集合Methods,其元素eij=(Ni,Nj)∈E,其中Ni、Nj∈N,eij表示從節(jié)點Ni轉(zhuǎn)換到節(jié)點Nj,映射為頁面對象中的一個導(dǎo)航方法m。
步驟2 讀取步驟1獲取的POs,循環(huán)訪問每一個節(jié)點,提取代表節(jié)點的頁面對象類中所有導(dǎo)航方法,并存入邊集合E中,以字典dic表示導(dǎo)航方法與頁面對象的映射關(guān)系,第i個節(jié)點的導(dǎo)航方法集合表示形式為dic[N[POi]]=E。
注意到,只有作為永久性資源才與時間相關(guān),只有長時間存在的資源才會發(fā)生某些分配方法的資源非單調(diào)性(例如席位分配的哈密頓法不滿足席位單調(diào)性[2]);反之,對于暫存性資源,人們往往對一次性分配僅僅關(guān)注是否與應(yīng)得份額接近(緊鄰性).由此可見,資源分配的寬約束模型適用于永久性資源的分配,緊約束模型適用于暫存性資源的分配.
算法1 Web應(yīng)用導(dǎo)航圖生成算法。
輸入:頁面對象類文件page.py;
輸出:頁面對象導(dǎo)航圖POG。
步驟1 讀取頁面對象類文件page.py,獲取BasePage的所有子類,加入節(jié)點集合N。
下面給出Web應(yīng)用導(dǎo)航圖生成算法。
由雙比值判別法可知,對于正項級數(shù),如果,則當(dāng)時,級數(shù)收斂;當(dāng)時,發(fā)散.對于級數(shù),,故雙比值判別法在判斷級數(shù)的斂散性時不適用.但當(dāng)時,定理1中的,此時由定理1可判定級數(shù)收斂;當(dāng)時,定理1中的,此時由定理1可判定級數(shù)發(fā)散.所以,能用雙比值判別法判斷斂散性的級數(shù)亦可用定理1來判斷其斂散性.類似可知,對于通項遞減的正項級數(shù),能用雙比值判別法判斷其斂散性時亦可用定理2判斷其斂散性.但反之不成立.
步驟3 分析每一個導(dǎo)航方法返回的頁面對象類存入字典dic_next中,表示為dic_next[mi]=POj。
es={login(),goto_passwd(),modify_passwd(),
對于dic中每一個頁面對象類,構(gòu)造二維頁面對象字典dic_po表示當(dāng)前頁面對象與下一個頁面對象的映射關(guān)系dic_po[POi][mi]=POj。
ITC[16]源于劍橋大學(xué)校園學(xué)生軌跡的可視化實驗,是達特茅斯學(xué)院歸檔的無線自組織通信數(shù)據(jù)集之一,具體信息如表1所示.
步驟5 讀取步驟4中的圖字典dic_po,輸出Web應(yīng)用導(dǎo)航圖。
圖3 頁面導(dǎo)航圖Fig. 3 Page navigation graph
為了優(yōu)先提取測試路徑集,更好地設(shè)計測試用例[17],測試路徑在圖中表示為當(dāng)前頁面對象到達另一頁面對象的最短路徑,因此遍歷POG生成的測試用例即為初始節(jié)點到目標(biāo)節(jié)點的邊序列[18],即導(dǎo)航方法序列,可以得到測試路徑集pathG=〈ns,es,pr〉,其中ns為節(jié)點集合,es為邊集合,pr為輸入?yún)?shù)列表。其中p1,p2,…,pi表示測試路徑集pathG中的每一條測試路徑。下面給出POG的遍歷算法即POGA。
算法2 POGA。
由表17可知,企業(yè)的流動比率、速動比率都不高,增減幅度不大,但在2014~2016年四年間企業(yè)資產(chǎn)的流動比率和速動比率一直處于下降,直到2017年,才開始逐漸上升,說明企業(yè)資產(chǎn)的流動性不強,短期償債能力總體來說處于弱勢,但2017年其流動比率和速動比率相較于之前是處于增加的狀態(tài),有逐漸增強的趨勢。
輸入:Web應(yīng)用導(dǎo)航圖POG。
輸出:測試路徑集合pathGS。
P12:ns={LoginPage,HomePage,BrandPage},
P13:ns={LoginPage,HomePage,BrandPage},
步驟3 依次循環(huán)訪問dic_po中{mi:Nj},若Nj未被訪問過,將該節(jié)點放入隊列queue隊尾并返回步驟2。若Ni=Nj,則屬于節(jié)點自環(huán)情況,進入步驟4;若Nj在visited中,且Nj只出現(xiàn)過一次,則表示閉環(huán)情況,進入步驟5;若Nj不在list中,則表示終止節(jié)點,則測試路徑path=mi。
步驟4 調(diào)用步驟1中find_shortest_path,其中參數(shù)start=N0,end=Nj:節(jié)點序列ns=find_shortest_path(POG,N0,Nj)+[Nj]。
步驟5 參數(shù)start=N0,end=Nj,節(jié)點序列ns=[N0,Ni,Nj]。
步驟6 重復(fù)步驟2中生成的路徑path加入測試路徑集合pathGS中,輸出pathGS。
根據(jù)POGA,一共可以得到如下12條路徑:
P1:ns={LoginPage,HomePage,UserPage,UserPage},
es={login(),goto_user(),add_user()},
pr={(username,passwd),(name,telenum)}
P2:ns={LoginPage,HomePage,UserPage,UserPage},
es={login(),goto_user(),search_user()},
pr={(username,passwd),(name,telenum)}
P3:ns={LoginPage,HomePage,LoginPage},
es={login(),logout()},
pr={(username,passwd)}
P4:ns={LoginPage,HomePage,GoodPage,CreatePage},
es={login(),goto_good(),add_good()},
pr={(username,passwd),(good_num,good_name,price)}
P5:ns={LoginPage,HomePage,GoodPage,GoodPage},
從CNKI中文獻,可以看出白花前胡研究主題包含多個方面,從種質(zhì)資源到臨床應(yīng)用都有涉及,以化學(xué)成分研究文獻比重最大,有18篇,占總文獻量的12.58%,主要為白花前胡化學(xué)成分對離體血管的作用,早期抽薹對白花前胡根化學(xué)成分的影響,以及較深入研究了河南產(chǎn)白花前胡的化學(xué)成分。藥理作用研究文獻有4篇,主要研究了白花前胡及其有效成分甲素的抗心律失常及抗心肌缺血作用。臨床觀察有1篇,研究了白花前胡劑可有效改善缺血性中風(fēng)患者的臨床癥狀。提取工藝研究文獻有6篇,鑒定技術(shù)1篇,炮制工藝研究文獻1篇,種質(zhì)資源與栽培技術(shù)研究文獻各1篇,資源調(diào)查研究文獻2篇。
es={login(),goto_good(),search_good()},
pr={(username,passwd),(good_num,good_name)}
P6:ns={LoginPage,HomePage,GoodPage,GoodPage},
es={login(),goto_good(),delete_good()},
由圖4和圖6可以看出,攝像頭采集到的并行數(shù)據(jù)先傳入兩個級聯(lián)的OSERDES2中進行串化,之后通過LVDS信號進入兩個級聯(lián)的ISERDES2中進行數(shù)據(jù)的解碼,最后傳出8位并行數(shù)據(jù)。
pr={(username,passwd)}
P7:ns={LoginPage,HomePage,GoodPage,ItemPage},
es={login(),goto_good(),edit_good()},
pr={(username,passwd),(good_num,good_name,price)}
P8:ns={LoginPage,HomePage,ModifyPasswdPage,HomePage,LoginPage},
步驟4 讀取步驟2生成的dic和步驟3生成的dic_next,
logout()},
pr={(username,passwd),(passwd,newpasswd)}
P9:ns={LoginPage,HomePage,GoodPage,EditPage},
es={login(),goto_good(),edit_good()},
pr={(username,passwd),(good_num,good_name,price)}
由于模型中已將車頭及輪胎化簡,為減小仿真誤差,需將其質(zhì)量及摩擦力附加在模型中[4-5]。摩擦力和慣性力產(chǎn)生于碰撞瞬間、運輸車狀態(tài)發(fā)生改變的時刻,故可以統(tǒng)一換算成阻力。后輪與地面的阻力F1和前方牽引銷處的阻力F2可表示為
春夏秋冬四季更替,帶來萬物生長不變的輪回。冬季以寒冷、干燥為主,同時每逢冬季霧霾情況也會逐漸加重,而冬季洗衣最常遇到的問題就是洗衣很難快速干燥,霧霾、保暖原因讓你更加無法開窗通風(fēng)加快衣物干燥,洗烘一體機就成為冬季解決洗衣難最好的方式之一。洗烘一體機集合洗衣機、烘干機兩大功能,不額外增加占地面積,快速干衣功能也滿足了人們對于潔凈新衣的需求,辭舊迎新,近一年中有哪些洗烘一體機值得我們關(guān)注呢?
P10:ns={LoginPage,HomePage,TopicPage,TopicPage},
es={login(),goto_topic(),search()},
pr={(username,passwd),(title,sub_title)}
P11:ns={LoginPage,HomePage,TopicPage,TopicCreatePage},
es={login(),goto_topic(),add_topic()},
pr={(username,passwd),(title,sub_title)}
步驟1 訪問POG的初始頁面對象節(jié)點N0,并將N0加入已訪問列表中,建立一個隊列queue以及已訪問集合visited,并初始化queue=[N0],visited={}。
es={login(),goto_brand(),add_brand()},
pr={(username,passwd),(brand_name,brand_info)}
研究區(qū)的溫泉主要分布于瓦廠上至龍布溝之間約8 km的雅拉河谷地中,泉眼多出露于河漫灘與階地上。瓦廠上出露的溫泉分布于雅拉河?xùn)|岸,其中部分泉眼被開發(fā)利用,中谷村溫泉分布較為密集,雅拉河?xùn)|西兩岸均有分布,西岸分布有若干泉群,每個泉群有若干泉眼;大蓋、龍布的溫泉多分布于雅拉河西岸,雅拉藥泉位于雅拉河與其支流的交匯處,有較濃的H2S氣味。
es={login(),goto_brand(),search_brand()},
pr={(username,passwd),(brand_id,brand_name)}
為了保證測試路徑的可達性,要求輸入的參數(shù)值滿足導(dǎo)航方法中要求的參數(shù)約束。本文將測試路徑集中提取的參數(shù)列表根據(jù)業(yè)務(wù)場景分類[19],采用Python的第三方庫Faker生成模擬數(shù)據(jù)用于測試用例中表單數(shù)據(jù)填充。
由于得到的測試路徑集中存在重復(fù)功能測試塊,生成測試用例集時需要進一步約簡,測試路徑P2、P5、P9、P12均為查找功能的測試路徑。為了驗證該功能只需要一個測試用例,根據(jù)pathGS最終生成9個測試用例。測試用例的生成步驟為:
1)從pathGS中提取一條測試路徑,讀取測試路徑上的節(jié)點序列,并創(chuàng)建當(dāng)前頁面對象的瀏覽器實例。
2)調(diào)用當(dāng)前頁面對象中的導(dǎo)航方法,提取導(dǎo)航方法中的參數(shù)列表。
3)傳入?yún)?shù)值,并進行待返回頁面對象的瀏覽器實例創(chuàng)建。
4)頁面斷言,驗證是否到達下一導(dǎo)航頁面對象以驗證導(dǎo)航方法的正確性。
以路徑P1為例,本案例采用默認管理員的認證信息,即username和passwd是admin123,測試用例的生成步驟如下:
class TestLitemall(WebAppTest):
#前置條件,用戶登錄
def setUp(self):
super(TestLitemall,self).setUp()
self.login_page=LoginPage(self.browser)
self.login_page.visit().login("admin123","admin123")
def test_add_user(self):
#頁面對象類實例化
self.home_page=HomePage(self.browser)
self.user_page=UserPage(self.browser)
self.list_page=UserListPage(self.browser)
self.home_page.goto_user()
self.user_page.add_user("zhengjiani","11111111")
results=self.list_page_search_user("zhengjiani","11111111")
# 測試預(yù)言
assert "zhengjiani" in results
為了說明本文方法的可行性,本實驗利用Python語言實現(xiàn)所提出的Web應(yīng)用導(dǎo)航圖構(gòu)建算法以及POGA,統(tǒng)計構(gòu)成Web應(yīng)用導(dǎo)航圖的規(guī)模大小以及測試路徑集的相關(guān)信息來進行實驗分析。
本文實驗選取兩個開源程序作為被測Web應(yīng)用,其詳細描述如表1,LOC(Line Of Code)是軟件規(guī)模代碼行數(shù),petclinic是文獻[12]中的基準(zhǔn)程序,Addressbook作為文獻[13]被測對象,無論是頁面對象研究領(lǐng)域還是Web應(yīng)用測試領(lǐng)域都具有一定的代表性。通過與文獻[7]中Crawljax工具和文獻[4]STDP圖進行規(guī)模對比、與文獻[4]生成的Web應(yīng)用測試路徑集以及測試用例數(shù)進行對比分析、并將分類前后頁面對象的功能復(fù)用率進行對比,從多個角度評估基于頁面對象生成Web測試用例的有效性。為了保證在較為公平的實驗環(huán)境下進行對比分析,在采用Crawljax工具進行爬取時,識別標(biāo)簽均采用默認元素,即鏈接以及按鈕
表1 測試Web應(yīng)用描述 Tab. 1 Test Web application description
本文具體的實驗參數(shù)如下:操作系統(tǒng)Windows10 64位,CPU規(guī)格Intel Core i7- 4510U CPU@2.00 GHz 2.60 GHz,編程運行環(huán)境Python3.7,使用的瀏覽器Chrome 71.0,Firefox 66.0,頁面對象編寫采用edx/bok-choy 0.9.3,Crawljax工具采用crawljax-web- 3.6。
4.2.1 不同方法生成頁面對象導(dǎo)航圖規(guī)模比較
本文與爬蟲工具Crawljax獲取的動態(tài)搜索導(dǎo)航圖以及文獻[4]基于頁面狀態(tài)遷移生成的導(dǎo)航圖STDP的狀態(tài)數(shù)量N和遷移邊數(shù)E進行了比較,結(jié)果如圖4所示。
圖4 不同方法構(gòu)造導(dǎo)航圖的規(guī)模比較Fig.4 Scale comparison of navigation graph generated by different methods
對比Crawljax工具和本文方法得到的導(dǎo)航圖可以得到,petclinic和Addressbook應(yīng)用的Crawljax節(jié)點數(shù)為28和329,本文方法構(gòu)建導(dǎo)航圖狀態(tài)數(shù)僅為7和10,其導(dǎo)航狀態(tài)數(shù)減少百分比分別為75%和96%,導(dǎo)航狀態(tài)數(shù)平均減小85%,Crawljax構(gòu)成導(dǎo)航邊遷移數(shù)為94和930,本文方法構(gòu)建導(dǎo)航圖遷移邊數(shù)為9和18,其導(dǎo)航遷移邊數(shù)減少百分比分別為90%和98%,導(dǎo)航遷移數(shù)平均減小94%,所以本文方法的平均約簡率約為89%。可以看出:本文方法在構(gòu)造導(dǎo)航圖規(guī)模大小明顯低于Crawljax工具,有效減少了導(dǎo)航圖的冗余以及緩解爬取Web應(yīng)用生成導(dǎo)航圖狀態(tài)爆炸和中斷問題;而且本文方法用于案例的litemall應(yīng)用時,由于手動構(gòu)造頁面對象類,使得導(dǎo)航圖成功構(gòu)造并且生成可行的測試路徑集。其次,將文獻[4]方法構(gòu)建的STDP圖與本文方法構(gòu)成的POG圖進行比較,其中STDP圖以不同的URL地址作為頁面狀態(tài),鏈接作為遷移邊,petclinic應(yīng)用和Addressbook應(yīng)用的節(jié)點數(shù)分別為11和27,遷移邊數(shù)分別為14和32,其導(dǎo)航狀態(tài)數(shù)減少百分比分別為36%和62%,導(dǎo)航狀態(tài)數(shù)平均減小49%,其導(dǎo)航遷移邊數(shù)減少百分比分別為35%和43%,導(dǎo)航遷移數(shù)平均減小39%??梢钥闯霰疚姆椒ㄅc基于狀態(tài)遷移的構(gòu)建的Web應(yīng)用導(dǎo)航圖相比規(guī)模也有所減小。
4.2.2 不同方法生成測試用例比較
表2是文獻[4]方法與本文方法在生成測試路徑集數(shù)量、生成測試用例數(shù)量以及冗余測試路徑數(shù)的比較。由于文獻[4]采用將鏈接事件和表單觸發(fā)事件作為頁面狀態(tài)的跳轉(zhuǎn),使用錯誤分類的測試用例覆蓋準(zhǔn)則,將需要表單輸入的參數(shù)列表分為有效與無效類,其中無效類又分為(不符合參數(shù)類型、不符合參數(shù)規(guī)定、不符合參數(shù)個數(shù))共三類,為保證一致性,因此本文在進行方法對比時,將帶參數(shù)列表的導(dǎo)航方法亦分為上述四類。可以看出,對于petclinic應(yīng)用,文獻[4]方法和本文方法生成的測試路徑數(shù)為18和5,測試用例數(shù)為18和16,其中文獻[4]方法產(chǎn)生的冗余測試路徑數(shù)為3。對于Addressbook應(yīng)用,文獻[4]方法和本文方法生成的測試路徑數(shù)為25和10,測試用例數(shù)為18和30,其中文獻[4]方法產(chǎn)生的冗余測試路徑數(shù)為5。隨著Web2.0的推進,AJAX應(yīng)用狀態(tài)刷新時其URL地址不發(fā)生改變,因此文獻[4]方法采用URL地址作為導(dǎo)航圖狀態(tài)識別,以鏈接信息作為跳轉(zhuǎn)會遺漏頁面事件,并且如果將一次點擊click操作作為跳轉(zhuǎn)邊也會產(chǎn)生冗余測試路徑。
4.2.3 頁面對象分類前后復(fù)用率的比較
表3是被測Web應(yīng)用頁面對象進行分類前后構(gòu)成導(dǎo)航圖的對比,主要包括總頁面對象數(shù)量、頁面對象類代碼行數(shù),功能頁面對象數(shù)量以及頁面對象復(fù)用率。復(fù)用率定義為功能頁面對象的數(shù)占總頁面對象數(shù)的比例。petclinic應(yīng)用分類后生成2個功能頁面對象,復(fù)用率達22%。Addressbook應(yīng)用分類后生成3個功能頁面對象,復(fù)用率達30%。本文方法有效提高了頁面對象的復(fù)用率,降低了測試用例生成成本。
表3 分類前后頁面對象類的比較 Tab. 3 Comparison of page object classes before and after classification
針對Web應(yīng)用測試用例生成過程中導(dǎo)航圖規(guī)模過大以及冗余測試路徑的問題,本文提出了一種針對Web應(yīng)用的基于頁面對象的測試用例生成方法。本文方法是根據(jù)編寫原始頁面對象并進行分類,然后以分類后的導(dǎo)航頁面對象為節(jié)點,導(dǎo)航方法為遷移邊構(gòu)造Web應(yīng)用導(dǎo)航圖,并結(jié)合圖中的廣度優(yōu)先遍歷和最短路徑算法提出POGA遍歷算法提取測試路徑集;再者,通過Faker生成模擬數(shù)據(jù),分配導(dǎo)航方法序列中的參數(shù)列表中參數(shù)值,從而獲得最終可以直接執(zhí)行的測試用例集。
通過實驗分析,發(fā)現(xiàn)本文提出的方法可以有效減少Web應(yīng)用導(dǎo)航圖的規(guī)模大小,并且這種方法實現(xiàn)頁面對象的功能復(fù)用率約30%,頁面對象設(shè)計模式本身可以提高測試用例的可維護性,本文方法對頁面對象的進一步研究可以提高測試用例的生成效率,減少冗余測試路徑的生成,降低測試成本;但本文方法有一定的局限性,無法根據(jù)頁面對象自動生成測試預(yù)言,未來的工作是研究利用Web頁面對象導(dǎo)航圖輔助生成測試斷言以及將頁面對象設(shè)計模式應(yīng)用于RESTful(Representational State Transfer)API(Application Programming Interface)等的接口測試,減小UI(User Interface)測試開銷,為自動化測試提供新思路。