• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    函數(shù)調(diào)用路徑測試用例自動生成的方法研究

    2020-09-15 04:48:14牟永敏
    關(guān)鍵詞:函數(shù)調(diào)用測試用例程序

    沈 晴,牟永敏

    北京信息科技大學(xué) 計(jì)算機(jī)學(xué)院,北京 100101

    1 引言

    軟件測試可以提高軟件的可靠性[1]。在軟件開發(fā)周期,軟件測試是軟件開發(fā)過程中不可或缺的環(huán)節(jié),如果利用人工的方法實(shí)現(xiàn)測試需求,會耗費(fèi)大量人力物力,所需成本占比高達(dá)50%以上,因此研究人員致力于實(shí)現(xiàn)自動化測試,降低軟件測試成本。隨著軟件規(guī)模日趨大型化和復(fù)雜化,及時發(fā)現(xiàn)并修復(fù)軟件中存在的錯誤可以很大程度上避免軟件使用過程中發(fā)生故障帶來的損失,但同時也給軟件測試帶來進(jìn)一步的挑戰(zhàn),自動化測試的重要性日益凸顯。其中,測試用例對保證軟件測試的充分性和可靠性有著重要影響,一組合理的測試用例可以幫助測試人員找出程序中的錯誤。人工設(shè)計(jì)測試用例需要測試人員具備豐富的經(jīng)驗(yàn),且不可避免地受到人為因素影響,可能無法保證測試的充分性,因此,測試用例自動生成技術(shù)對提高軟件測試的效率有著重要意義。根據(jù)測試方法的不同,可以分為四大類型:隨機(jī)測試方法、基于搜索的測試方法、模型檢測測試方法以及符號執(zhí)行測試方法[2]。

    1983年Bird等人[3]提出隨機(jī)法,易于實(shí)現(xiàn)且十分高效,一些研究會將它作為基準(zhǔn)方法之一[4],但對于較為復(fù)雜的程序,隨機(jī)法很難達(dá)到較高的覆蓋率。為保證測試用例均勻地分布在搜索空間,提出自適應(yīng)隨機(jī)測試方法[5],但覆蓋率低的問題依然存在?;谒阉鞯臏y試用例自動生成方法[6]將測試用例自動生成問題轉(zhuǎn)化為函數(shù)優(yōu)化問題,并利用遺傳算法[7]、粒子群優(yōu)化算法[8]、蟻群算法[9]以及一些優(yōu)化后的進(jìn)化算法[10]等來尋找最優(yōu)解。但同樣存在總體覆蓋率較低的問題,并且很大程度上受限于適應(yīng)度函數(shù),容易進(jìn)入局部最優(yōu)解中,尤其在大型復(fù)雜程序中效果不理想,會產(chǎn)生大量冗余用例。模型檢測方法是一種形式化驗(yàn)證方法,包括許多的驗(yàn)證技術(shù)[11],通過模型檢測器搜索整個系統(tǒng)的狀態(tài)空間,根據(jù)生成的反例分析識別并修復(fù)軟件中的錯誤,但是模型創(chuàng)建難度較大,不同的模型的效果差異較大,并且由于狀態(tài)爆炸問題會導(dǎo)致性能下降。

    符號執(zhí)行是King[12]于1976 年提出的一種重要的形式化方法和程序分析技術(shù),被廣泛應(yīng)用于程序測試領(lǐng)域[13]。采用抽象符號代替程序變量,程序計(jì)算的輸出被表示為輸入符號值的函數(shù),根據(jù)程序的語義,遍歷程序的執(zhí)行空間,符號執(zhí)行技術(shù)能夠以盡可能少的測試用例實(shí)現(xiàn)高覆蓋率,從而挖掘出復(fù)雜軟件程序的深層錯誤,但在實(shí)際應(yīng)用中不可避免地會遇到許多限制條件,如路徑爆炸、約束求解等問題。

    在此基礎(chǔ)上,本文將研究粒度提升至函數(shù),用函數(shù)調(diào)用路徑圖替代控制流圖,從函數(shù)層面分析程序執(zhí)行過程,提出一種基于函數(shù)調(diào)用路徑的測試用例生成方法,分析程序抽象語法樹得到函數(shù)調(diào)用關(guān)系和執(zhí)行路徑,結(jié)合符號執(zhí)行技術(shù)生成與函數(shù)調(diào)用路徑對應(yīng)的全局測試用例集。該方法類似于狀態(tài)合并,將語句塊合并,且最大程度保留程序信息。實(shí)現(xiàn)在不降低測試覆蓋率的同時,提高符號執(zhí)行的效率。

    2 相關(guān)研究

    2.1 路徑覆蓋測試技術(shù)

    路徑覆蓋是軟件測試充分性的一個重要準(zhǔn)則[14],可歸結(jié)為面向路徑的測試數(shù)據(jù)生成問題[15],核心是選取最小測試用例集,覆蓋程序的所有可執(zhí)行路徑(如果程序圖中有環(huán),則要求每個環(huán)至少經(jīng)過一次)。

    2.1.1 基路徑分析方法

    由于完整路徑集合數(shù)量過于龐大,在實(shí)際中很難實(shí)現(xiàn),因此基本路徑測試方法應(yīng)運(yùn)而生?;诨窂降能浖y試是一種縮小規(guī)模的路徑測試技術(shù),最小化路徑組合的數(shù)量,減少重復(fù)測試的次數(shù),使路徑測試得以實(shí)現(xiàn)。

    目前基路徑分析主要算法有McCabe法[16]、Halstead法等。

    2.1.2 函數(shù)調(diào)用路徑分析方法

    基本路徑覆蓋測試在一定程度上縮小了路徑的數(shù)量,但其路徑數(shù)量會隨著程序的規(guī)模和復(fù)雜度的增大呈指數(shù)增長,使得精確率不甚理想,對循環(huán)結(jié)構(gòu)帶來的在路徑數(shù)量上的影響以及重疊路徑識別的處理方法仍存在一定缺陷。

    面向函數(shù)調(diào)用路徑的思想是在回歸測試和路徑覆蓋測試基礎(chǔ)上發(fā)展起來的,簡化了面向基路徑的測試缺陷,使得面向基路徑的測試工作量大幅減少。基于函數(shù)調(diào)用關(guān)系的路徑覆蓋測試技術(shù)以路徑覆蓋為基礎(chǔ),將函數(shù)調(diào)用與控制邏輯結(jié)合起來,把路徑單元從語句提升至函數(shù),通過對被測程序的源代碼進(jìn)行靜態(tài)和動態(tài)分析,分別獲取包含控制邏輯的靜態(tài)函數(shù)調(diào)用路徑以及動態(tài)函數(shù)調(diào)用序列,將動態(tài)獲取的序列轉(zhuǎn)化成靜態(tài)邏輯路徑,建立測試用例和路徑上的對應(yīng)關(guān)系[17]。

    2.2 符號執(zhí)行技術(shù)

    符號執(zhí)行自提出以來,經(jīng)過了傳統(tǒng)符號執(zhí)行、動態(tài)符號執(zhí)行、選擇性符號執(zhí)行三個發(fā)展過程[18],但仍存在一些困難。

    路徑爆炸問題是制約符號執(zhí)行在現(xiàn)實(shí)程序分析中應(yīng)用的主要因素。在符號執(zhí)行的分析過程中,每個分支節(jié)點(diǎn)都會衍生出兩個符號執(zhí)行實(shí)例,就串行程序而言,一個具有n個條件語句的程序段就有可能包含2n條路徑。

    目前已有狀態(tài)合并、冗余路徑剪枝、采用啟發(fā)式搜索方法對程序路徑空間進(jìn)行搜索以及優(yōu)化回歸測試集等方法緩解路徑爆炸問題,但仍存在一些問題,比如狀態(tài)合并會一定程度上影響程序分析的準(zhǔn)確性;啟發(fā)式搜索在面臨長路徑搜索時,路徑的計(jì)算和篩選需要耗費(fèi)較長時間,且可能無法得到符合的路徑。

    3 基于函數(shù)調(diào)用關(guān)系的路徑優(yōu)化

    目前能夠生成函數(shù)關(guān)系圖的工具,如CallTree、Codeviz、Source Insight、DGML 等,生成的函數(shù)調(diào)用關(guān)系并不包含控制邏輯,屬于函數(shù)包含關(guān)系圖;另一類工具,如 AlgoView、GNU CFlow 等,基于語句的分析,同樣不能得到函數(shù)粒度的調(diào)用路徑。

    文獻(xiàn)[19]對比了正則技術(shù)、開源工具以及語法樹三種提取函數(shù)調(diào)用關(guān)系的方法。對于正則技術(shù),通過多次掃描源代碼以匹配函數(shù)調(diào)用相關(guān)信息,獲取函數(shù)調(diào)用關(guān)系。對于開源工具,通過CTags和Cscope獲取并解析代碼樹中的索引,生成基于函數(shù)調(diào)用的依賴關(guān)系,獲取函數(shù)調(diào)用信息。語法樹主要是通過Yacc 和Lex 構(gòu)建語法樹來提取函數(shù)調(diào)用關(guān)系。從準(zhǔn)確率上說,三者中基于語法樹的提取方法效果最佳,因此本文基于抽象語法樹提取函數(shù)關(guān)鍵信息。

    圖1 函數(shù)調(diào)用路徑生成過程

    3.1 整體框架

    提出一種函數(shù)調(diào)用路徑靜態(tài)提取方法,通過分析抽象語法樹和字節(jié)碼序列,得到函數(shù)間的依賴關(guān)系以及相應(yīng)的控制條件;設(shè)計(jì)關(guān)鍵信息提取算法,獲取函數(shù)調(diào)用關(guān)系,從而構(gòu)建函數(shù)調(diào)用關(guān)系模型;以函數(shù)為節(jié)點(diǎn),同時結(jié)合程序控制條件,生成包含控制信息的函數(shù)調(diào)用關(guān)系圖,如圖1所示。

    3.2 函數(shù)調(diào)用路徑生成

    3.2.1 相關(guān)定義

    定義1(函數(shù)調(diào)用關(guān)系)指兩個函數(shù)之間的調(diào)用,用R表示,其中R={(Fi,Fj)|Fi是源函數(shù),F(xiàn)j是被調(diào)用的函數(shù)} 。如果在源函數(shù)中存在多個函數(shù)調(diào)用,則按調(diào)用的先后順序表示調(diào)用關(guān)系,如R={(F0,F1),(F1,F2 )},表示源函數(shù)中的函數(shù)調(diào)用關(guān)系為F0 →F1 →F2。

    定義2(函數(shù)調(diào)用關(guān)系模型)表示單個函數(shù)的函數(shù)調(diào)用關(guān)系,用三元組T(M,R,S)表示,M是函數(shù)集合,R表示函數(shù)間的調(diào)用關(guān)系,S表示源函數(shù)。

    圖2代碼段中main函數(shù),用函數(shù)調(diào)用關(guān)系模型T(M,R,S)表示,其中M={main,f1,f2,f3},R={(main,f1,O),(f1,f2,O),(f2,f3,B)},S={main},O表示順序調(diào)用,B表示分支調(diào)用。

    圖2 示例源代碼

    定義3(函數(shù)調(diào)用路徑)根據(jù)函數(shù)調(diào)用關(guān)系得到的由程序入口到出口的一個函數(shù)名序列,表示為Pi={Fi1,Fi2,…,Fim},Fij為函數(shù)名,F(xiàn)ij和Fij+1的關(guān)系表示為順序執(zhí)行或Fij調(diào)用Fij+1[20]。

    定義4(函數(shù)調(diào)用路徑集)函數(shù)調(diào)用路徑的集合,表示為B(S,C)={P1,P2,…,Pn},C是函數(shù)調(diào)用關(guān)系準(zhǔn)則,用來判斷函數(shù)是否被調(diào)用以及函數(shù)以何種方式被調(diào)用。例如:v1=F(x),其中v1表示變量,F(xiàn)(x)表示函數(shù);語句v1=F(x),表示將函數(shù)F(x)返回值賦值給v1,故該語句以函數(shù)返回值參與表達(dá)式運(yùn)算的方式調(diào)用函數(shù),S是源代碼,Pi是函數(shù)調(diào)用路徑[21]。

    定義5(函數(shù)調(diào)用路徑圖)表示為一個有向圖FCG(V,R),V是FCG中所有節(jié)點(diǎn)的有窮非空集合,R是相連節(jié)點(diǎn)之間邊的有限集合,滿足R?V×V,具體描述如下:

    其中,funcSet是函數(shù)調(diào)用路徑圖中的節(jié)點(diǎn)集合;R是函數(shù)調(diào)用路徑圖中節(jié)點(diǎn)之間的關(guān)系集合,P(x,y)表示從x到y(tǒng)的一條通路,C(x,y)表示從x到y(tǒng)通路上的控制條件。

    3.2.2 函數(shù)關(guān)鍵信息抽取

    以Python語言為例,抽象語法樹是一個深層嵌套的樹形結(jié)構(gòu),鑒于需要對不同類型節(jié)點(diǎn)進(jìn)行不同的處理,本文采用訪問者模式實(shí)現(xiàn)對抽象語法樹的遍歷,使節(jié)點(diǎn)類與作用于自身的操作相互獨(dú)立。

    步驟1訪問者從抽象語法樹根節(jié)點(diǎn)開始對抽象語法樹中的關(guān)鍵節(jié)點(diǎn)類型進(jìn)行遍歷,基本關(guān)鍵節(jié)點(diǎn)類型如表1所示。

    表1 基本關(guān)鍵節(jié)點(diǎn)類型

    步驟2判定節(jié)點(diǎn)類型是否為關(guān)鍵節(jié)點(diǎn)類型。

    步驟3如果節(jié)點(diǎn)類型是關(guān)鍵節(jié)點(diǎn)類型,則通過抽象訪問者進(jìn)行轉(zhuǎn)發(fā),直接訪問具體訪問者visit_Key(node),(如visit_Assign(node)是基于賦值關(guān)鍵字的訪問者)。提取相應(yīng)的關(guān)鍵信息;反之,則調(diào)用通用訪問者,統(tǒng)一處理。

    步驟4對提取到的所有信息進(jìn)行約減和自動補(bǔ)全,得到生成函數(shù)調(diào)用關(guān)系所需的關(guān)鍵信息列表。

    其中,關(guān)鍵節(jié)點(diǎn)類型具體算法描述如下:

    算法1關(guān)鍵信息抽取算法

    輸入:抽象語法樹文本AST Text

    輸出:關(guān)鍵信息列表KeyInfoList,函數(shù)字典FuncInfoDict

    1.Begin

    2.tree<-AST Text;//獲取 ast對象

    表2 分支語法結(jié)構(gòu)-關(guān)系模型

    3.FOR node in tree DO //遍歷每一個節(jié)點(diǎn)

    4.type<-node.type;//根據(jù)節(jié)點(diǎn)類型,調(diào)用訪問者

    5.IF existFunc(type) THEN

    6.visit_Key(node);//如果存在具體訪問者

    7.ELSE generic_visito(rnode);//如果不存在

    8.ENDIF

    9.END FOR

    10.FuncInfoDict<-completeFuncDic(t);//補(bǔ)全函數(shù)字典

    11.//補(bǔ)全關(guān)鍵信息列表

    12.KeyInfoList<-completeFuncInfo(FuncInfoDict);

    13.END

    在抽象訪問者中數(shù)據(jù)結(jié)構(gòu)的每個節(jié)點(diǎn)都能夠接受來自訪問者的調(diào)用,該算法結(jié)合先序遍歷的思想,從根節(jié)點(diǎn)開始向訪問者傳入節(jié)點(diǎn)對象,而訪問者則反過來執(zhí)行基于該節(jié)點(diǎn)對象的操作,提取函數(shù)關(guān)鍵信息列表。

    3.2.3 語句結(jié)構(gòu)分析

    (1)分支調(diào)用關(guān)系

    語法中的分支結(jié)構(gòu)大致分為三種:缺省型、標(biāo)準(zhǔn)型和多分支型。對應(yīng)的關(guān)系模型如表2所示。

    (2)循環(huán)調(diào)用關(guān)系

    常用的循環(huán)控制關(guān)鍵字包括while、for等,且循環(huán)控制流結(jié)構(gòu)相似。對應(yīng)的關(guān)系模型如表3所示。

    表3 循環(huán)語法結(jié)構(gòu)-關(guān)系模型

    這種語法與if-else 的結(jié)構(gòu)類似,結(jié)合Z 路徑覆蓋思想,采用二分支結(jié)構(gòu),兩個分支分別為執(zhí)行循環(huán)體和不執(zhí)行循環(huán)體。

    3.2.4 函數(shù)調(diào)用關(guān)系模型的建立

    以算法1的輸出作為輸入,即以關(guān)鍵信息列表Key-InfoList為輸入,構(gòu)建局部調(diào)用關(guān)系模型,再將局部關(guān)系模型以一定規(guī)則組合為全局函數(shù)調(diào)用關(guān)系模型。

    步驟1遍歷關(guān)鍵信息列表中的每一個元素,判斷元素類型,執(zhí)行相應(yīng)操作。

    步驟2如果元素是第一個節(jié)點(diǎn),則創(chuàng)建新的空函數(shù)調(diào)用關(guān)系模型;如果元素是分支或循環(huán)的開始或結(jié)束標(biāo)記,如if、while 和for 等關(guān)鍵字,根據(jù)函數(shù)調(diào)用關(guān)系模型構(gòu)建原理,向左插入子模型;如果元素是其他分支標(biāo)記,如elif、else等關(guān)鍵字,則向右插入子模型,表分支調(diào)用。得到局部調(diào)用關(guān)系模型。

    步驟3遍歷局部模型獲取標(biāo)識為Begin 的作為程序入口點(diǎn)。

    步驟4從入口點(diǎn)開始,將每一個函數(shù)的調(diào)用關(guān)系模型依次插入到全局的函數(shù)調(diào)用關(guān)系模型中,插入的模型的葉節(jié)點(diǎn)的左孩子指向被替代的那個函數(shù)的左孩子。

    步驟5遍歷全局函數(shù)調(diào)用關(guān)系模型,獲得全局函數(shù)調(diào)用路徑集合。

    具體算法描述如下:

    算法2全局函數(shù)調(diào)用關(guān)系模型建立算法

    輸入:關(guān)鍵信息列表KeyInfoList

    輸出:全局調(diào)用關(guān)系模型GlobalModel

    變量:entryModel:程序入口模型

    ModelList:局部調(diào)用關(guān)系模型

    1.Begin

    2.FOR i<-0 to KeyInfoList.length DO

    3.flag<-FALSE

    4.list<-KeyInfoLis(ti)

    5.FOR j<-0 to list.length DO

    6.IF lis(tj).index()==0 THEN

    7.model<-createMode(l“Begin”)

    8.ENDIF

    9.//如果是第一個節(jié)點(diǎn),則創(chuàng)建節(jié)點(diǎn)

    10.IF lis(tj)==“elif”or lis(tj)==“else”THEN

    11.flag<-TRUE //標(biāo)識置真

    12.ENDIF //如果節(jié)點(diǎn)類型是分支關(guān)鍵字

    13.IF lis(tj).index()==list.length THEN

    14.model.insertLef(t“END”)

    15.ENDIF

    16.IF flag==FALSE THEN

    17.model.insertLef(tlis(tj))

    18.ELSE model.insertRigh(tlis(tj))

    19.ENDIF

    20.ENDFOR

    21.IF i==0 TNEN

    22.entryModel<-model

    23.ELSE ModelList<-ModelList+model

    24.ENDFOR

    25.FOR i<-0 to entryModel.length DO

    26.value<-entryMode(li)

    27.FOR j<-0 to ModelList DO

    28.model<-ModelLis(tj)

    29.IF model.containsHead(value) THEN

    30.value.data<-model.data;

    31.model.leaf<-value.subMode(l);

    32.value.leftchild<-model.leftchild;

    33.ENDIF

    34.ENDFOR

    35.GlobalModel<-GlobalModel+entryModel;

    36.ENDFOR

    37.END

    4 符號化執(zhí)行

    4.1 輸入變量與控制變量的影響關(guān)系

    由于不是所有控制條件中的變量都能直接作為測試用例輸入程序,因此需要分析控制變量與輸入變量之間的關(guān)系,本文利用信息流規(guī)則對信息流進(jìn)行分析。

    目前針對高級語言中賦值語句、條件語句、循環(huán)語句等信息流規(guī)則較為簡單,因此提出一種擴(kuò)展的語句信息流規(guī)則,具體定義如下:

    (1)賦值語句

    規(guī)則1v1=v2;則有<v2→v1,v1=v2>。

    規(guī)則2v1=v2op,…,opvn;op代表運(yùn)算符,則有<v2→v1,v1=v2op,…,opvn >,…, <v2→v1,v1=v2op,…,opvn >。

    規(guī)則3v0--,--v0,v0++,++v0;則有<v0→v0;v0=v0+1>。

    規(guī)則4v0op=v1;則 有<v0→v0∧v1→v0;v0=v0opv1>。

    規(guī)則 5v0op0=v1op1…vi opi…opn-1vn(1 ≤i≤n);則有<v0→v0∧v1→v0∧…∧vi→v0∧…∧vn→v0;v0=v0op0(v1op1…vi opi…opn-1vn)>。

    (2)函數(shù)調(diào)用語句

    規(guī)則6v1=F(x),x為變量或表達(dá)式;則有<x→R(R為F(x)的返回值集合),R→v1,F(x)前置條件→F(x)后置條件;v1=R >。

    規(guī)則7v1=F(x1,x2,…,xn)(1 ≤i≤n),xi為變量或表達(dá)式;則有<xi→R(R為F(x)的返回值集合),R→v1,F(x1,x2,…,xn)前置條件 →F(x1,x2,…,xn)后置條件>。

    (3)控制語句

    規(guī)則8if/while(v0op0vc0…opi vci)v1=n(n為常量,1 ≤i,vc代表常量或變量);則有<v0→<v0→v1,vc0→v1,…,vci→v1;(v0op0vc0…opi vci)→ (v1=v2)>。

    規(guī)則9if/while(F(x)op0vc0…opi vci)v1=n(n為常量,1 ≤i,vc代表常量或變量);則有<x→R(R為F(x)的返回值集合),R→v1,vc0→v1,…,vci→v1;(v0op0vc0…opi vci)→ (v1=n)>。

    根據(jù)上述信息流規(guī)則分析得到兩個變量之間的關(guān)系并進(jìn)行組合,得到控制流影響關(guān)系樹,每棵樹的根節(jié)點(diǎn)都是輸入變量,葉子節(jié)點(diǎn)是要分析的控制變量。具體算法如下:

    算法3控制變量與輸入變量關(guān)系分析算法

    輸入:源代碼

    輸出:控制變量與輸入變量之間的關(guān)系表達(dá)式

    變量:inputList:輸入變量集合

    controlList:控制變量集合

    relationList:變量之間的關(guān)系集合

    relation:輸入變量與控制變量之間的關(guān)系

    1.Begin

    2./*讀取Python源代碼,分析得到輸入變量集合、控

    3.制變量集合,依據(jù)信息流規(guī)則分析變量的關(guān)系*/

    4.FOR i<-controlList.size()-1 to 0 DO

    5.//如果該變量已分析過,則跳出

    6.IF controlList.ge(ti)THEN break;

    7.END IF

    8.//如果待分析變量是輸入變量,則繼續(xù)循環(huán)

    9.IF controlList.get(i) in inputListTHEN continue;

    10.END IF

    11.FOR j<-relationList.size()-1 to 0 DO

    12./*如果待分析變量是關(guān)系樹的子節(jié)點(diǎn),將此關(guān)

    13.系樹加入到此變量的關(guān)系樹集合中*/

    14.IF controlList.ge(ti)is relationList.childnode

    15.THENrelation=combine(relation,relationList.ge(ti))

    16.END IF

    17.ENDFOR

    18.print relation

    19.ENDFOR

    20.END

    遍歷每棵控制流影響樹:從葉子節(jié)點(diǎn)開始,自底向上廣度優(yōu)先遍歷,將路徑上的關(guān)系表達(dá)式以圖3所示遞推公式鏈的形式組合輸出,得到控制變量與輸入變量的關(guān)系鏈。

    圖3 遞推公式鏈

    4.2 變量符號化

    以圖4中源代碼為例,根據(jù)算法1、算法2可得到圖5所示函數(shù)調(diào)用路徑圖。

    圖4 示例代碼

    圖5 函數(shù)調(diào)用路徑圖

    根據(jù)算法3 生成控制變量與輸入變量的遞推公式鏈,得到控制變量與輸入變量之間的關(guān)系表達(dá)式集合。

    分析源代碼得到輸入變量集合,為每一個輸入變量設(shè)置符號值,推導(dǎo)出控制變量的符號表達(dá)式。分析結(jié)果如表4所示。

    表4 變量符號化結(jié)果

    利用函數(shù)調(diào)用關(guān)系模型和控制流分析得到圖6 所示程序的符號執(zhí)行樹,符號執(zhí)行樹的葉子節(jié)點(diǎn)為程序函數(shù)調(diào)用路徑對應(yīng)的符號表達(dá)式。

    圖6 符號執(zhí)行樹

    4.3 約束求解

    采用深度優(yōu)先搜索算法(DFS)遍歷符號執(zhí)行樹,收集每條函數(shù)調(diào)用路徑對應(yīng)的符號表達(dá)式。利用SMT求解器對符號表達(dá)式進(jìn)行求解,SMT是一階邏輯表達(dá)式,其在編譯優(yōu)化,形式化驗(yàn)證都可以用到該模型理論,符號執(zhí)行測試中利用該模型理論對于收集的路徑約束組成的表達(dá)式求解,比如收集到a<b∧b-5=c路徑條件下的一組表達(dá)式進(jìn)行SMT 求解,根據(jù)其理論模型會就計(jì)算出一組值{a=5,b=10,c=5},這組解即為一組測試用例數(shù)據(jù)。SMT求解器從輸入到輸出的執(zhí)行流程如圖7所示。

    圖7 SMT約束求解執(zhí)行流程

    微軟的Z3 求解器能夠滿足幾乎所有求解理論,求解范圍更廣,對于復(fù)雜程序下的非線性約束表達(dá)式也有較好的表現(xiàn),因此選用Z3 求解器對符號表達(dá)式進(jìn)行求解,得到對應(yīng)的測試用例集合。

    4.4 冗余路徑剪枝

    在程序分析過程中有些路徑是冗余的,冗余路徑剪枝可以簡化路徑空間,提高分析效率,總結(jié)出以下兩種路徑可對其進(jìn)行剪枝處理:

    (1)如果兩條路徑到達(dá)同一個程序點(diǎn),并且到達(dá)該程序點(diǎn)的約束集相同,則可以對其中一條進(jìn)行剪枝。

    (2)對每條路徑的約束信息進(jìn)行可滿足性判定,如果該約束是不可滿足的,則意味著不存在能驅(qū)動該路徑具體執(zhí)行的測試用例,該路徑為冗余路徑,可以直接進(jìn)行剪枝。

    (3)圖8 左側(cè)為示例源代碼,右側(cè)是其對應(yīng)的函數(shù)調(diào)用路徑圖。以此為例,分析冗余路徑剪枝策略。

    圖8 示例程序?qū)?yīng)函數(shù)調(diào)用路徑圖

    由本文測試用例自動生成算法可得到3 條測試用例,將其作為程序輸入分別執(zhí)行程序,可得到每條測試用例對應(yīng)的函數(shù)實(shí)際執(zhí)行路徑,如表5所示。

    表5 測試用例執(zhí)行路徑

    以TC1為例,把a(bǔ)=2 作為程序輸入執(zhí)行程序,從語句粒度分析,將先后經(jīng)過源代碼第15、16、17、18、01、02、03、04、07、08、06、11、12、02、03、04、07、08、06、11、12行;從函數(shù)粒度分析,則先后經(jīng)過main、f1、f2、f4、f2、f4,故 函 數(shù) 的 實(shí) 際 執(zhí) 行 路 徑 為main→f1 →f2 →f4 →f2 →f4 。

    當(dāng) 0 <a≤3 即執(zhí)行測試用例a=2 時,程序?qū)嶋H執(zhí)行過程中函數(shù)間調(diào)用關(guān)系R0<a≤3={(main,f1),(f1,f2),(f2,f4)};當(dāng)a>3 即執(zhí)行測試用例a=4 時,函數(shù)間的調(diào)用關(guān)系Ra>3={(main,f1),(f1,f2),(f1,f3),(f2,f4)};當(dāng)“a≤0 ∪a不是整數(shù)”即執(zhí)行測試用例a=0 時,函數(shù)調(diào)用關(guān)系Ra≤0∪a不是整數(shù)={(main,f5)} ,分析可知R0<a≤3?Ra>3,即TC1 實(shí)際執(zhí)行路徑的函數(shù)調(diào)用關(guān)系集合是TC2 實(shí)際執(zhí)行路徑的函數(shù)調(diào)用關(guān)系集合的子集,同時TC1實(shí)際執(zhí)行路徑中包含的函數(shù)集合也是TC2 的子集。因此在函數(shù)級別TC2包含TC1,表6進(jìn)一步分析TC1、TC2的語句覆蓋情況,1表示語句被覆蓋,0表示未被覆蓋。

    根據(jù)表6 可知,TC2 的語句覆蓋集包含TC1 的語句覆蓋集,因此在語句粒度TC2 可以完全囊括TC1 的執(zhí)行語句,故TC1 對應(yīng)的路徑在此例中為冗余路徑,進(jìn)行剪枝。

    表6 語句覆蓋情況

    如若將此段代碼修改為圖9所示,則TC1執(zhí)行語句集合中的09 行無法被TC2 囊括,此時不能對TC1 對應(yīng)的路徑進(jìn)行剪枝操作。

    圖9 變更后示例程序

    5 實(shí)驗(yàn)分析

    評測方法主要通過兩個實(shí)驗(yàn)進(jìn)行驗(yàn)證,實(shí)驗(yàn)1 從github 下載(https://github.com/tianxy0621/TT.git)五個不同規(guī)模、內(nèi)含多種語法結(jié)構(gòu)的Python 實(shí)例源代碼:_color.py、_pycallgraph.py、_config.py、_tracer.py、_memory_profiler.py。

    以此作為數(shù)據(jù)集并用本文的算法分別進(jìn)行實(shí)驗(yàn),自動生成程序的測試用例集合,分析隨程序規(guī)模的擴(kuò)大,覆蓋率、效率等因素的變化。實(shí)驗(yàn)2 采用同實(shí)驗(yàn)1 的數(shù)據(jù)集,將本文算法生成的函數(shù)調(diào)用路徑數(shù)與傳統(tǒng)符號執(zhí)行算法路徑條數(shù)進(jìn)行比較,并分析其原因。

    表7 實(shí)驗(yàn)1對比結(jié)果

    表8 實(shí)驗(yàn)2對比結(jié)果

    5.1 實(shí)驗(yàn)1

    為了計(jì)算測試用例自動生成工具生成的測試用例覆蓋率,使用插裝技術(shù)計(jì)算被測程序動態(tài)執(zhí)行的路徑條數(shù),將生成的測試用例作為程序的輸入,動態(tài)獲得執(zhí)行的函數(shù)調(diào)用路徑,根據(jù)覆蓋率公式:

    計(jì)算本文算法對于不同規(guī)模程序的覆蓋率,結(jié)果如圖10所示。

    圖10 覆蓋率變化趨勢圖

    實(shí)驗(yàn)中執(zhí)行時間、函數(shù)調(diào)用路徑條數(shù)以及測試用例個數(shù)等其他指標(biāo)數(shù)據(jù)的綜合比較如表7所示。

    從表7 中數(shù)據(jù)可以看出隨程序規(guī)模的增加函數(shù)調(diào)用路徑條數(shù)增加,同時生成的測試用例個數(shù)也隨之增加。

    結(jié)合圖10可以看出,當(dāng)源程序規(guī)模較大時,可以保證較高的覆蓋率和效率,但相比小規(guī)模的程序,覆蓋率有所下降,原因主要有兩點(diǎn):一是程序中可能存在不可達(dá)路徑,導(dǎo)致動態(tài)執(zhí)行路徑小于函數(shù)調(diào)用路徑數(shù);另一個可能的原因是設(shè)計(jì)的信息流規(guī)則考慮不夠充分,使得對復(fù)雜語句結(jié)構(gòu)的分析不夠準(zhǔn)確。因此下一步研究工作是分析不可達(dá)路徑以及完善程序信息流分析算法。

    5.2 實(shí)驗(yàn)2

    實(shí)驗(yàn)2 數(shù)據(jù)集與實(shí)驗(yàn)1 相同,利用本文算法與傳統(tǒng)符號執(zhí)行算法生成的路徑條數(shù)進(jìn)行比較,實(shí)驗(yàn)結(jié)果如圖11、表8所示。

    圖11 傳統(tǒng)算法對比結(jié)果

    基于函數(shù)調(diào)用路徑的符號執(zhí)行算法首先構(gòu)建函數(shù)調(diào)用關(guān)系模型,從函數(shù)角度出發(fā)分析程序,并生成函數(shù)粒度的符號執(zhí)行樹,利用符號執(zhí)行技術(shù)求解測試用例。

    最終結(jié)果表明,相比于傳統(tǒng)符號執(zhí)行算法,該方法有效縮減了路徑條數(shù),減少了生成的測試用例個數(shù)。

    6 結(jié)束語

    測試用例自動生成技術(shù)目前仍然是軟件測試自動化的重點(diǎn)研究內(nèi)容,用最少的測試用例達(dá)到更高的覆蓋率并找到最多的錯誤是軟件測試的目標(biāo)。本文利用函數(shù)調(diào)用路徑對符號執(zhí)行進(jìn)行優(yōu)化,通過提取字節(jié)碼序列和抽象語法樹中的關(guān)鍵信息得到函數(shù)調(diào)用路徑圖,將其與符號執(zhí)行技術(shù)相結(jié)合,約束求解生成程序的測試用例集合。

    此方法將分析粒度提升至函數(shù),減少路徑數(shù)以及約束表達(dá)式的數(shù)量,一定程度上解決符號執(zhí)行的路徑爆炸問題。從實(shí)驗(yàn)結(jié)果可知,本文方法相比較于傳統(tǒng)方法,可在不降低覆蓋率的條件下,有效減少測試用例條數(shù)從而提高測試效率。

    猜你喜歡
    函數(shù)調(diào)用測試用例程序
    基于C語言的數(shù)學(xué)菜單的設(shè)計(jì)與實(shí)現(xiàn)
    基于SmartUnit的安全通信系統(tǒng)單元測試用例自動生成
    試論我國未決羈押程序的立法完善
    基于混合遺傳算法的回歸測試用例集最小化研究
    基于函數(shù)調(diào)用序列模式和函數(shù)調(diào)用圖的程序缺陷檢測方法*
    探討C++編程中避免代碼冗余的技巧
    “程序猿”的生活什么樣
    英國與歐盟正式啟動“離婚”程序程序
    Unity3D項(xiàng)目腳本優(yōu)化分析與研究
    中國新通信(2017年1期)2017-03-08 03:12:21
    創(chuàng)衛(wèi)暗訪程序有待改進(jìn)
    免费不卡的大黄色大毛片视频在线观看| 欧美xxxx黑人xx丫x性爽| 麻豆乱淫一区二区| 国产日韩欧美在线精品| 国产黄片美女视频| av免费观看日本| 亚洲最大成人av| 99久国产av精品国产电影| 久久久久久久大尺度免费视频| 另类亚洲欧美激情| 汤姆久久久久久久影院中文字幕| 偷拍熟女少妇极品色| 国产黄色视频一区二区在线观看| 成年女人在线观看亚洲视频 | 国产高清有码在线观看视频| 特大巨黑吊av在线直播| www.av在线官网国产| 自拍偷自拍亚洲精品老妇| 国产精品人妻久久久影院| videossex国产| 特大巨黑吊av在线直播| 久久女婷五月综合色啪小说 | 韩国av在线不卡| 国产淫语在线视频| 国产乱人视频| 色吧在线观看| 成人无遮挡网站| 中文字幕免费在线视频6| 欧美激情国产日韩精品一区| 2021天堂中文幕一二区在线观| 国产一区二区亚洲精品在线观看| 精品一区二区三区视频在线| a级一级毛片免费在线观看| 亚洲av日韩在线播放| 日韩大片免费观看网站| 精品久久久精品久久久| 夜夜爽夜夜爽视频| 欧美三级亚洲精品| 日韩三级伦理在线观看| 18禁裸乳无遮挡免费网站照片| 伊人久久国产一区二区| 成年女人看的毛片在线观看| 国产欧美另类精品又又久久亚洲欧美| 久久久久精品性色| 黄色欧美视频在线观看| 久久久亚洲精品成人影院| 大片电影免费在线观看免费| 亚洲人与动物交配视频| 国产午夜精品一二区理论片| 久久99精品国语久久久| 久久99热这里只频精品6学生| 啦啦啦啦在线视频资源| 伦精品一区二区三区| 久久99精品国语久久久| 亚洲aⅴ乱码一区二区在线播放| 美女视频免费永久观看网站| 白带黄色成豆腐渣| 日韩制服骚丝袜av| 亚洲最大成人手机在线| 人妻 亚洲 视频| 男的添女的下面高潮视频| 国产国拍精品亚洲av在线观看| 久久热精品热| 色视频在线一区二区三区| 成年免费大片在线观看| 色综合色国产| 中国三级夫妇交换| 国产精品一区www在线观看| 青春草视频在线免费观看| 我的老师免费观看完整版| 亚洲国产欧美在线一区| 一本一本综合久久| 少妇的逼水好多| 中文字幕av成人在线电影| 亚洲国产欧美人成| 日韩一区二区三区影片| 免费大片黄手机在线观看| 黄片wwwwww| 免费观看无遮挡的男女| 乱码一卡2卡4卡精品| 国产老妇女一区| 日日撸夜夜添| 下体分泌物呈黄色| 色5月婷婷丁香| 五月伊人婷婷丁香| 最后的刺客免费高清国语| 国产大屁股一区二区在线视频| 插逼视频在线观看| 日本猛色少妇xxxxx猛交久久| 人妻少妇偷人精品九色| 国产精品99久久久久久久久| 草草在线视频免费看| 嫩草影院入口| 大又大粗又爽又黄少妇毛片口| 国产永久视频网站| 日韩强制内射视频| 人妻系列 视频| 91狼人影院| 欧美日韩视频精品一区| 午夜老司机福利剧场| 老女人水多毛片| 日本-黄色视频高清免费观看| xxx大片免费视频| 国产精品久久久久久精品电影小说 | 亚洲欧美日韩卡通动漫| 九九爱精品视频在线观看| 成人亚洲精品一区在线观看 | 久久精品综合一区二区三区| 热re99久久精品国产66热6| 在线精品无人区一区二区三 | 91久久精品国产一区二区成人| 高清在线视频一区二区三区| 国内少妇人妻偷人精品xxx网站| 久久久久久国产a免费观看| 亚洲精品成人av观看孕妇| 尾随美女入室| 少妇被粗大猛烈的视频| 高清欧美精品videossex| 可以在线观看毛片的网站| 欧美精品一区二区大全| 搡老乐熟女国产| 成人鲁丝片一二三区免费| 亚洲欧美日韩东京热| 26uuu在线亚洲综合色| 卡戴珊不雅视频在线播放| 精品亚洲乱码少妇综合久久| 91午夜精品亚洲一区二区三区| 一级毛片电影观看| 国产一级毛片在线| 国产精品久久久久久久电影| 精品午夜福利在线看| 最近2019中文字幕mv第一页| 成人亚洲精品一区在线观看 | 国产精品精品国产色婷婷| 国产精品久久久久久精品古装| 高清视频免费观看一区二区| 久久久久久伊人网av| 男人和女人高潮做爰伦理| 国产成人精品一,二区| 天堂中文最新版在线下载 | 国产免费又黄又爽又色| 91aial.com中文字幕在线观看| 69av精品久久久久久| 97在线人人人人妻| 麻豆久久精品国产亚洲av| 在线观看国产h片| 香蕉精品网在线| 精品国产露脸久久av麻豆| 亚洲欧洲日产国产| 99热这里只有精品一区| 日韩欧美 国产精品| 久久综合国产亚洲精品| 观看免费一级毛片| 国产亚洲5aaaaa淫片| 久久97久久精品| 高清在线视频一区二区三区| 一区二区三区精品91| 69av精品久久久久久| 亚洲在线观看片| 91午夜精品亚洲一区二区三区| 国产黄片视频在线免费观看| av黄色大香蕉| 欧美日韩在线观看h| 嫩草影院入口| 午夜视频国产福利| 国产伦精品一区二区三区视频9| 禁无遮挡网站| 一个人看视频在线观看www免费| 草草在线视频免费看| 国产精品久久久久久精品电影小说 | h日本视频在线播放| 欧美精品国产亚洲| 亚洲av不卡在线观看| 九九在线视频观看精品| 一级毛片久久久久久久久女| 成人美女网站在线观看视频| 精品久久久久久久久亚洲| 一级毛片我不卡| 久久这里有精品视频免费| 自拍偷自拍亚洲精品老妇| videossex国产| 国产在线男女| 久久久久久伊人网av| 51国产日韩欧美| 亚洲欧美日韩东京热| 国产成人免费观看mmmm| 免费看av在线观看网站| 国产精品久久久久久久电影| 国精品久久久久久国模美| 新久久久久国产一级毛片| 永久免费av网站大全| 在线观看美女被高潮喷水网站| 精品亚洲乱码少妇综合久久| 国产 一区精品| 一区二区三区乱码不卡18| 可以在线观看毛片的网站| 91aial.com中文字幕在线观看| videossex国产| 久热这里只有精品99| 亚洲成人精品中文字幕电影| 插阴视频在线观看视频| 精品少妇黑人巨大在线播放| 亚洲第一区二区三区不卡| 久久久精品欧美日韩精品| 欧美成人午夜免费资源| 夜夜看夜夜爽夜夜摸| 99re6热这里在线精品视频| 国产片特级美女逼逼视频| 一级黄片播放器| 国产一区有黄有色的免费视频| 欧美激情久久久久久爽电影| 国产精品成人在线| 久久久久久久午夜电影| 91在线精品国自产拍蜜月| 成人鲁丝片一二三区免费| 熟女av电影| 国产女主播在线喷水免费视频网站| 美女主播在线视频| 青春草亚洲视频在线观看| 亚洲最大成人手机在线| 成年av动漫网址| 黄色一级大片看看| 国产黄频视频在线观看| 深爱激情五月婷婷| 亚洲在线观看片| 只有这里有精品99| 久久韩国三级中文字幕| 亚洲无线观看免费| 国产av不卡久久| 久久久久久久大尺度免费视频| 中文天堂在线官网| 午夜福利视频1000在线观看| 色综合色国产| 中国国产av一级| 涩涩av久久男人的天堂| 日本色播在线视频| 午夜爱爱视频在线播放| 一级毛片黄色毛片免费观看视频| 亚洲最大成人av| 国产日韩欧美亚洲二区| av免费观看日本| 乱系列少妇在线播放| 亚洲经典国产精华液单| 亚洲av一区综合| 在线观看人妻少妇| 日日啪夜夜撸| 乱系列少妇在线播放| 三级经典国产精品| 久久影院123| 精品久久久噜噜| 国产 一区精品| 好男人在线观看高清免费视频| 日韩国内少妇激情av| 国产精品三级大全| 又黄又爽又刺激的免费视频.| 国产精品无大码| 在线 av 中文字幕| 九九在线视频观看精品| 亚洲高清免费不卡视频| 免费看光身美女| 日本猛色少妇xxxxx猛交久久| 日本三级黄在线观看| 久久99蜜桃精品久久| 在现免费观看毛片| 一个人看视频在线观看www免费| 亚洲国产av新网站| 水蜜桃什么品种好| 日韩av不卡免费在线播放| 国产精品蜜桃在线观看| 熟女av电影| 午夜日本视频在线| 日本av手机在线免费观看| 夜夜爽夜夜爽视频| 国产伦精品一区二区三区视频9| 欧美精品国产亚洲| 晚上一个人看的免费电影| 白带黄色成豆腐渣| 天美传媒精品一区二区| 国产探花在线观看一区二区| 久久久久精品久久久久真实原创| 少妇 在线观看| 波野结衣二区三区在线| 欧美少妇被猛烈插入视频| 免费黄网站久久成人精品| 寂寞人妻少妇视频99o| 亚洲av一区综合| 国产探花在线观看一区二区| 中国三级夫妇交换| 欧美高清性xxxxhd video| 婷婷色麻豆天堂久久| 婷婷色综合www| 看免费成人av毛片| 青春草亚洲视频在线观看| 伊人久久国产一区二区| 亚洲成人中文字幕在线播放| 建设人人有责人人尽责人人享有的 | 国产乱来视频区| 波野结衣二区三区在线| 毛片一级片免费看久久久久| 人妻制服诱惑在线中文字幕| 久久综合国产亚洲精品| 午夜免费男女啪啪视频观看| 有码 亚洲区| 又黄又爽又刺激的免费视频.| 欧美bdsm另类| 国产一级毛片在线| 国产精品福利在线免费观看| 韩国av在线不卡| 国产老妇女一区| 最近中文字幕高清免费大全6| 亚洲av中文字字幕乱码综合| 亚洲国产欧美人成| 欧美97在线视频| 国产成人91sexporn| 国产一级毛片在线| 哪个播放器可以免费观看大片| 51国产日韩欧美| 国产精品久久久久久久电影| 欧美日韩国产mv在线观看视频 | 精品久久久久久久久亚洲| 狂野欧美白嫩少妇大欣赏| 免费观看在线日韩| 性色avwww在线观看| 九草在线视频观看| 久久精品久久精品一区二区三区| 中文资源天堂在线| 搡老乐熟女国产| 大又大粗又爽又黄少妇毛片口| 亚洲综合色惰| 久久精品国产鲁丝片午夜精品| 成人黄色视频免费在线看| 少妇人妻精品综合一区二区| 国产乱人视频| 国产成人aa在线观看| av.在线天堂| 六月丁香七月| h日本视频在线播放| 校园人妻丝袜中文字幕| 欧美人与善性xxx| 激情五月婷婷亚洲| 国产在线男女| 欧美少妇被猛烈插入视频| 日韩电影二区| 国产黄a三级三级三级人| 亚洲人成网站高清观看| 日韩大片免费观看网站| 国产大屁股一区二区在线视频| 26uuu在线亚洲综合色| 又爽又黄无遮挡网站| 2022亚洲国产成人精品| 久久人人爽人人片av| 欧美精品人与动牲交sv欧美| 熟女人妻精品中文字幕| 22中文网久久字幕| 亚洲欧美一区二区三区国产| 男女啪啪激烈高潮av片| 一级黄片播放器| 22中文网久久字幕| 99热全是精品| 久久99蜜桃精品久久| 一级黄片播放器| 日日啪夜夜撸| 天堂俺去俺来也www色官网| 国产女主播在线喷水免费视频网站| 禁无遮挡网站| 日本黄大片高清| 春色校园在线视频观看| 国产午夜福利久久久久久| 久久久久九九精品影院| 欧美日韩一区二区视频在线观看视频在线 | 亚洲精品456在线播放app| 一区二区三区精品91| 少妇熟女欧美另类| 只有这里有精品99| 免费看av在线观看网站| av免费观看日本| 亚洲成人一二三区av| 自拍偷自拍亚洲精品老妇| 99热全是精品| 少妇人妻一区二区三区视频| 久热久热在线精品观看| 欧美bdsm另类| 涩涩av久久男人的天堂| 一本色道久久久久久精品综合| videos熟女内射| 亚洲av.av天堂| 国产色爽女视频免费观看| 国产成人免费观看mmmm| 国产精品麻豆人妻色哟哟久久| 成人国产av品久久久| 下体分泌物呈黄色| 国内少妇人妻偷人精品xxx网站| 黄色视频在线播放观看不卡| 亚洲av欧美aⅴ国产| 在线免费十八禁| 成人毛片a级毛片在线播放| 男人爽女人下面视频在线观看| av在线蜜桃| 五月天丁香电影| 男的添女的下面高潮视频| 丝袜脚勾引网站| 男女啪啪激烈高潮av片| 亚洲成人一二三区av| 日韩中字成人| 直男gayav资源| 少妇人妻久久综合中文| 99热这里只有是精品50| 麻豆国产97在线/欧美| 99久久精品一区二区三区| 国产一区二区亚洲精品在线观看| kizo精华| av国产精品久久久久影院| 国产成人精品福利久久| 久久久久九九精品影院| av网站免费在线观看视频| 亚洲精品成人av观看孕妇| 国产亚洲5aaaaa淫片| 久久精品久久久久久久性| 国产精品无大码| 国产v大片淫在线免费观看| 少妇被粗大猛烈的视频| 日日啪夜夜爽| 国产男人的电影天堂91| 波多野结衣巨乳人妻| 国产视频首页在线观看| 99re6热这里在线精品视频| 亚洲国产精品成人综合色| 成人亚洲精品一区在线观看 | 亚洲人与动物交配视频| 欧美日韩视频精品一区| 亚洲不卡免费看| 亚洲综合色惰| 成人欧美大片| 欧美性感艳星| 国产精品.久久久| 能在线免费看毛片的网站| 亚洲欧美精品自产自拍| 狂野欧美激情性bbbbbb| 亚洲自拍偷在线| 亚洲国产成人一精品久久久| 丰满人妻一区二区三区视频av| 免费少妇av软件| 精品久久久久久久久av| 欧美高清成人免费视频www| 一级毛片久久久久久久久女| .国产精品久久| 国产精品熟女久久久久浪| 欧美精品一区二区大全| 国产精品一二三区在线看| 亚洲熟女精品中文字幕| 精品人妻一区二区三区麻豆| 久久人人爽人人爽人人片va| 亚洲性久久影院| 国产av国产精品国产| .国产精品久久| 久久久色成人| 亚洲一区二区三区欧美精品 | 亚洲av免费在线观看| 青春草视频在线免费观看| 久久影院123| 人妻制服诱惑在线中文字幕| 免费观看的影片在线观看| 男的添女的下面高潮视频| 国产精品一二三区在线看| 免费播放大片免费观看视频在线观看| 最近最新中文字幕大全电影3| 亚洲国产欧美人成| 久久鲁丝午夜福利片| 美女内射精品一级片tv| 三级国产精品欧美在线观看| 少妇人妻精品综合一区二区| 国产一区二区三区av在线| 国产在线一区二区三区精| 午夜激情久久久久久久| 亚洲性久久影院| 亚洲精品影视一区二区三区av| 亚洲av日韩在线播放| 午夜激情福利司机影院| 看非洲黑人一级黄片| 老师上课跳d突然被开到最大视频| 亚洲av福利一区| 国产精品国产av在线观看| 午夜免费鲁丝| 国产老妇女一区| 狂野欧美激情性bbbbbb| 最新中文字幕久久久久| 在线观看一区二区三区激情| 国产高清国产精品国产三级 | 国产精品久久久久久精品电影| 久久精品熟女亚洲av麻豆精品| 久久影院123| 波野结衣二区三区在线| 日韩 亚洲 欧美在线| av免费观看日本| 日本一本二区三区精品| 18禁在线播放成人免费| 免费av不卡在线播放| 久久久久网色| 91aial.com中文字幕在线观看| 国产久久久一区二区三区| xxx大片免费视频| 91精品一卡2卡3卡4卡| 美女内射精品一级片tv| 男女边摸边吃奶| 特大巨黑吊av在线直播| 国产成年人精品一区二区| 亚洲精华国产精华液的使用体验| 亚洲国产精品成人综合色| 1000部很黄的大片| 又爽又黄无遮挡网站| 日韩大片免费观看网站| 日日摸夜夜添夜夜添av毛片| 亚洲婷婷狠狠爱综合网| 亚洲一区二区三区欧美精品 | 777米奇影视久久| 国产精品不卡视频一区二区| 美女内射精品一级片tv| 亚洲一区二区三区欧美精品 | 亚洲国产欧美人成| 白带黄色成豆腐渣| 国产美女午夜福利| 免费播放大片免费观看视频在线观看| 秋霞伦理黄片| 69av精品久久久久久| 欧美xxⅹ黑人| 欧美丝袜亚洲另类| 色吧在线观看| 国产精品不卡视频一区二区| 性色avwww在线观看| 亚洲真实伦在线观看| 国产在线一区二区三区精| av一本久久久久| 波野结衣二区三区在线| 久久人人爽人人片av| 国产精品久久久久久精品电影| 免费看不卡的av| 亚洲精品影视一区二区三区av| 男女啪啪激烈高潮av片| 精品亚洲乱码少妇综合久久| 激情五月婷婷亚洲| 亚洲成人av在线免费| 欧美xxxx性猛交bbbb| 看非洲黑人一级黄片| 国产欧美日韩精品一区二区| 女人十人毛片免费观看3o分钟| 91久久精品电影网| 成人亚洲精品av一区二区| 国产男人的电影天堂91| 国产毛片a区久久久久| 中文乱码字字幕精品一区二区三区| 精华霜和精华液先用哪个| av在线老鸭窝| 久久99热这里只频精品6学生| av在线蜜桃| 久久久久久久国产电影| 一级a做视频免费观看| 亚洲经典国产精华液单| 最近的中文字幕免费完整| www.色视频.com| 欧美老熟妇乱子伦牲交| 性色avwww在线观看| 国产午夜精品久久久久久一区二区三区| 国产精品麻豆人妻色哟哟久久| 嫩草影院新地址| 大话2 男鬼变身卡| 香蕉精品网在线| 久久人人爽人人爽人人片va| 亚洲色图av天堂| 少妇熟女欧美另类| 18禁裸乳无遮挡动漫免费视频 | 精品久久久精品久久久| 亚洲真实伦在线观看| 99热这里只有是精品50| 女人十人毛片免费观看3o分钟| 天天躁夜夜躁狠狠久久av| 内地一区二区视频在线| 国产高清国产精品国产三级 | 午夜激情久久久久久久| 三级经典国产精品| 少妇 在线观看| 日韩大片免费观看网站| 日韩,欧美,国产一区二区三区| 成年人午夜在线观看视频| 一区二区av电影网| 午夜免费男女啪啪视频观看| 国产亚洲av嫩草精品影院| 精品人妻视频免费看| 欧美潮喷喷水| 丰满少妇做爰视频| 一区二区三区精品91| 成人综合一区亚洲| 国产成人a∨麻豆精品| 日韩av免费高清视频| 国产毛片a区久久久久| 亚洲欧美日韩另类电影网站 | 久久ye,这里只有精品| 日本-黄色视频高清免费观看| 国产欧美日韩一区二区三区在线 | 成人免费观看视频高清| 亚洲精品成人av观看孕妇| 爱豆传媒免费全集在线观看| 久久精品国产亚洲av涩爱| 老司机影院成人| 亚洲国产av新网站| 日韩成人伦理影院| 中文乱码字字幕精品一区二区三区| 国产精品秋霞免费鲁丝片| 91精品一卡2卡3卡4卡| 亚洲精品日本国产第一区| 成人国产麻豆网| 人妻一区二区av| 色婷婷久久久亚洲欧美| 日韩制服骚丝袜av| 亚洲在久久综合| 亚洲欧美日韩另类电影网站 |