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