版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第8章白盒測試技術(shù)軟件測試方法2軟件測試方法白盒測試靜態(tài)測試其他動態(tài)測試按是否運行系統(tǒng)劃分按是否查看源代碼劃分隨機測試黑盒測試冒煙測試回歸測試等價類劃分法錯誤推測法因果圖法邊界值分析法組合分析法手工測試自動化測試按是否使用自動化工具劃分邏輯覆蓋法基本路徑測試法白盒測試白盒測試,又稱為透明盒測試、結(jié)構(gòu)測試、邏輯驅(qū)動測試、基于代碼的測試,是為了證明軟件內(nèi)部操作和過程是否符合設(shè)計規(guī)格和要求。因此,需要詳細設(shè)計文檔作為白盒測試設(shè)計的輸入。白盒測試用例的設(shè)計要求:了解程序的內(nèi)部邏輯(詳細設(shè)計),并且,對程序的基本輸入輸出已經(jīng)了解。3白盒測試的任務(wù)對程序模塊的所有獨立的執(zhí)行路徑至少要測試一次;對邏輯判定,取真或假的兩種情況至少要測試一次;檢驗內(nèi)部數(shù)據(jù)結(jié)構(gòu)的有效性;對程序進行邊界檢查;檢測程序源代碼是否存在代碼級缺陷4一般采用以下白盒測試方法來滿足上述要求:邏輯覆蓋法基本路徑測試法基于數(shù)據(jù)流的測試基于缺陷模式的缺陷檢測基于變異的測試程序插樁法......5白盒測試用例生成一般處理流程6本章內(nèi)容邏輯覆蓋測試數(shù)據(jù)流測試變異測試其他白盒測試方法7控制流圖Euclid方法計算最大公約數(shù)8輸入x,yx>0&&y>0?x>y?x=x-yy=y-x輸出x+yYYNNvoidmain(){
intx,y;
scanf(“%d%d”,&x,&y);
while(x>0&&y>0){
if(x>y)x=x-y;
else
y=y-x;}printf(%d\n”,x+y);}控制流圖控制流圖為有向圖,由節(jié)點和邊組成。帶箭頭的有向邊表示控制流。矩形框表示一個計算處理過程。圓角矩形框表示輸入或輸出菱形框表示一個判定條件9輸入x,yx>0&&y>0?x>y?x=x-yy=y-x輸出x+yYYNN10輸入x,yx>0&&y>0?x>y?x=x-yy=y-x輸出x+yYYNN簡化的控制流圖控制流圖節(jié)點:表示程序的基本塊,對應(yīng)一條或多條語句;分支節(jié)點匯合節(jié)點邊:帶箭頭的有向邊表示控制流路徑完整路徑:起點為控制流圖起始點,終點為控制流圖退出點可行(達)完整路徑不可行(達)完整路徑11控制流圖邏輯覆蓋測試邏輯覆蓋法,是以程序內(nèi)部的邏輯結(jié)構(gòu)為基礎(chǔ)的測試用例設(shè)計方法。邏輯覆蓋法又細分為以下方法:語句覆蓋分支(判定)覆蓋原子謂詞覆蓋分支-謂詞覆蓋復(fù)合謂詞覆蓋路徑覆蓋......12邏輯覆蓋測試為統(tǒng)一介紹邏輯覆蓋測試的各種覆蓋準則,令:T為被測程序P的一個測試數(shù)據(jù)集GP為P的控制流圖LT為與T相對應(yīng)的GP中的完整路徑集合1314voidmain(){floata,b,c,x1,x2,mid;scanf(“%f,%f,%f”,&a,&b,&c);
if(a!=0){mid=b*b-4*a*c;
if(mid>0){x1=(-b+sqrt(mid))/(2*a);x2=(-b-sqrt(mid))/(2*a);printf(“tworealroots\n”);}else{if(mid==0){x1=-b/2*a;printf(“onerealroot\n”);}else{x1=-b/(2*a);x2=sqrt(-mid)/(2*a);
printf(“twocomplexroots\n”);}}printf(“x1=%f,x2=%f\n”,x1,x2);}}一元二次方程求根程序n0n1n3n4n5n6n7e0e1e2e3e4e5e6e7e9e10e11n2e8startend語句覆蓋準則語句覆蓋:通過測試用例的執(zhí)行,使被測程序的每個可執(zhí)行語句至少執(zhí)行一次。語句覆蓋測試覆蓋率可定義為:語句覆蓋率=(被執(zhí)行語句數(shù)量/所有語句數(shù)量)*100%語句測試的充分準則(語句覆蓋準則)可以定義為:測試數(shù)據(jù)集稱為語句覆蓋充分的,當且僅當LT覆蓋了GP中的所有節(jié)點。15n0n1n3n4n5n6n7e0e1e2e3e4e5e6e7e9e10e11n2e8startend語句覆蓋準則優(yōu)點:可以很直觀地從源代碼得到測試用例,無須細分每條判定表達式——測試用例的設(shè)計比較簡單。可執(zhí)行語句測試覆蓋率較高。缺點:這種方法僅測試能到達可執(zhí)行語句的條件,不測試其它條件,并且對于隱藏的條件是無法測試的——對條件的測試不全面;該方法不能準確地判斷條件中的邏輯關(guān)系錯誤,容易產(chǎn)生漏測的情況;語句覆蓋是最弱的邏輯覆蓋。16n0n1n3n4n5n6n7e0e1e2e3e4e5e6e7e9e10e11n2e8startend語句覆蓋準則對于求解一元二次方程的程序,選擇3個測試用例:{2、5、3}{1、2、1}{4、2、1}就能覆蓋所有的節(jié)點但不能保證a=0這條分支被測試17voidmain(){floata,b,c,x1,x2,mid;scanf(“%f,%f,%f”,&a,&b,&c);
if(a!=0){mid=b*b-4*a*c;
if(mid>0){x1=(-b+sqrt(mid))/(2*a);x2=(-b-sqrt(mid))/(2*a);printf(“tworealroots\n”);}else{if(mid==0){x1=-b/2*a;printf(“onerealroot\n”);}else{x1=-b/(2*a);x2=sqrt(-mid)/(2*a);
printf(“twocomplexroots\n”);}}printf(“x1=%f,x2=%f\n”,x1,x2);}}課堂練習一個函數(shù)代碼如下,請設(shè)計滿足語句覆蓋的測試用例18課堂練習一個函數(shù)代碼如下,請設(shè)計滿足語句覆蓋的測試用例19||&&錯寫成了||,你的測試用例能測出來嗎分支覆蓋準則分支覆蓋:要求在軟件測試中,每個分支都至少獲得一次“真”值和一次“假”值,也就是使程序中的每個取“真”分支和取“假”分支都至少經(jīng)歷一次。分支覆蓋也被稱為判定覆蓋。分支覆蓋測試的充分性準則可以定義為:測試數(shù)據(jù)集稱為語句覆蓋充分的,當且僅當LT覆蓋了GP中的所有有向邊。20n0n1n3n4n5n6n7e0e1e2e3e4e5e6e7e9e10e11n2e8startend分支覆蓋準則對于求解一元二次方程的程序,下面4個測試用例對分支覆蓋是充分的。21測試用例a,b,ca!=0mid>0mid==0測試用例12,5,3真真假測試用例21,2,1真假真測試用例34,2,1真假假測試用例40,2,1假----n0n1n3n4n5n6n7e0e1e2e3e4e5e6e7e9e10e11n2e8startend課堂練習一個函數(shù)代碼如下,請設(shè)計滿足分支覆蓋的測試用例22謂詞測試一個分支的條件由謂詞組成單個謂詞稱為原子謂詞例如a!=0、mid>0等都是原子謂詞原子謂詞通過邏輯運算符可以構(gòu)成復(fù)合謂詞常見的邏輯運算符包括“與”、“或”、“非”等23謂詞測試對于復(fù)合謂詞而言,分支測試不是有效的。例如對于復(fù)合謂詞構(gòu)成的條件語句:
if(math>=9||lang>=80||poli>=75)x=1;采用分支測試技術(shù),只要原子謂詞中的任何一個被滿足,則該分支即為真,而不管其它的兩個是否被滿足。謂詞測試包括:原子謂詞覆蓋準則分支-謂詞覆蓋準則復(fù)合謂詞覆蓋準則24短路判斷三角形類型程序25void
main()
{
inti,j,k,match;scanf(“%d%d%d”,&i,&j,&k);
if(i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=i)match=4;//不是三角形
elseif(i==j&&i==k)match=1;//等邊三角形
elseif(i==j||i==k||j==k)match=2;//等腰三角形
elsematch=3;//普通三角形printf(“match=%d\n”,match);}e6e0e1e2e3e4e5e7謂詞測試--原子謂詞覆蓋準則原子謂詞測試要求在軟件測試中,每個復(fù)合謂詞所包含的每一個原子謂詞都至少獲得一次“真”值和一次“假”值。原子謂詞覆蓋也被稱為條件覆蓋。原子謂詞覆蓋準則:如果對任意一個分支中的任意一個原子謂詞,測試數(shù)據(jù)集T中存在一個測試數(shù)據(jù)使其在運行時為真、為假至少各一次。26謂詞測試--原子謂詞覆蓋準則對于判斷三角形類型的程序,下面11個測試用例滿足原子謂詞覆蓋準則。27測試用例變量原子謂詞i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==ki<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k謂詞測試--原子謂詞覆蓋準則對于判斷三角形類型的程序,下面11個測試用例滿足原子謂詞覆蓋準則。28測試用例變量原子謂詞i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k謂詞測試--原子謂詞覆蓋準則對于判斷三角形類型的程序,下面11個測試用例滿足原子謂詞覆蓋準則。29測試用例變量原子謂詞i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k謂詞測試--原子謂詞覆蓋準則對于判斷三角形類型的程序,下面11個測試用例滿足原子謂詞覆蓋準則。30測試用例變量原子謂詞i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------用例32,2,-1假假真------------i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k謂詞測試--原子謂詞覆蓋準則對于判斷三角形類型的程序,下面11個測試用例滿足原子謂詞覆蓋準則。31測試用例變量原子謂詞i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------用例32,2,-1假假真------------用例41,1,2假假假真----------i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k謂詞測試--原子謂詞覆蓋準則對于判斷三角形類型的程序,下面11個測試用例滿足原子謂詞覆蓋準則。32測試用例變量原子謂詞i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------用例32,2,-1假假真------------用例41,1,2假假假真----------用例51,2,1假假假假真--------i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k謂詞測試--原子謂詞覆蓋準則對于判斷三角形類型的程序,下面11個測試用例滿足原子謂詞覆蓋準則。33測試用例變量原子謂詞i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------用例32,2,-1假假真------------用例41,1,2假假假真----------用例51,2,1假假假假真--------用例62,1,1假假假假假真------i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k謂詞測試--原子謂詞覆蓋準則對于判斷三角形類型的程序,下面11個測試用例滿足原子謂詞覆蓋準則。34測試用例變量原子謂詞i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------用例32,2,-1假假真------------用例41,1,2假假假真----------用例51,2,1假假假假真--------用例62,1,1假假假假假真------用例72,2,2假假假假假假真真--i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k謂詞測試--原子謂詞覆蓋準則對于判斷三角形類型的程序,下面11個測試用例滿足原子謂詞覆蓋準則。35測試用例變量原子謂詞i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------用例32,2,-1假假真------------用例41,1,2假假假真----------用例51,2,1假假假假真--------用例62,1,1假假假假假真------用例72,2,2假假假假假假真真--用例82,2,3假假假假假假真假--i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k謂詞測試--原子謂詞覆蓋準則對于判斷三角形類型的程序,下面11個測試用例滿足原子謂詞覆蓋準則。36測試用例變量原子謂詞i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------用例32,2,-1假假真------------用例41,1,2假假假真----------用例51,2,1假假假假真--------用例62,1,1假假假假假真------用例72,2,2假假假假假假真真--用例82,2,3假假假假假假真假--用例92,3,2假假假假假假假真--i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k謂詞測試--原子謂詞覆蓋準則對于判斷三角形類型的程序,下面11個測試用例滿足原子謂詞覆蓋準則。37測試用例變量原子謂詞i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------用例32,2,-1假假真------------用例41,1,2假假假真----------用例51,2,1假假假假真--------用例62,1,1假假假假假真------用例72,2,2假假假假假假真真--用例82,2,3假假假假假假真假--用例92,3,2假假假假假假假真--用例103,2,2假假假假假假假假真i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k謂詞測試--原子謂詞覆蓋準則對于判斷三角形類型的程序,下面11個測試用例滿足原子謂詞覆蓋準則。38測試用例變量原子謂詞i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------用例32,2,-1假假真------------用例41,1,2假假假真----------用例51,2,1假假假假真--------用例62,1,1假假假假假真------用例72,2,2假假假假假假真真--用例82,2,3假假假假假假真假--用例92,3,2假假假假假假假真--用例103,2,2假假假假假假假假真用例115,3,4假假假假假假假假假i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k謂詞測試--原子謂詞覆蓋準則對于判斷三角形類型的程序,下面11個測試用例滿足原子謂詞覆蓋準則。39測試用例變量原子謂詞i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------用例32,2,-1假假真------------用例41,1,2假假假真----------用例51,2,1假假假假真--------用例62,1,1假假假假假真------用例72,2,2假假假假假假真真--用例82,2,3假假假假假假真假--用例92,3,2假假假假假假假真--用例103,2,2假假假假假假假假真用例115,3,4假假假假假假假假假i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k冗余謂詞測試--原子謂詞覆蓋準則對于判斷三角形類型的程序,精簡后的9個測試用例滿足原子謂詞覆蓋準則。40測試用例變量原子謂詞i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------用例32,2,-1假假真------------用例41,1,2假假假真----------用例51,2,1假假假假真--------用例62,1,1假假假假假真------用例72,2,2假假假假假假真真--用例83,2,2假假假假假假假假真用例95,3,4假假假假假假假假假i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k原子謂詞覆蓋不一定滿足分支覆蓋。例如對于判定條件if(A&&B),兩個測試用例可滿足原子謂詞覆蓋:A為真,B為假A為假,B為真但是上述兩個測試用例不能測試if(A&&B)的真分支41課堂練習一個函數(shù)代碼如下,請設(shè)計滿足語原子謂詞覆蓋的測試用例42謂詞測試—分支-謂詞覆蓋準則分支—謂詞測試要求在軟件測試中,不僅每個復(fù)合謂詞所包含的每一個原子謂詞都至少獲得一次“真”值和一次“假”值;并且每個復(fù)合謂詞本身也至少獲得一次“真”值和一次“假”值。分支-謂詞覆蓋也稱為判定/條件覆蓋。分支-謂詞覆蓋準則:如果對任意一個分支和所包含的任意一個原子謂詞,測試數(shù)據(jù)集T中存在一個測試數(shù)據(jù)使其在運行時為真、為假至少各一次。43謂詞測試—分支-謂詞覆蓋準則對于判斷三角形類型的程序,下面9個測試用例滿足分支-謂詞覆蓋準則。44測試用例變量原子謂詞i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------用例32,2,-1假假真------------用例41,1,2假假假真----------用例51,2,1假假假假真--------用例62,1,1假假假假假真------用例72,2,2假假假假假假真真--用例83,2,2假假假假假假假假真用例95,3,4假假假假假假假假假(1)i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=i(2)i==j&&i==k(3)i==j||i==k||j==k課堂練習一個函數(shù)代碼如下,請設(shè)計滿足分支謂詞覆蓋的測試用例45謂詞測試—復(fù)合謂詞覆蓋準則分支—謂詞測試要求在軟件測試中,每個謂詞中條件的各種可能都至少出現(xiàn)一次。復(fù)合謂詞覆蓋準則:如果對任意一個分支,對該分支所包含的謂詞的任意一個可能的真假組合,測試數(shù)據(jù)集T中存在一個測試數(shù)據(jù)使該組合謂詞運行時,原子謂詞的取值恰好為該真假值組合。46謂詞測試—復(fù)合謂詞覆蓋準則對于判斷三角形類型的程序,下面12個測試用例滿足復(fù)合謂詞覆蓋準則。47測試用例變量原子謂詞i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,-1,-1真真真真真真------用例2-1,-2,2真真假真假假------用例32,-1,-2假真真假假真------用例42,2,-1假假真假真真------用例51,1,2假假假真假假------用例62,1,1假假假假假真------用例71,2,1假假假假真假------用例82,2,2假假假假假假真真真用例92,2,3假假假假假假真假假用例102,3,2假假假假假假假真假用例113,2,2假假假假假假假假真用例125,3,4假假假假假假假假假i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k課堂練習一個函數(shù)代碼如下,請設(shè)計滿足復(fù)合謂詞覆蓋的測試用例48更多的邏輯覆蓋準則線性代碼序列和跳轉(zhuǎn)覆蓋改進的條件/判定覆蓋...49部分覆蓋準則之間的關(guān)系50復(fù)合謂詞覆蓋準則分支--謂詞覆蓋準則分支覆蓋準則原子謂詞覆蓋準則語句覆蓋準則路徑覆蓋準則路徑測試要求觀察程序運行的整個路徑,要求程序的運行覆蓋所有的完整路徑。路徑覆蓋準則:測試數(shù)據(jù)集T稱為路徑覆蓋充分的,當且僅當LT覆蓋了GP中的所有完整路徑。51n0n1n3n4n5n6n7e0e1e2e3e4e5e6e7e9e10e11n2e8startend路徑覆蓋準則對于判斷三角形類型的程序,下面4個測試用例滿足路徑覆蓋準則。52測試用例i,j,k執(zhí)行路徑用例1-1,2,2e0e6e7用例22,2,2e0e1e5e7用例32,2,3e0e1e2e4e7用例45,3,4e0e1e2e3e7e0e1e2e3e4e5e7路徑覆蓋準則特點對于大多數(shù)真實程序,需要測試的路徑數(shù)目可能過多,難以達到100%的路徑覆蓋率。例如對于相互連接的32個雙分支的程序,其分支的數(shù)目僅為32個,但路徑的數(shù)目卻是232個通常采用路徑測試的簡化技術(shù)簡單路徑覆蓋準則、基本路徑覆蓋準則等531234基本路徑測試基本路徑測試根據(jù)程序的邏輯結(jié)構(gòu)求出基本路徑,從該基本集導(dǎo)出測試用例保證對程序中的每一條語句至少執(zhí)行一次?;韭窂绞侵杆谐绦蚵窂阶鳛橐粋€集合,在這些路徑中必然存在一個最小路徑集合?;韭窂郊皇俏ㄒ坏幕韭窂綔y試是在程序流程圖的基礎(chǔ)上,通過分析控制構(gòu)造環(huán)路復(fù)雜性,導(dǎo)出基本可執(zhí)行路徑集合,設(shè)計測試用例。54基本路徑測試基本路徑測試法的主要步驟:以詳細設(shè)計或源代碼作為基礎(chǔ),導(dǎo)出程序的控制流圖計算控制流圖G的圈復(fù)雜度V(G)。確立獨立路徑集合,即確定線性無關(guān)的路徑的基本集測試用例生成,確?;韭窂郊忻織l路經(jīng)的執(zhí)行55基本路徑測試令E為控制流圖G中邊的數(shù)量,N為G中節(jié)點的數(shù)量,P是G中判定節(jié)點(分支節(jié)點)的數(shù)量計算控制流圖圈復(fù)雜度的方法方法一:V(G)=E–N+2V(G)=10–8+2=4方法二:V(G)為G中的區(qū)域數(shù)V(G)=4方法三:V(G)=P+1V(G)=3+1=456ACBGFEDHR1R2R3R4voidselectsort(int*a,intn){inti,j,k,t;
for(i=0;i<n-1;i++){temp=a[i];
k=i;
for(j=i+1;j<n;j++){
if(a[j]<a[k]){k=j;
}
}
if(k!=i){t=a[k];a[k]=a[i];a[i]=t;
}}
}選擇排序的程序,將數(shù)組中的數(shù)據(jù)按照從小到大的順序進行排序(1)根據(jù)控制流圖計算程序的圈復(fù)雜度。圖中共有四個判定節(jié)點,由公式V(G)=P+1,得V(G)=4+1=5。因此程序的圈復(fù)雜度為5。(2)尋找獨立路徑。由程序的圈復(fù)雜度可知獨立路徑有5條。分別是:path1:1—2—11;path2:1—2—3—4—8—10—2—11;path3:1—2—3—4—8—9—10—2—11;path4:1—2—3—4—5—6—7—4—8—9—10—2—11;path5:1—2—3—4—5—7—4—8—10—2—11。測試用例路徑輸入數(shù)據(jù)預(yù)期輸出結(jié)果用例1path1:1—2—11n=1;a[0]=5a[0]=5用例2path2:1—2—3—4—8—10—2—11n=2路徑不可達用例3path3:1—2—3—4—8—9—10—2—11n=2路徑不可達用例4path4:1—2—3—4—5—6—7—4—8—9—10—2—11n=2;a[0]=5;a[1]=3k=1;a[0]=3;a[1]=5用例5path5:1—2—3—4—5—7—4—8—10—2—11n=2;a[0]=3;a[1]=5k=0;a[0]=3;a[1]=5
Procedureaverage1:i=1;total.input=total.valid=0;sum=0;2:dowhilevalue[i]<>-9993:andtotal.input<1004:incrementtotal.inputby1;5:ifvalue[i]>=minimum6:andvalue[i]<=maximum7:thenincrementtotal.validby1;sum=sum+value[i];8:endifincrementiby1;9:enddo10:iftotal.valid>011:thenaverage=sum/total.valid;12:elseaverage=-99913:endaverage計算不超過100個在規(guī)定值域內(nèi)的有效數(shù)字的平均值。
Procedureaverage1:i=1;total.input=total.valid=0;sum=0;2:dowhilevalue[i]<>-9993:andtotal.input<1004:incrementtotal.inputby1;5:ifvalue[i]>=minimum6:andvalue[i]<=maximum7:thenincrementtotal.validby1;sum=sum+value[i];8:endifincrementiby1;9:enddo10:iftotal.valid>011:thenaverage=sum/total.valid;12:elseaverage=-99913:endaverage1
2412111310538796第一步畫流圖=-999i=100<=maxsum有效值<=min>0<>-999i<100>=min>max=-99963
圈復(fù)雜度V(G)V(G)=E-N+2=17-13+2=6第二步計算圈復(fù)雜度1
2412111310538796第二步V(G)=6=-999i=100<=maxsum有效值<=min>0<>-999i<100>=min>max=-99964路徑
1:1-2-10-11-13
2:1-2-10-12-133:1-2-3-10-11-13
4:1-2-3-4-5-8-9-2-???5:1-2-3-4-5-6-8-9-2-???
6:1-2-3-4-5-6-7-8-9-2-???第三步確定獨立路徑1
2412111310538796第二步V(G)=6=-999i=100<=maxsum有效值<=min>0<>-999i<100>=min>max=-999編號測試用例預(yù)期結(jié)果1k個有效輸入k<i第i個=-9992≤i≤100基于k的正確平均值和總數(shù)不能獨立測試2Value(1)=-999average=-9993100個有效輸入i=100前100個數(shù)的正確平均值總數(shù)為100,不能獨立測試4i個<最大值的輸入i<100有k個<最小值k<i基于k的正確平均值和總數(shù)5i個>最小值輸入i<100基于k的正確平均值和總數(shù)6i個有效輸入i<100正確的平均值和總數(shù)第四步:設(shè)計測試用例循環(huán)測試用于測試循環(huán)結(jié)構(gòu)的有效性。在結(jié)構(gòu)化程序中,循環(huán)通常有三類:
簡單循環(huán)嵌套循環(huán)串接循環(huán)66循環(huán)測試簡單循環(huán)的測試:使用下列測試集,其中n為允許通過循環(huán)的最大次數(shù)。跳過循環(huán)只通過循環(huán)一次通過循環(huán)兩次通過循環(huán)m次,其中m<n-1通過循環(huán)n-1,n,n+1次67循環(huán)測試嵌套循環(huán)的測試:從內(nèi)層循環(huán)開始測試,其它循環(huán)設(shè)為最小值。對內(nèi)層循環(huán)使用簡單循環(huán)測試方法,使外層循環(huán)的迭代參數(shù)取最小值,并為越界值或非法值增加一些額外測試。由內(nèi)向外,對下一個循環(huán)進行測試,但保持所有外層循環(huán)為最小值,其他嵌套循環(huán)為“典型”值。繼續(xù)進行下去,直到測試完所有循環(huán)。68循環(huán)測試串接循環(huán)的測試:串接循環(huán)的各個循環(huán)彼此獨立,可采用簡單循環(huán)測試方法。若前一個循環(huán)的計數(shù)器值是后一個循環(huán)的初始值,可采用嵌套循環(huán)測試方法。69本章內(nèi)容邏輯覆蓋測試數(shù)據(jù)流測試變異測試其他白盒測試方法70數(shù)據(jù)流測試begin
intx,y;floatz;input(x,y)z=0;
if(x!=0)z=z+y;
elsez=z-y;
if(y!=0)z=z/x;
elsez=z*x;output(z);
end71測試用例xyzt1000.0t2111.0分支/謂詞覆蓋準則x=0,y=1時導(dǎo)致第9行出現(xiàn)除零缺陷測試用例xyz覆蓋z的定義使用對t1000.0(l4,l7),(l7,l10)t2111.0(l4,l6),(l6,l9)t3010.0(l4,l7),(l7,l9)t4101.0(l4,l6),(l6,l10)確保z的每一個定義-使用都覆蓋變量的定義和使用定義:變量被賦值例如:z=0,z被定義使用:變量的值被引用c-use,計算性引用例如:z=z+y,y被計算性引用P-use,謂詞性引用例如:x!=0,x被謂詞性引用72變量定義和使用變量定義使某變量存儲單元內(nèi)容改變的語句就是該變量的定義語句;記作DEF(v,n)
v:變量;n:對應(yīng)的語句節(jié)點;或DEF(n)={v1,v2,..,vm}73begin
intx;input(x);y=1;
end輸入語句、賦值語句begin
intx,y;for(x=1;x<100;x++)y=f(x);
end循環(huán)控制語句、過程調(diào)用DEF(x,n3)DEF(y,n4)DEF(x,n3)DEF(y,n4)變量定義和使用變量使用使用某變量存儲單元的內(nèi)容語句就是該變量的使用語句;記作USE(v,n)
v:變量;n:對應(yīng)的語句節(jié)點;或USE(n)={v1,v2,..,vm}74begin
intx=1,y;input(x);if(x>0)y=x+1;print(y);
end輸出語句、賦值語句條件語句begin
intx,y;for(x=1;x<100;x++)y=f(x);
end條件語句循環(huán)控制語句、過程調(diào)用USE(x,n4)USE(x,n3)USE(x,n4)USE(x,n5)USE(y,n6)基于數(shù)據(jù)流的測試方法數(shù)據(jù)流測試關(guān)注:程序中數(shù)據(jù)的定義與使用是否正確,即定義/引用錯誤:變量被定義,但從未被引用過;所使用變量沒有被定義變量在使用之前被定義兩次begin
intx,y,z;x=1;y=z+2;x=3;z=x+y;
end數(shù)據(jù)流圖76數(shù)據(jù)流圖源代碼控制流圖構(gòu)造數(shù)據(jù)流圖根據(jù)程序P及其CFG構(gòu)造數(shù)據(jù)流圖的過程:計算每個基本塊i的defi、c-usei、p-usei;將節(jié)點集N中的每個節(jié)點i與defi、c-usei、p-usei關(guān)聯(lián)起來;針對每個具有非空p-use集并且在條件C處結(jié)束的節(jié)點i,如果條件C為真時執(zhí)行的邊(i,j),C為假時執(zhí)行的是邊(i,k),分別將邊(i,j),(i,k)與C、!C關(guān)聯(lián)起來。77基于數(shù)據(jù)流的測試方法程序數(shù)據(jù)流視角:程序是一個程序元素對數(shù)據(jù)訪問的過程;數(shù)據(jù)流關(guān)系:數(shù)據(jù)“定義——使用”對;使用程序圖來描述數(shù)據(jù)定義-使用對;變量定義-使用路徑變量v的定義-使用路徑:在程序圖中的一條路徑,使得對某個v∈V,存在節(jié)點DEF(v,m)和USE(v,n),使得m和n是該路徑的最初節(jié)點和最終節(jié)點;記作du-pathn3->n4->n5->n6->n7是一個du-path79begin
intx,y;x=1;input(y);if(y>0)x=3;y=x+2;
end變量定義-清除路徑變量v的定義-清除路徑:在具有最初節(jié)點和最終節(jié)點DEF(v,m)和USE(v,n)的路徑當中,沒有其他節(jié)點是v的定義節(jié)點;記作dc-pathn3->n4->n5->n7是一個dc-path在對于變量v的dc-path(m,n),在語句m,n之間,我們稱變量v是活的;不是定義-清除路徑的定義-使用路徑,是潛在有問題的地方;n3->n4->n5->n6->n7不是一個dc-path80begin
intx,y;x=1;input(y);if(y>0)x=3;y=x+2;
end實例:變量定義-使用811a=5;/*定義a*/2while(C1){3if(C2){4b=a*a;/*使用a*/5a=a-1;/*定義且使用a*/6}7print(a);}/*使用a*/1234567du-pathdc-path1234y12345y1234567n567y定義-使用路徑測試覆蓋全定義-使用路徑指標:針對程序中所有變量的每一定義-使用對,都有測試用例使得程序執(zhí)行了一條du-path。其他數(shù)據(jù)流覆蓋指標全使用全計算使用/部分謂詞使用全謂詞使用/部分計算使用全定義使用全謂詞使用全邊全節(jié)點數(shù)據(jù)流覆蓋指標層次結(jié)構(gòu)圖83全路徑全使用全定義-使用全計算使用/部分謂詞使用全定義全謂詞使用/部分計算使用全謂詞使用全邊全節(jié)點數(shù)據(jù)流測試實例具有數(shù)據(jù)流信息的控制流圖84z)定義覆蓋準則測試數(shù)據(jù)集T對測試程序P滿足定義覆蓋準則:
如果對具有數(shù)據(jù)流信息的控制流圖GP中的每一個變量x的每一個定義性出現(xiàn),若該定義性出現(xiàn)能夠可行的傳遞到該變量的某一個引用性出現(xiàn),那么LT中存在一條路徑A,它包含一條子路徑A′,使得A′將該定義出現(xiàn)傳遞到某一個引用性出現(xiàn)。85定義覆蓋準則:路徑:
Al=<a,b,d,e>,A2=<a,c,e>z)引用覆蓋準則測試數(shù)據(jù)集T對測試程序P滿足引用覆蓋準則:如果對具有數(shù)據(jù)流信息的控制流圖Gp中的每一個變量x的每一個定義n,以及該定義的每一個能夠可行地傳遞到的引用n′,LT中都存在一條路徑A,A包含一條子路徑A′,使得A′將n傳遞到n′。86引用覆蓋準則:路徑集合:{<a,b,b,c,c,b,b,d>,<a,d>,<a,c,c,b,b,c,d>}z)定義-引用覆蓋準則測試數(shù)據(jù)集T對測試程序P滿足定義-引用覆蓋準則:
如果對具有數(shù)據(jù)流信息的控制流圖Gp中的任意一條從定義傳遞到其引用的路徑A,若A是無回路的或者A只是開始節(jié)點和結(jié)束節(jié)點相同,那么LT中存在一條路徑B,使得A是B的子路徑。87定義-引用覆蓋準則:路徑集合:{<a,b,b,c,c,b,b,d>,<a,d>,<a,c,c,b,b,c,d>}z)本章內(nèi)容邏輯覆蓋測試數(shù)據(jù)流測試變異測試其他白盒測試方法88程序變異經(jīng)過多年的測試理論與實踐研究,人們發(fā)現(xiàn)要找出程序中的所有錯誤是不可能的,現(xiàn)實的解決辦法是盡可能縮小錯誤搜索的范圍,這樣做的好處是,便于集中目標于對軟件危害較大的錯誤,暫時忽略危害較小的錯誤,以此取得較高的測試效率,降低測試成本。程序變異是一種錯誤驅(qū)動測試,是針對某種類型的特定程序錯誤而提出來的。程序變異測試的分類:(1)程序強變異測試(通常稱:程序變異)(2)程序弱變異測試89程序變異思想程序變異(ProgramMutation)測試技術(shù)的基本思想是:對于給定的程序P,先假定程序中存在一些小錯誤,每假設(shè)一個錯誤,程序P就變成P′,如果假設(shè)了n個錯誤:e1,e2,…,en,則對應(yīng)有n個不同的程序:P1,P2,…,Pn,這里Pi稱為P的變異因子或變異體。理論上,若P正確,Pi肯定錯誤,即存在測試數(shù)據(jù)Ci,使得P和Pi的輸出結(jié)果是不同的。90程序變異思想因此,根據(jù)程序P和每個變異的程序,可以求得P1,P2…,Pn的測試數(shù)據(jù)集
C={C1,C2,…,Cn}。運行C,如果對每一個Ci,P都是正確的,而Pi都是錯誤的,這說明P的正確性較高。如果對某個Ci,P是錯誤的,而Pi是正確的,這說明P存在錯誤,而錯誤就是ei。91程序變異思想給定一個程序P和一個測試數(shù)據(jù)集T,通過變異算子為P產(chǎn)生一組變異體Mi(合乎語法的變更),對P和M都使用T進行測試運行。如果某Mi在某個測試輸入t上與P產(chǎn)生不同的結(jié)果,則該Mi被殺死;若某Mi在所有的測試數(shù)據(jù)集上都與P產(chǎn)生相同的結(jié)果,則稱其為活的變異體接下來對活的變異體進行分析,檢查其是否等價于P;對不等價于P的變異體M進行進一步的測試,直到充分性度量達到滿意的程度。92真假美猴王93在唐僧那:念緊箍咒,兩個都喊疼,自然看不出哪個真假;到天宮:拖塔天王拿照妖鏡照,也看不出;又到觀音那:觀音也看不出。最后到幽冥處閻羅那,經(jīng)“諦聽”聽過之后,“諦聽”卻說:“我看出來了,卻不敢說”最后還是如來老佛爺?shù)莱隽嫔聿⒂媒鹄徲壅肿?。程序變異思想假設(shè)程序P已使用測試T中的測試用例測試通過,而且沒有錯誤。變異是一種輕微改變程序的操作。94Example:Program11beginintx,y;input(x,y);if(x<y)output(x+y)elseoutput(x*y);endProgram1的變異體M11beginintx,y;input(x,y);
if(x<=y(tǒng))output(x+y)elseoutput(x*y);endProgram1的變異體M21beginintx,y;input(x,y);if(x<y)output(x+y)else
output(x/y);endChangedtoPP’程序變異思想P’稱為P的變異體如果對于T中的測試t,有P(t)≠P’(t),稱作P’與P有區(qū)別(distinguishes),或者t殺死(killed)P’.如果T中所有的測試
t使得P(t)=P’(t),稱T不能區(qū)別P和P’。那么稱在測試過程中P’是活的(live).如果在程序P的輸入域中不存在任何測試用例t使得P與P’
區(qū)別,則稱P’等價于P。如果P’不等價于P,而且T中沒有測試能夠?qū)’與P區(qū)別,則認為T是不充分的。不等價而且是活的變異體為測試人員提供了一個生成新測試用例的機會,進而增強測試T。
95PP’C語言的變異算子Purdue大學的RichardA.Demillo領(lǐng)導(dǎo)的研究小組設(shè)計了最大、最全面也是唯一的C語言變異算子集合。巴西SaoCarlos大學JoseMaldonado領(lǐng)導(dǎo)的研究小組在工具Proteum中實現(xiàn)了C語言的全部變異算子。C語言的全部77個變異算子可分為四類:常量變異運算符變異語句變異變量變異96C語言的常量變異C語言中的常量變異算子表97名稱定義域說明CGCR常量使用全局變量替換程序中出現(xiàn)的常量CLSR常量使用局部變量替換程序中出現(xiàn)的標量CGSR常量使用全局變量替換程序中出現(xiàn)的標量CRCR常量必需的常量替換CLCR常量使用局部常量替換程序中出現(xiàn)的常量C語言的常量變異實例:CRCR-必需的常量替換考慮語句k=j+*p,其中k,j都是整數(shù),p是一個指向整數(shù)的指針,當對該語句進行CRCR變異時,得到下面的變異體:k=0+*pk=1+*pk=-1+*pk=ui+*pk=j+null98C語言的運算符變異運算符(operator)指的是C語言中的運算符,比如算術(shù)運算符+和關(guān)系運算符<運算符變異分類:二元運算符變異同類運算符替換(Ocor)非同類運算符替換(Oior)一元運算符變異99C語言中運算符變異Ocor中變異算子的定義域和值域100名稱定義域值域示例OAAA算術(shù)賦值算術(shù)賦值a+=b→a-=bOAAN算術(shù)算術(shù)a+b→a*bOBBA位賦值位賦值a&=b→a|=bOBBN位位a&b→a|bOLLN邏輯邏輯a&&b→a||bORRN關(guān)系關(guān)系a<b→a<=bOSSA移位賦值移位賦值a<<=b→a>>=bOSSN移位移位a<<b→a>>bOior中變異算子:算術(shù)運算符與位運算符101名稱定義域值域示例OABA算術(shù)賦值位賦值a+=b→a|=bOAEA算術(shù)賦值單純賦值a+=b→a=bOABN算術(shù)位a+b→a&bOALN算術(shù)邏輯a+b→a&&bOARN算術(shù)關(guān)系a+b→a<bOASA算術(shù)賦值移位賦值a+=b→a<<=bOASN算術(shù)移位a+b→a<<bOBAA位賦值算術(shù)賦值a&=b→a+=bOBAN位算術(shù)a&b→a+bOBEA位賦值單純賦值a&=b→a=bOBLN位邏輯a&b→a&&bOBRN位關(guān)系a&b→a<bOBSA位賦值移位賦值a&=b→a<<=bOBSN位移位a&b→a<<bOior中變異算子:單純賦值、邏輯和關(guān)系102名稱定義域值域示例OEAA單純賦值算術(shù)賦值a=b→a+=bOEBA單純賦值位賦值a=b→a&=bOLAN邏輯算術(shù)a&&b→a+bOLRN邏輯關(guān)系a&&b→a&bORAN關(guān)系算術(shù)a<b→a+bORLN關(guān)系邏輯a<b→a&&bORSN關(guān)系移位a<b→a<<b............C語言的運算符變異一元運算符變異遞加/遞減x++→++xx++→x--邏輯否定邏輯上下文否定位取反間接運算符優(yōu)先級變異強制轉(zhuǎn)換運算符替換103C語言的語句變異104算子定義域說明SBRCbreak用continue替換breakSBRnbreakbreak到第n層SCBBcontinue用break替換continueSDWDdo-while使用while替換do-whileSGLRgoto互換goto語句的標簽SMVB語句上(下)移動右花括號SRSRreturn互換return語句SSDL語句刪除語句SSOM語句順序運算符變異STRIifIf條件陷阱STRP語句語句執(zhí)行陷阱SMTC迭代語句多次迭代繼續(xù)SSWMswitch語句switch語句變異SMTT迭代語句多次迭代陷阱SWDDwhile使用do-while替換while語句變異實例:語句執(zhí)行陷阱105語句變異實例:語句刪除變異106C語言的變量變異107算子定義域說明VASM數(shù)組下標數(shù)組引用下標變異VDTR標量引用絕對值變異VGAR數(shù)組引用使用全局數(shù)組引用替換數(shù)組引用VGLA數(shù)組引用使用全局、局部數(shù)組引用來替換數(shù)組引用VGPR指針引用使用全局指針引用替換指針引用VGSR標量引用使用全局標量引用替換標量引用VGTR結(jié)構(gòu)引用使用全局結(jié)構(gòu)引用替換結(jié)構(gòu)引用VLAR數(shù)組引用使用局部數(shù)組引用替換數(shù)組引用VLPR指針引用使用局部指針引用替換指針引用VLSR標量引用使用局部標量引用替換標量引用VLTR結(jié)構(gòu)引用使用局部結(jié)構(gòu)引用替換結(jié)構(gòu)引用VSCR結(jié)構(gòu)元素結(jié)構(gòu)元素替換VTWD標量表達式擺動變異變量變異:擺動變異擺動變異:檢查標量變量的邊界條件實例:考慮p=a+b,假設(shè)p,a,b都是整數(shù)擺動變異得到的變體:p=a+b+1p=a+b-1108Java語言的變異算子作為類C語言,C的許多變異算子可應(yīng)用到Java程序的變異中。針對Java語言的特性以及OO特點,有些研究小組提出了一些Java的變異算子Yu-SeungMa,Tong-raeKwon,JeffOffutt提出的算子在muJava系統(tǒng)中實現(xiàn)倫敦GoldsmithsCollegeUniversity的SebastianDanicic在Lava工具內(nèi)實現(xiàn)了一套變異算子集IvanMoore實現(xiàn)了Jester的Java程序變異工具109Java語言的變異算子Java類變異算子,模擬對象為與繼承相關(guān)的錯誤110算子定義域說明IHD變量如果變量x已在parent(C)中聲明,那就移除其在子類C中的聲明IHI子類如果變量x已在parent(C)中聲明,那就在子類C中增加一個x的聲明IOD方法如果方法m已在parent(C)中聲明,那就移除其在子類C中的聲明IOP方法在子類的方法中,把一個形如super.M(...)的調(diào)用上移一句;下移一句;移至m方法體開始;移至m方法體結(jié)尾IOR方法如果方法f1調(diào)用parent(C)中的方法f2,且f2在子類C中有覆寫定義,那就把f2重命名為f2’ISK對父類的訪問IPCSuper調(diào)用刪除子類C構(gòu)造函數(shù)中的super關(guān)鍵字Java語言的變異算子實例:模擬對象為與繼承相關(guān)的錯誤111
classPlanet{
doubledist;...
}
classFarPlanetextendsPlanet{
doubledist;...
}
classPlanet{
doubledist;...
}
classFarPlanetextendsPlanet{
//刪除聲明...
}IHDJava語言的變異算子多態(tài)與動態(tài)綁定112算子定義域說明PMC對象實例化若t1為子類類型而t2為父類類型,當使用new進行對象實例化時,使用t2替換t1PMD對象聲明若對象x的類型為t1,則使用其父類t2替換它PPD參數(shù)若對象x的類型為t1,其父類類型為t2,則當t1在方法的參數(shù)中出現(xiàn)時,用t2對其進行替換PRV對象聲明若兩個對象o1與o2類型兼容,且在同一上下文中聲明,那么當o1在賦值語句右端出現(xiàn)時,使用o2對其進行替換Java語言的變異算子實例:多態(tài)與動態(tài)綁定假設(shè)Planet是FarPlanet的父類113
FarPlanetp;p=new
FarPlanet();PMC
Planetp;p=new
FarPlanet();
Planetp;p=new
Planet();PMD
Planetp;p=new
FarPlanet();Java語言的變異算子方法重載114算子定義域說明OMR重載方法互換重載方法的方法體OMD重載方法刪除重載方法OAD方法變更方法參數(shù)的次序OAN方法刪除重載方法的參數(shù)Java語言的變異算子實例:方法重載115voidinit(initi){...}voidinit(inti,Strings){...}OMRvoidinit(initi){...}voidinit(inti,Strings){
this.init(i);}OMRvoidinit(initi){
this.init(i,””);}voidinit(inti,Strings){...}Java語言的變異算子Java特有的變異算子116算子定義域說明JTDthis刪除this關(guān)鍵字JSC類變量把變量變?yōu)閷嵗兞縅ID成員變量刪除成員變量的初始化語句JDC構(gòu)造函數(shù)刪除用戶定義的構(gòu)造函數(shù)EOA對象引用通過clone(),使用對象內(nèi)容替換對象引用EOC比較表達式使用equals替換==EAM訪問方法調(diào)用替換對相互兼容的訪問方法的調(diào)用EMM修改方法調(diào)用替換對相互兼容的修改方法的調(diào)用Java語言的變異算子實例:Java特有的變異算子117Elementhydrogen,hisotope;hydorgen=newElement();hisotope=hydrogen;EOAElementhydrogen,hisotope;hydorgen=newElement();hisotope=hydrogenclone();程序變異步驟118程序變異步驟第1步:程序執(zhí)行P(t)表示給定測試用例t,程序P的執(zhí)行結(jié)果由P中變量的輸出值表示(也可能與
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 如何準備元數(shù)據(jù)標注員面試這里有答案
- 實驗室常用設(shè)備建設(shè)項目可行性分析報告(總投資3000萬元)
- 成型設(shè)備建設(shè)項目可行性分析報告(總投資18000萬元)
- 海信集團質(zhì)量管理部質(zhì)量總監(jiān)面試題庫含答案
- 電信工程經(jīng)理招聘考試題庫
- 實驗混煉機項目可行性分析報告范文
- 汽車行業(yè)售后服務(wù)專員面試題與答案解析
- 超聲波設(shè)備空分設(shè)備精餾塔項目可行性研究報告(總投資19000萬元)(87畝)
- 核電廠運行經(jīng)理考試題集與解析
- 人力資源經(jīng)理高級面試題及答案解析
- 勞動關(guān)系解除協(xié)議合同
- 應(yīng)急指揮管理平臺系統(tǒng)設(shè)計方案
- 佛教的由來、發(fā)展和概況課件
- 大陸火災(zāi)基本形勢
- 非物質(zhì)文化遺產(chǎn)申請表
- 基層銷售人員入職培訓課程完整版課件
- 2023年郴州職業(yè)技術(shù)學院單招職業(yè)適應(yīng)性測試題庫及答案解析word版
- 西南大學PPT 04 實用版答辯模板
- D500-D505 2016年合訂本防雷與接地圖集
- 顱腦損傷的重癥監(jiān)護
- 《史記》上冊注音版
評論
0/150
提交評論