《軟件工程》PPT課件_第1頁(yè)
《軟件工程》PPT課件_第2頁(yè)
《軟件工程》PPT課件_第3頁(yè)
《軟件工程》PPT課件_第4頁(yè)
《軟件工程》PPT課件_第5頁(yè)
已閱讀5頁(yè),還剩154頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第七章結(jié)構(gòu)化實(shí)現(xiàn),合肥工業(yè)大學(xué)理學(xué)院,實(shí)現(xiàn)包括編碼和測(cè)試兩個(gè)階段 一、編碼 二、軟件測(cè)試 三、調(diào)試 四、軟件可靠性,7.1編碼,編碼在總體設(shè)計(jì)和詳細(xì)設(shè)計(jì)之后進(jìn)行,它只是把軟件設(shè)計(jì)的結(jié)果翻譯成用某種程序設(shè)計(jì)語(yǔ)言書(shū)寫(xiě)的程序。因此,程序的質(zhì)量基本上取決于設(shè)計(jì)的質(zhì)量。 程序設(shè)計(jì)語(yǔ)言的特性和編碼風(fēng)格會(huì)深刻地影響軟件的質(zhì)量和可維護(hù)性。,一般選擇高級(jí)語(yǔ)言而非匯編語(yǔ)言書(shū)寫(xiě)程序。 選擇高級(jí)語(yǔ)言,考慮是否有 1)理想的模塊化機(jī)制 2)可讀性好的控制結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu) 3)良好的獨(dú)立編譯機(jī)制 4)編譯程序能夠盡可能多地發(fā)現(xiàn)程序 中的錯(cuò)誤 5)總之,易于修改、測(cè)試和維護(hù),1.程序設(shè)計(jì)語(yǔ)言的選擇,衡量某種程序語(yǔ)言是否適合特

2、定的項(xiàng)目,就考慮下面一些因素: 1)系統(tǒng)用戶的要求 2)可以使用的編譯程序 3)可以得到的軟件工具 4)程序員的知識(shí)水平 5)軟件可移植性要求 6)工程規(guī)模 7)軟件的應(yīng)用領(lǐng)域,源代碼應(yīng)邏輯簡(jiǎn)明清晰,易讀易懂。 程序內(nèi)部有 1)良好的文檔資料 2)有規(guī)律的數(shù)據(jù)說(shuō)明格式 3)簡(jiǎn)單清晰的語(yǔ)句構(gòu)造 4)輸入輸出格式 5)效率,2.編碼風(fēng)格,1)源程序文檔化,標(biāo)識(shí)符 注釋 程序的視覺(jué)組織,標(biāo)識(shí)符,標(biāo)識(shí)符包括模塊名、變量名、常量名、標(biāo)號(hào)名、子程序名、數(shù)據(jù)區(qū)名以及緩沖區(qū)名等。 這些名字應(yīng)能反映它所代表的實(shí)際東西,應(yīng)有一定實(shí)際意義。 例如,表示次數(shù)的量用Times,表示總量的用Total,表示平均值的用Av

3、erage,表示和的量用Sum等。 名字不是越長(zhǎng)越好,應(yīng)當(dāng)選擇精煉的意義明確的名字。必要時(shí)可使用縮寫(xiě)名字,但這時(shí)要注意縮寫(xiě)規(guī)則要一致,并且要給每一個(gè)名字加注釋。同時(shí),在一個(gè)程序中,一個(gè)變量只應(yīng)用于一種用途。,注釋,夾在程序中的注釋是程序員與日后的程序讀者之間通信的重要手段。 注釋決不是可有可無(wú)的。 一些正規(guī)的程序文本中,注釋行的數(shù)量占到整個(gè)源程序的13到12,甚至更多。 注釋分為序言性注釋和功能性注釋 序言性注釋程序的整體說(shuō)明:程序標(biāo)題、模塊功能和目的、主要算法、接口說(shuō)明、有關(guān)數(shù)據(jù)描述、模塊位置、開(kāi)發(fā)簡(jiǎn)歷。 功能性注釋語(yǔ)句或程序段的功能說(shuō)明。,視覺(jué)組織(空格、空行和移行),恰當(dāng)?shù)乩每崭瘢梢?/p>

4、突出運(yùn)算的優(yōu)先性,避免發(fā)生運(yùn)算的錯(cuò)誤。 例如 ,將表達(dá)式(A17)ANDNOT(B49)ORC寫(xiě)成(A17) AND NOT (B49) OR C 自然的程序段之間可用空行隔開(kāi)。 移行也叫做向右縮格。 它是指程序中的各行 不必都在左端對(duì)齊, 都從第一格起排列。 這樣做使程序完全分 不清層次關(guān)系。,IF() THEN IF() THEN ELSE ENDIF ELSE ENDIF,2)數(shù)據(jù)說(shuō)明,在設(shè)計(jì)階段已經(jīng)確定了數(shù)據(jù)結(jié)構(gòu)的組織及其復(fù)雜性。在編寫(xiě)程序時(shí),則需要注意數(shù)據(jù)說(shuō)明的風(fēng)格。 為了使程序中數(shù)據(jù)說(shuō)明更易于理解和維護(hù),必須注意以下幾點(diǎn)。 數(shù)據(jù)說(shuō)明的次序應(yīng)當(dāng)規(guī)范化 說(shuō)明語(yǔ)句中變量安排有序化 使用注

5、釋說(shuō)明復(fù)雜數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)說(shuō)明的次序應(yīng)當(dāng)規(guī)范化,例如,在FORTRAN程序中數(shù)據(jù)說(shuō)明次序 常量說(shuō)明 簡(jiǎn)單變量類型說(shuō)明 數(shù)組說(shuō)明 公用數(shù)據(jù)塊說(shuō)明 所有的文件說(shuō)明 在類型說(shuō)明中還可進(jìn)一步要求。例如, 可按如下順序排列: 整型量說(shuō)明 實(shí)型量說(shuō)明 字符量說(shuō)明 邏輯量說(shuō)明,說(shuō)明語(yǔ)句中變量安排有序化,當(dāng)多個(gè)變量名在一個(gè)說(shuō)明語(yǔ)句中說(shuō)明時(shí),應(yīng)當(dāng)對(duì)這些變量按字母的順序排列。帶標(biāo)號(hào)的全程數(shù)據(jù)也應(yīng)當(dāng)按字母的順序排列。 例如,把 integer size, length, width, cost, price寫(xiě)成integer cost, length, price , size, width,使用注釋說(shuō)明復(fù)雜數(shù)據(jù)結(jié)構(gòu)

6、,如果設(shè)計(jì)了一個(gè)復(fù)雜的數(shù)據(jù)結(jié)構(gòu),應(yīng)當(dāng)使用注釋來(lái)說(shuō)明在程序?qū)崿F(xiàn)時(shí)這個(gè)數(shù)據(jù)結(jié)構(gòu)的固有特點(diǎn)。,3)語(yǔ)句結(jié)構(gòu),程序編寫(xiě)首先應(yīng)當(dāng)考慮清晰性。 在一行內(nèi)只寫(xiě)一條語(yǔ)句。 程序要能直截了當(dāng)?shù)卣f(shuō)明程序員的用意。 除非對(duì)效率有特殊的要求,程序編寫(xiě)要做到清晰第一,效率第二。 盡可能使用庫(kù)函數(shù)。 盡量只采用三種基本的控制結(jié)構(gòu)來(lái)編寫(xiě)程序。 避免不必要的轉(zhuǎn)移。同時(shí)如果能保持程序可讀性,則不必用 GOTO語(yǔ)句。 避免采用過(guò)于復(fù)雜的條件測(cè)試。 盡量減少使用“否定”條件的條件語(yǔ)句。,4)輸入輸出方法,對(duì)所有的輸入數(shù)據(jù)都要進(jìn)行檢驗(yàn)以保證有效性; 檢查輸入項(xiàng)的各種重要組合的合理性; 使得輸入的步驟和操作盡可能簡(jiǎn)單,并保持簡(jiǎn)單的輸入

7、格式; 輸入數(shù)據(jù)時(shí),應(yīng)允許使用自由格式輸入; 應(yīng)允許缺省值; 輸入一批數(shù)據(jù)時(shí),最好使用輸入結(jié)束標(biāo)志,而不要由用戶指定輸入數(shù)據(jù)數(shù)目; 明確提示交互輸入的請(qǐng)求,指明可使用選擇項(xiàng)的種類和取值范圍; 給所有的輸出加注解,并設(shè)計(jì)輸出報(bào)表格式。,5)效率,程序的效率是指程序的執(zhí)行速度及程序所需占用的內(nèi)存的存儲(chǔ)空間。 效率是一個(gè)性能要求,應(yīng)當(dāng)在需求分析階段給出。軟件效率以需求為準(zhǔn),不應(yīng)以人力所及為準(zhǔn)。 好的設(shè)計(jì)可以提高效率。 程序的效率與程序的簡(jiǎn)單性相關(guān)。 一般說(shuō)來(lái),任何對(duì)效率無(wú)重要改善,且對(duì)程序的簡(jiǎn)單性、可讀性和正確性不利的程序設(shè)計(jì)方法都是不可取的。,時(shí)間效率,源程序的效率與詳細(xì)設(shè)計(jì)階段確定的算法的效率直

8、接有關(guān)。 在編程序前,盡可能化簡(jiǎn)有關(guān)的算術(shù)表達(dá)式和邏輯表達(dá)式; 仔細(xì)檢查算法中的嵌套的循環(huán),盡可能將某些語(yǔ)句或表達(dá)式移到循環(huán)外面; 盡量避免使用多維數(shù)組; 盡量避免使用指針和復(fù)雜的表; 采用“快速”的算術(shù)運(yùn)算;,不要混淆數(shù)據(jù)類型,避免在表達(dá)式中出現(xiàn)類型混雜; 盡量采用整數(shù)算術(shù)表達(dá)式和布爾表達(dá)式; 選用等效的高效率算法; 許多編譯程序具有“優(yōu)化”功能,可以自動(dòng)生成高效率的目標(biāo)代碼。,影響存儲(chǔ)器效率的因素,內(nèi)存采取基于操作系統(tǒng)的分頁(yè)功能的虛擬存儲(chǔ)管理。存儲(chǔ)效率與操作系統(tǒng)的分頁(yè)功能直接有關(guān)。 采用結(jié)構(gòu)化程序設(shè)計(jì),將程序功能合理分塊,使每個(gè)模塊或一組密切相關(guān)模塊的程序體積大小與每頁(yè)的容量相匹配,可減少

9、頁(yè)面調(diào)度,減少內(nèi)外存交換,提高存儲(chǔ)效率。 提高存儲(chǔ)器效率的關(guān)鍵是程序的簡(jiǎn)單性。,輸入輸出效率,簡(jiǎn)單清晰同樣是提高人機(jī)通信效率的關(guān)鍵。 面向設(shè)備的輸入輸出可遵循的原則: 對(duì)于所有的輸入/輸出操作,安排適當(dāng)?shù)木彌_區(qū),以減少頻繁的信息交換。 對(duì)輔助存儲(chǔ)(例如磁盤),選擇盡可能簡(jiǎn)單的,可接受的存取方法; 對(duì)輔助存儲(chǔ)的輸入/輸出,應(yīng)當(dāng)成塊傳送; 任何不易理解的所謂“超高效”的輸入/輸出是不可取的。,7.2軟件測(cè)試基礎(chǔ),防不勝防的軟件錯(cuò)誤 實(shí)例: 1963年,美國(guó)飛往火星的火箭爆炸,損失1000萬(wàn)美元,原因是FORTRAN循環(huán) DO 5 I=1,3 誤寫(xiě)為 DO 5 I=1.3 1991年愛(ài)國(guó)者導(dǎo)彈防御系

10、統(tǒng)系統(tǒng)時(shí)鐘誤差積累造成跟蹤系統(tǒng)失去精確度 千年蟲(chóng),世界各地解決2000年錯(cuò)誤超過(guò)數(shù)億美元,統(tǒng)計(jì)表明,軟件測(cè)試的工作量往往占軟件開(kāi)發(fā)總工作量的40%以上。在極端情況下,對(duì)人命關(guān)天的軟件(如飛機(jī)控制、核反應(yīng)堆等)測(cè)試所花費(fèi)的時(shí)間往往是其它軟件工程活動(dòng)時(shí)間之和的3到5倍。,軟件開(kāi)發(fā)工作量分配比例,40% 50%,10% 20%,例: Windows2000有5000萬(wàn)行代碼,3000多個(gè)工程師,幾百個(gè)小團(tuán)隊(duì)。 Exchange2000和Windows2000開(kāi)發(fā)人員結(jié)構(gòu),“測(cè)試的目的是說(shuō)明程序正確地執(zhí)行它應(yīng)有的功能?!?這種說(shuō)法正確嗎? G.J.Myers在軟件測(cè)試技巧中認(rèn)為: (1)測(cè)試是為了尋找

11、錯(cuò)誤而運(yùn)行程序的過(guò)程。 (2)一個(gè)好的測(cè)試方案是指極可能找到迄今為止尚未發(fā)現(xiàn)的錯(cuò)誤的測(cè)試方案。 (3)一個(gè)成功的測(cè)試是揭示了迄今為止尚未發(fā)現(xiàn)的錯(cuò)誤的測(cè)試。,1.軟件測(cè)試的目的,例:程序Triangle,輸入三個(gè)整數(shù),表示一個(gè)三角形的三個(gè)邊長(zhǎng),該程序產(chǎn)生一個(gè)結(jié)果,指出該三角形是等邊三角形、等腰三角形還是不等邊三角形。 為說(shuō)明其能正確執(zhí)行它的功能,可使用測(cè)試用例(3,4,5),(5,5,6),(6,6,6), 程序都能給出正確結(jié)果,是否就可認(rèn)為程序是正確的? 測(cè)試用例:要輸入的測(cè)試數(shù)據(jù)和預(yù)期的輸出結(jié)果。 測(cè)試方案:具體的測(cè)試目的(如預(yù)定要測(cè)試的具體功能),應(yīng)該輸入的測(cè)試數(shù)據(jù)和預(yù)期的結(jié)果。,E.W.

12、Dijkstra 指出: “程序測(cè)試能證明錯(cuò)誤的存在,但不能證明錯(cuò)誤不存在。” 測(cè)試的目的是發(fā)現(xiàn)程序中的錯(cuò)誤,是為了證明程序有錯(cuò),而不是證明程序無(wú)錯(cuò)。 把證明程序無(wú)錯(cuò)當(dāng)作測(cè)試目的不僅是不正確的,完全做不到的,而且對(duì)做好測(cè)試沒(méi)有任何益處,甚至是十分有害的。 軟件測(cè)試要設(shè)法使軟件發(fā)生故障,暴露軟件錯(cuò)誤。 測(cè)試的“成功”與“失敗”: 能夠發(fā)現(xiàn)錯(cuò)誤的測(cè)試是成功的測(cè)試,否則是失敗的測(cè)試。,總之,測(cè)試的目的是 想以最少的時(shí)間和人力,系統(tǒng)地找出軟件中潛在的各種錯(cuò)誤和缺陷。如果我們成功地實(shí)施了測(cè)試,我們就能夠發(fā)現(xiàn)軟件中的錯(cuò)誤。 測(cè)試的附帶收獲是,它能夠證明軟件的功能和性能與需求說(shuō)明相符合。 實(shí)施測(cè)試收集到的測(cè)

13、試結(jié)果數(shù)據(jù)為軟件可靠性分析提供了依據(jù)。 測(cè)試不能表明軟件中不存在錯(cuò)誤,它只能說(shuō)明軟件中存在錯(cuò)誤。,2.測(cè)試原則,(1)所有的測(cè)試都應(yīng)追溯到用戶需求。 最嚴(yán)重的錯(cuò)誤(從用戶角度)是那些導(dǎo)致軟件無(wú)法滿足需求的錯(cuò)誤。 (2)一旦完成需求模型就可以著手制定測(cè)試計(jì)劃,詳細(xì)的測(cè)試用例定義可在設(shè)計(jì)模型確定后開(kāi)始,所有測(cè)試工作可在編碼之前進(jìn)行計(jì)劃和設(shè)計(jì)。 程序中的問(wèn)題根源可能在開(kāi)發(fā)前期的各階段,解決、糾正錯(cuò)誤也必須追溯到前期工作。,軟件測(cè)試程序測(cè)試 軟件測(cè)試應(yīng)貫穿于軟件定義與開(kāi)發(fā)的整個(gè)過(guò)程。 據(jù)美國(guó)一家公司統(tǒng)計(jì),查出的軟件錯(cuò)誤中,屬于需求分析和軟件設(shè)計(jì)的錯(cuò)誤約占 64%,屬于程序編寫(xiě)的錯(cuò)誤僅占36%。程序編寫(xiě)

14、的許多錯(cuò)誤是“先天的”。,測(cè)試與開(kāi)發(fā)前期工作的關(guān)系,決定軟件與系統(tǒng)的配合關(guān)系,需求分析,概要設(shè)計(jì),詳細(xì)設(shè)計(jì),編 碼,單元測(cè)試,集成測(cè)試,確認(rèn)測(cè)試,系統(tǒng)測(cè)試,軟件開(kāi)發(fā)過(guò)程是一個(gè)自頂向下,逐步細(xì)化的過(guò)程。 測(cè)試過(guò)程是依相反順序安排的自底向上,逐步集成的過(guò)程。,測(cè)試階段工作步驟,單元測(cè)試:檢驗(yàn)每個(gè)模塊能否單獨(dú)工作 集成測(cè)試:檢驗(yàn)概要設(shè)計(jì)中模塊接口設(shè)計(jì)問(wèn)題 確認(rèn)測(cè)試:以需求規(guī)格說(shuō)明書(shū)為檢驗(yàn)尺度 系統(tǒng)測(cè)試:綜合檢驗(yàn) 測(cè)試可視為分析、設(shè)計(jì)、編碼三個(gè)階段的最終復(fù)審,以保證軟件質(zhì)量.,測(cè)試原則(續(xù)),(3)測(cè)試規(guī)模應(yīng)該從“小”到“大”。 (4)pareto原理:測(cè)試發(fā)現(xiàn)的錯(cuò)誤中80%很可能由程序中20%的模塊

15、造成。 應(yīng)孤立這些疑點(diǎn)模塊重點(diǎn)測(cè)試。 (5)窮舉測(cè)試是不可能的。 窮舉測(cè)試:把程序所有可能的執(zhí)行路徑都檢查一遍的測(cè)試。,測(cè)試原則(續(xù)),(5)應(yīng)由獨(dú)立的第三方來(lái)構(gòu)造測(cè)試。 (開(kāi)發(fā)和測(cè)試隊(duì)伍分別建立) (6)測(cè)試用例應(yīng)由輸入數(shù)據(jù)和預(yù)期的輸出結(jié)果兩部分組成。 (7)兼顧合理的輸入和不合理的輸入數(shù)據(jù)。 (8)程序修改后要回歸測(cè)試。 (9)充分注意測(cè)試中的群集現(xiàn)象。經(jīng)驗(yàn)表明,測(cè)試后程序中殘存的錯(cuò)誤數(shù)目與該程序中已發(fā)現(xiàn)的錯(cuò)誤數(shù)目成正比。,測(cè)試原則(續(xù)),(10)嚴(yán)格執(zhí)行測(cè)試計(jì)劃,排除測(cè)試的隨意性。 (11)應(yīng)當(dāng)對(duì)每一個(gè)測(cè)試結(jié)果做全面檢查。 (12)妥善保存測(cè)試計(jì)劃,測(cè)試用例,出錯(cuò)統(tǒng)計(jì)和最終分析報(bào)告,為維

16、護(hù)提供方便。,測(cè)試原則:軟件測(cè)試是有風(fēng)險(xiǎn)的行為,數(shù) 量,遺漏軟件 缺陷數(shù)目,測(cè)試費(fèi)用,測(cè)試中,測(cè)試后,軟件,測(cè)試工作量,每一個(gè)軟件項(xiàng)目都有一個(gè)最優(yōu)的測(cè)量量,最優(yōu)測(cè)量量,3.測(cè)試的方法與技術(shù),軟件測(cè)試的 策略和方法,靜態(tài) 測(cè)試方法,動(dòng)態(tài) 測(cè)試方法,人工測(cè)試方法,計(jì)算機(jī)輔助靜 態(tài)分析方法,白盒測(cè)試方法,黑盒測(cè)試方法,靜態(tài)測(cè)試:對(duì)軟件進(jìn)行分析、檢查和審閱,不實(shí)際運(yùn)行被測(cè)試的軟件。 靜態(tài)測(cè)試約可找出3070%的邏輯設(shè)計(jì)錯(cuò)誤。 對(duì)需求規(guī)格說(shuō)明書(shū)、軟件設(shè)計(jì)說(shuō)明書(shū)、源程序做檢查和審閱,包括: 是否符合標(biāo)準(zhǔn)和規(guī)范 通過(guò)結(jié)構(gòu)分析、流圖分析、符號(hào)執(zhí)行指出軟件缺陷,動(dòng)態(tài)測(cè)試:通過(guò)運(yùn)行軟件來(lái)檢驗(yàn)軟件的動(dòng)態(tài)行為和運(yùn)行結(jié)

17、果的正確性。 動(dòng)態(tài)測(cè)試的兩個(gè)基本要素: 被測(cè)試程序 測(cè)試數(shù)據(jù)(測(cè)試用例) 動(dòng)態(tài)測(cè)試方法 (1)選取定義域有效值,或定義域外無(wú)效值。 (2)對(duì)已選取值決定預(yù)期的結(jié)果 (3)用選取值執(zhí)行程序 (4)執(zhí)行結(jié)果與預(yù)期的結(jié)果相比,不吻合說(shuō)明程序有錯(cuò)。,兩種常用的動(dòng)態(tài)測(cè)試方法,黑盒測(cè)試 這種方法是把測(cè)試對(duì)象看做一個(gè)黑盒子,測(cè)試人員完全不考慮程序內(nèi)部的邏輯結(jié)構(gòu)和內(nèi)部特性,只依據(jù)程序的需求規(guī)格說(shuō)明書(shū),檢查程序的功能是否符合它的功能說(shuō)明。 黑盒測(cè)試又叫做功能測(cè)試,數(shù)據(jù)驅(qū)動(dòng)測(cè)試,基于規(guī)格說(shuō)明書(shū)的測(cè)試。,白盒測(cè)試 此方法把測(cè)試對(duì)象看做一個(gè)透明的盒子,它允許測(cè)試人員利用程序內(nèi)部的邏輯結(jié)構(gòu)及有關(guān)信息,設(shè)計(jì)或選擇測(cè)試用例

18、,對(duì)程序所有邏輯路徑進(jìn)行測(cè)試。 通過(guò)在不同點(diǎn)檢查程序的狀態(tài),確定實(shí)際的狀態(tài)是否與預(yù)期的狀態(tài)一致。因此白盒測(cè)試又稱開(kāi)盒測(cè)試、玻璃盒測(cè)試,或是結(jié)構(gòu)測(cè)試,邏輯驅(qū)動(dòng)測(cè)試,基于覆蓋的測(cè)試。,4.測(cè)試信息流,軟件配置:軟件需求規(guī)格說(shuō)明、軟件設(shè)計(jì)規(guī)格說(shuō)明、源代碼等; 測(cè)試配置:測(cè)試計(jì)劃、測(cè)試用例、測(cè)試程序等; 測(cè)試工具:測(cè)試數(shù)據(jù)自動(dòng)生成程序、靜態(tài)分析程序、動(dòng)態(tài)分析程序、測(cè)試結(jié)果分析程序、以及驅(qū)動(dòng)測(cè)試的測(cè)試數(shù)據(jù)庫(kù)等等。,測(cè)試結(jié)果分析:比較實(shí)測(cè)結(jié)果與預(yù)期結(jié)果,評(píng)價(jià)錯(cuò)誤是否發(fā)生。 調(diào)試(排錯(cuò)):對(duì)已經(jīng)發(fā)現(xiàn)的錯(cuò)誤進(jìn)行錯(cuò)誤定位和確定出錯(cuò)性質(zhì),并改正這些錯(cuò)誤,同時(shí)修改相關(guān)的文檔。 修正后的文檔再測(cè)試:直到通過(guò)測(cè)試為止。

19、,通過(guò)收集和分析測(cè)試結(jié)果數(shù)據(jù),對(duì)軟件建立可靠性模型 利用可靠性分析,評(píng)價(jià)軟件質(zhì)量: -軟件的質(zhì)量和可靠性達(dá)到可以接受的程度 -所做的測(cè)試不足以發(fā)現(xiàn)嚴(yán)重的錯(cuò)誤 如果測(cè)試發(fā)現(xiàn)不了錯(cuò)誤,可以肯定,測(cè)試配置考慮得不夠細(xì)致充分,錯(cuò)誤仍然潛伏在軟件中。,測(cè)試信息流,測(cè)試過(guò)程按4個(gè)步驟進(jìn)行,即單元測(cè)試、集成測(cè)試、確認(rèn)測(cè)試和系統(tǒng)測(cè)試。 開(kāi)始是單元測(cè)試,集中對(duì)用源代碼實(shí)現(xiàn)的每一個(gè)程序單元進(jìn)行測(cè)試,檢查各個(gè)程序模塊是否正確地實(shí)現(xiàn)了規(guī)定的功能。,軟件測(cè)試策略,集成測(cè)試把已測(cè)試過(guò)的模塊組裝起來(lái),主要對(duì)與設(shè)計(jì)相關(guān)的軟件體系結(jié)構(gòu)的構(gòu)造進(jìn)行測(cè)試。 確認(rèn)測(cè)試則是要檢查已實(shí)現(xiàn)的軟件是否滿足了需求規(guī)格說(shuō)明中確定了的各種需求,以及

20、軟件配置是否完全、正確。 系統(tǒng)測(cè)試把已經(jīng)經(jīng)過(guò)確認(rèn)的軟件納入實(shí)際運(yùn)行環(huán)境中,與其它系統(tǒng)成份組合在一起進(jìn)行測(cè)試。,7.3單元測(cè)試 (Unit Testing),單元測(cè)試又稱模塊測(cè)試,是針對(duì)軟件設(shè)計(jì)的最小單位 程序模塊,進(jìn)行正確性檢驗(yàn)的測(cè)試工作。其目的在于發(fā)現(xiàn)各模塊內(nèi)部可能存在的各種差錯(cuò)。 單元測(cè)試需要從程序的內(nèi)部結(jié)構(gòu)出發(fā)設(shè)計(jì)測(cè)試用例。多個(gè)模塊可以平行地獨(dú)立進(jìn)行單元測(cè)試。,1. 單元測(cè)試的內(nèi)容,在單元測(cè)試時(shí),測(cè)試者需要依據(jù)詳細(xì)設(shè)計(jì)說(shuō)明書(shū)和源程序清單,了解該模塊的I/O條件和模塊的邏輯結(jié)構(gòu),主要采用白盒測(cè)試的測(cè)試用例,輔之以黑盒測(cè)試的測(cè)試用例,使之對(duì)任何合理的輸入和不合理的輸入,都能鑒別和響應(yīng)。,(1

21、) 模塊接口測(cè)試,在單元測(cè)試的開(kāi)始,應(yīng)對(duì)通過(guò)被測(cè)模塊的數(shù)據(jù)流進(jìn)行測(cè)試。測(cè)試項(xiàng)目包括: 調(diào)用本模塊的輸入?yún)?shù)是否正確; 本模塊調(diào)用子模塊時(shí)輸入給子模塊的參數(shù)是否正確; 全局量的定義在各模塊中是否一致;,在做內(nèi)外存交換時(shí)要考慮: 文件屬性是否正確; OPEN與CLOSE語(yǔ)句是否正確; 緩沖區(qū)容量與記錄長(zhǎng)度是否匹配; 在進(jìn)行讀寫(xiě)操作之前是否打開(kāi)了文件; 在結(jié)束文件處理時(shí)是否關(guān)閉了文件; 正文書(shū)寫(xiě)輸入錯(cuò)誤, IO錯(cuò)誤是否檢查并做了處理。,(2) 局部數(shù)據(jù)結(jié)構(gòu)測(cè)試,不正確或不一致的數(shù)據(jù)類型說(shuō)明 使用尚未賦值或尚未初始化的變量 錯(cuò)誤的初始值或錯(cuò)誤的缺省值 變量名拼寫(xiě)錯(cuò)或書(shū)寫(xiě)錯(cuò) 不一致的數(shù)據(jù)類型 全局?jǐn)?shù)據(jù)對(duì)

22、模塊的影響,(3) 路徑測(cè)試,選擇適當(dāng)?shù)臏y(cè)試用例,對(duì)模塊中重要的執(zhí)行路徑進(jìn)行測(cè)試。 應(yīng)當(dāng)設(shè)計(jì)測(cè)試用例查找由于錯(cuò)誤的計(jì)算、不正確的比較或不正常的控制流而導(dǎo)致的錯(cuò)誤。 對(duì)基本執(zhí)行路徑和循環(huán)進(jìn)行測(cè)試可以發(fā)現(xiàn)大量的路徑錯(cuò)誤。,(4) 錯(cuò)誤處理測(cè)試,出錯(cuò)的描述是否難以理解 出錯(cuò)的描述是否能夠?qū)﹀e(cuò)誤定位 顯示的錯(cuò)誤與實(shí)際的錯(cuò)誤是否相符 對(duì)錯(cuò)誤條件的處理正確與否 在對(duì)錯(cuò)誤進(jìn)行處理之前,錯(cuò)誤條件是否已經(jīng)引起系統(tǒng)的干預(yù)等,(5) 邊界測(cè)試,注意數(shù)據(jù)流、控制流中剛好等于、大于或小于確定的比較值時(shí)出錯(cuò)的可能性。對(duì)這些地方要仔細(xì)地選擇測(cè)試用例,認(rèn)真加以測(cè)試。 如果對(duì)模塊運(yùn)行時(shí)間有要求的話,還要專門進(jìn)行關(guān)鍵路徑測(cè)試,以

23、確定最壞情況下和平均意義下影響模塊運(yùn)行時(shí)間的因素。,2. 單元測(cè)試的步驟,模塊并不是一個(gè)獨(dú)立的程序,在考慮測(cè)試模塊時(shí),同時(shí)要考慮它和外界的聯(lián)系,用一些輔助模塊去模擬與被測(cè)模塊相聯(lián)系的其它模塊。 驅(qū)動(dòng)模塊 (driver) 樁模塊 (stub) 存根模塊,如果一個(gè)模塊要完成多種功能,可以將這個(gè)模塊看成由幾個(gè)小程序組成。必須對(duì)其中的每個(gè)小程序先進(jìn)行單元測(cè)試要做的工作,對(duì)關(guān)鍵模塊還要做性能測(cè)試。 對(duì)支持某些標(biāo)準(zhǔn)規(guī)程的程序,更要著手進(jìn)行互聯(lián)測(cè)試。有人把這種情況特別稱為模塊測(cè)試,以區(qū)別單元測(cè)試。,7.4集成測(cè)試(Integrated Testing),集成測(cè)試 (組裝測(cè)試、聯(lián)合測(cè)試) 通常,在單元測(cè)試的

24、基礎(chǔ)上,需要將所有模塊按照設(shè)計(jì)要求組裝成為系統(tǒng)。這時(shí)需要考慮的問(wèn)題是: 在把各個(gè)模塊連接起來(lái)的時(shí)侯,穿越模塊接口的數(shù)據(jù)是否會(huì)丟失; 一個(gè)模塊的功能是否會(huì)對(duì)另一個(gè)模塊的功能產(chǎn)生不利的影響;,各個(gè)子功能組合起來(lái),能否達(dá)到預(yù)期要求的父功能; 全局?jǐn)?shù)據(jù)結(jié)構(gòu)是否有問(wèn)題; 單個(gè)模塊的誤差累積起來(lái),是否會(huì)放大,從而達(dá)到不能接受的程度。 在單元測(cè)試的同時(shí)可進(jìn)行集成測(cè)試 發(fā)現(xiàn)并排除在模塊連接中可能出現(xiàn)的問(wèn)題,最終構(gòu)成要求的軟件系統(tǒng)。,子系統(tǒng)的集成測(cè)試特別稱為部件測(cè)試,它所做的工作是要找出組裝后的子系統(tǒng)與系統(tǒng)需求規(guī)格說(shuō)明之間的不一致。 通常,把模塊組裝成為系統(tǒng)的方式有兩種 一次性集成方式 增殖式集成方式,1. 一

25、次性集成方式 (big bang),它是一種非增殖式集成方式,也叫做整體拼裝。 使用這種方式,首先對(duì)每個(gè)模塊分別進(jìn)行模塊測(cè)試,然后再把所有模塊組裝在一起進(jìn)行測(cè)試,最終得到要求的軟件系統(tǒng)。,2. 增殖式集成方式,這種集成方式又稱漸增式集成 首先對(duì)一個(gè)個(gè)模塊進(jìn)行模塊測(cè)試,然后將這些模塊逐步組裝成較大的系統(tǒng) 在組裝的過(guò)程中邊連接邊測(cè)試,以發(fā)現(xiàn)連接過(guò)程中產(chǎn)生的問(wèn)題 通過(guò)增殖逐步組裝成為要求的軟件系統(tǒng)。,(1) 自頂向下的增殖方式,這種集成方式將模塊按系統(tǒng)程序結(jié)構(gòu),沿控制層次自頂向下進(jìn)行集成。 自頂向下的增殖方式的主要優(yōu)點(diǎn)是不需要測(cè)試驅(qū)動(dòng)程序,能在測(cè)試階段早期驗(yàn)證系統(tǒng)主要的控制和判斷點(diǎn);缺點(diǎn)是需要存根程

26、序。 選用按深度方向組裝的方式,可以首先實(shí)現(xiàn)和驗(yàn)證一個(gè)完整的軟件功能。,(2) 自底向上的增殖方式,這種集成的方式是從程序模塊結(jié)構(gòu)的最底層的模塊開(kāi)始組裝和測(cè)試。 因?yàn)槟K是自底向上進(jìn)行組裝,對(duì)于一個(gè)給定層次的模塊,它的子模塊(包括子模塊的所有下屬模塊)已經(jīng)組裝并測(cè)試完成,所以不再需要樁模塊。在模塊的測(cè)試過(guò)程中需要從子模塊得到的信息可以直接運(yùn)行子模塊得到。,自頂向下增殖的方式和自底向上增殖的方式各有優(yōu)缺點(diǎn)。 一般來(lái)講,一種方式的優(yōu)點(diǎn)是另一種方式的缺點(diǎn)。,(3) 混合增殖式測(cè)試,衍變的自頂向下的增殖測(cè)試 基本上使用自頂向下的測(cè)試方法,但在早期使用自底向上的方法測(cè)試軟件中的少數(shù)關(guān)鍵模塊。 自底向上自

27、頂向下的增殖測(cè)試 對(duì)軟件結(jié)構(gòu)中較上層使用的自頂向下方法與對(duì)軟件結(jié)構(gòu)中較下層使用的自底向上方法相結(jié)合。,7.5確認(rèn)測(cè)試(Validation Testing),確認(rèn)測(cè)試又稱驗(yàn)收測(cè)試(Acceptance Testing),任務(wù)是驗(yàn)證軟件的有效性。 軟件有效性:如果軟件的功能和性能及其它特性與用戶的合理期望一致,那么軟件就是有效的。 對(duì)軟件的功能和性能要求在軟件需求規(guī)格說(shuō)明書(shū)中已經(jīng)明確規(guī)定。它包含的信息就是軟件確認(rèn)測(cè)試的基礎(chǔ)。,1. 進(jìn)行確認(rèn)測(cè)試(黑盒測(cè)試),確認(rèn)測(cè)試是在模擬的環(huán)境 (可能就是開(kāi)發(fā)的環(huán)境) 下,運(yùn)用黑盒測(cè)試的方法,驗(yàn)證被測(cè)軟件是否滿足需求規(guī)格說(shuō)明書(shū)列出的需求。 首先制定測(cè)試計(jì)劃,規(guī)

28、定要做測(cè)試的種類。還需要制定一組測(cè)試步驟,描述具體的測(cè)試用例。,通過(guò)實(shí)施預(yù)定的測(cè)試計(jì)劃和測(cè)試步驟,確定 軟件的特性是否與需求相符; 所有的文檔都是正確且便于使用; 同時(shí),對(duì)其它軟件需求,例如可移植性、兼容性、出錯(cuò)自動(dòng)恢復(fù)、可維護(hù)性等,也都要進(jìn)行測(cè)試,在全部軟件測(cè)試的測(cè)試用例運(yùn)行完后,所有的測(cè)試結(jié)果可以分為兩類: 測(cè)試結(jié)果與預(yù)期的結(jié)果相符。這說(shuō)明軟件的這部分功能或性能特征與需求規(guī)格說(shuō)明書(shū)相符合,從而這部分程序被接受。 測(cè)試結(jié)果與預(yù)期的結(jié)果不符。這說(shuō)明軟件的這部分功能或性能特征與需求規(guī)格說(shuō)明不一致,因此要為它提交一份問(wèn)題報(bào)告。,2. 軟件配置復(fù)查,軟件配置復(fù)查的目的是保證 軟件配置的所有成分都齊全

29、; 各方面的質(zhì)量都符合要求; 具有維護(hù)階段所必需的細(xì)節(jié); 而且已經(jīng)編排好分類的目錄。 應(yīng)當(dāng)嚴(yán)格遵守用戶手冊(cè)和操作手冊(cè)中規(guī)定的使用步驟,以便檢查這些文檔資料的完整性和正確性。,系統(tǒng)測(cè)試(System Testing),系統(tǒng)測(cè)試,是將通過(guò)確認(rèn)測(cè)試的軟件,作為整個(gè)基于計(jì)算機(jī)系統(tǒng)的一個(gè)元素,與計(jì)算機(jī)硬件、外設(shè)、某些支持軟件、數(shù)據(jù)和人員等其它系統(tǒng)元素結(jié)合在一起,在實(shí)際運(yùn)行環(huán)境下,對(duì)計(jì)算機(jī)系統(tǒng)進(jìn)行一系列的組裝測(cè)試和確認(rèn)測(cè)試。 系統(tǒng)測(cè)試的目的在于通過(guò)與系統(tǒng)的需求定義作比較, 發(fā)現(xiàn)軟件與系統(tǒng)的定義不符合或與之矛盾的地方。,3. 測(cè)試和測(cè)試,在軟件交付使用之后,用戶將如何實(shí)際使用程序,對(duì)于開(kāi)發(fā)者來(lái)說(shuō)是無(wú)法預(yù)測(cè)的

30、。 驗(yàn)收測(cè)試是以用戶為主的測(cè)試。軟件開(kāi)發(fā)人員和QA(質(zhì)量保證)人員也應(yīng)參加。 測(cè)試是由一個(gè)用戶在開(kāi)發(fā)環(huán)境下進(jìn)行的測(cè)試,也可以是公司內(nèi)部的用戶在模擬實(shí)際操作環(huán)境下進(jìn)行的測(cè)試。測(cè)試是在受控的環(huán)境中進(jìn)行的。,測(cè)試的目的是評(píng)價(jià)軟件產(chǎn)品的FLURPS(即功能、局域化、可使用性、可靠性、性能和支持)。尤其注重產(chǎn)品的界面和特色。 測(cè)試可以從軟件產(chǎn)品編碼結(jié)束之時(shí)開(kāi)始,或在模塊(子系統(tǒng))測(cè)試完成之后開(kāi)始,也可以在確認(rèn)測(cè)試過(guò)程中產(chǎn)品達(dá)到一定的穩(wěn)定和可靠程度之后再開(kāi)始。,測(cè)試是由軟件的多個(gè)用戶在實(shí)際使用環(huán)境下進(jìn)行的測(cè)試。這些用戶返回有關(guān)錯(cuò)誤信息給開(kāi)發(fā)者。 測(cè)試時(shí),開(kāi)發(fā)者通常不在測(cè)試現(xiàn)場(chǎng)。因而,測(cè)試是在開(kāi)發(fā)者無(wú)法控制

31、的環(huán)境下進(jìn)行的軟件現(xiàn)場(chǎng)應(yīng)用。 在測(cè)試中,由用戶記下遇到的所有問(wèn)題,包括真實(shí)的以及主觀認(rèn)定的,定期向開(kāi)發(fā)者報(bào)告。,測(cè)試主要衡量產(chǎn)品的FLURPS。著重于產(chǎn)品的支持性,包括文檔、客戶培訓(xùn)和支持產(chǎn)品生產(chǎn)能力。 只有當(dāng)測(cè)試達(dá)到一定的可靠程度時(shí),才能開(kāi)始測(cè)試。它處在整個(gè)測(cè)試的最后階段。同時(shí),產(chǎn)品的所有手冊(cè)文本也應(yīng)該在此階段完全定稿。,軟件人員使用白盒測(cè)試方法,主要想對(duì)程序模塊進(jìn)行如下的檢查: 對(duì)程序模塊的所有獨(dú)立的執(zhí)行路徑至少測(cè)試一次; 對(duì)所有的邏輯判定,取“真”與取“假”的兩種情況都至少測(cè)試一次; 在循環(huán)的邊界和運(yùn)行界限內(nèi)執(zhí)行循環(huán)體; 測(cè)試內(nèi)部數(shù)據(jù)結(jié)構(gòu)的有效性等。,7.6白盒測(cè)試技術(shù) (White-b

32、ox testing),7.6白盒測(cè)試技術(shù),白盒測(cè)試是根據(jù)被測(cè)程序的內(nèi)部邏輯結(jié)構(gòu)設(shè)計(jì)測(cè)試用例,力求提高測(cè)試覆蓋率。,白盒測(cè)試窮舉測(cè)試實(shí)例: 設(shè)程序含4個(gè)分支, 循環(huán)次數(shù)20, 從A到B的可能路徑 51+52+519+5201014 執(zhí)行時(shí)間: 設(shè)測(cè)試一次需2ms, 窮舉測(cè)試需6千多年,測(cè)試都不能進(jìn)行窮盡測(cè)試,所以軟件測(cè)試不可能發(fā)現(xiàn)程序中存在的所有錯(cuò)誤,因此需精心設(shè)計(jì)測(cè)試方案,力爭(zhēng)盡可能少的次數(shù),測(cè)出盡可能多的錯(cuò)誤。,1.邏輯覆蓋法,邏輯覆蓋是以程序內(nèi)部的邏輯結(jié)構(gòu)為基礎(chǔ)的設(shè)計(jì)測(cè)試用例的技術(shù)。它屬白盒測(cè)試。 (1)語(yǔ)句覆蓋 (2)判定覆蓋 (3)條件覆蓋 (4)判定條件覆蓋 (5)條件組合覆蓋 (

33、6)路徑覆蓋 (7)點(diǎn)覆蓋 (8)邊覆蓋,測(cè)試路徑圖,PROCEDURE SAMPLE (A,B:REAL; VAR X:REAL); BEGIN IF (A1) and (B=0) THEN X:=X/A IF (A=2) or (X1) THEN X:=X+1 END;,L1 ( s a c b e d ) = (A1) and (B=0) and (A=2) or (X/A1) = (A1) and (B=0) and (A=2) or (A1) and (B=0) and (X/A1) = (A=2) and (B=0) or (A1) and (B=0) and (X/A1) ,L2

34、 (s a b d ) = not(A1) and (B=0) and not(A=2) or (X1) = not (A1) or not (B=0) and not (A=2) and not (X1) = not (A1) and not (A=2) and not (X1) or not (B=0) and not (A=2) and not (X1) ,L3 ( s a b e d) = not (A1) and (B=0) and (A=2) or (X1) = not (A1) or not (B=0) and (A=2) or (X1) = not (A1) and (A=2)

35、 or not (A1) and (X1) or not (B=0) and (A=2) or not (B=0) and (X1) ,L4 ( s a c b d ) = (A1) and (B=0) and not (A=2) or (X/A1) = (A1) and (B=0) and not (A=2) and not (X/A1),測(cè)試路徑邏輯,(1) 語(yǔ)句覆蓋,語(yǔ)句覆蓋就是設(shè)計(jì)若干個(gè)測(cè)試用例,運(yùn)行被測(cè)程序,使得每一可執(zhí)行語(yǔ)句至少執(zhí)行一次。 在圖例中,正好所有的可執(zhí)行語(yǔ)句都在路徑 L1上,所以選擇路徑 L1設(shè)計(jì)測(cè)試用例,就可以覆蓋所有的可執(zhí)行語(yǔ)句。 測(cè)試用例的設(shè)計(jì)格式如下【輸入的(A

36、,B,X),輸出的(A,B,X)】 為圖例設(shè)計(jì)滿足語(yǔ)句覆蓋的測(cè)試用例是【(2,0,4),(2,0,3)】 覆蓋 sacbed【L1】 語(yǔ)句覆蓋是最弱的邏輯覆蓋。,(2) 判定覆蓋,判定覆蓋就是設(shè)計(jì)若干個(gè)測(cè)試用例,運(yùn)行時(shí),使得程序中不僅每一可執(zhí)行語(yǔ)句至少執(zhí)行一次,而且每個(gè)判斷的取真分支和取假分支至少執(zhí)行一次。 判定覆蓋又稱為分支覆蓋。 對(duì)于圖例,如果選擇路徑L1和L2, 就可得滿足要求的兩組測(cè)試用例: 【(2,0,4),(2,0,3)】覆蓋 sacbed【L1】 和【(1,1,1),(1,1,1)】覆蓋 sabd【L2】 【(3,0,3)】和【(2,1,1)】?jī)山M測(cè)試 用例也可覆蓋所有判定的真假

37、分支。 判定覆蓋仍是弱的邏輯覆蓋。,條件覆蓋就是設(shè)計(jì)若干個(gè)測(cè)試用例,運(yùn)行時(shí)使得程序中每一可執(zhí)行語(yǔ)句至少執(zhí)行一次,每個(gè)判斷的每個(gè)條件的可能取值至少執(zhí)行一次。 在圖例中,我們事先可對(duì)所有條件的取值加以標(biāo)記。例如, 對(duì)于第一個(gè)判斷: 條件 A1 取真為T1 ,取假為條件 B0 取真為T2 ,取假為 對(duì)于第二個(gè)判斷: 條件A2 取真為T3 ,取假為 條件X1 取真為T4 ,取假為,(3) 條件覆蓋,測(cè)試用例 通過(guò)路徑 覆蓋分支 滿足的條件 A B X 1 0 3 sabed(L3) 2,6 T2 T4 2 1 1 sabed(L3) 2,6 T1 T3 兩個(gè)測(cè)試用例覆蓋了四個(gè)條件八種可能取值。 未覆蓋

38、4,3分支,不滿足判定覆蓋的要求。 條件覆蓋不一定包含判定覆蓋。 判定覆蓋也不一定包含條件覆蓋。 3 0 3 sacbd(L4) 4,3 T1T2 2 1 1 sabed(L3) 2,6 T1 T3 2 0 4 sacbed(L1) 4,6 T1T2 T3 T4 1 1 1 sabd(L2) 2,3,測(cè)試用例 覆蓋分支 條件取值 【(2,0,4),(2,0,3)】 L1(4,6) 【(1,0,1),(1,0,1)】 L2(2,3) 【(2,1,1),(2,1,2)】 L3(2,6),判定-條件覆蓋就是設(shè)計(jì)足夠的測(cè)試用例,使得判斷中每個(gè)分支至少執(zhí)行一次,并且每個(gè)判斷中的每個(gè)條件的可能取值至少執(zhí)行

39、一次。 能同時(shí)滿足判定、條件兩種覆蓋標(biāo)準(zhǔn)的取值。,(4) 判定-條件覆蓋,測(cè)試用例 覆蓋分支 條件取值 【(2,0,4),(2,0,3)】 L1(4,6) 【(1,1,1),(1,1,1)】 L2(2,3),條件組合覆蓋就是設(shè)計(jì)足夠的測(cè)試用例,運(yùn)行被測(cè)程序,使得每個(gè)判斷的所有可能的條件取值組合至少執(zhí)行一次。 記 A1, B0 作 A1, B0 作 A1, B0 作 A1, B0 作 A2, X1 作 A2, X1 作 A2, X1 作 A2, X1 作,(5) 條件組合覆蓋,測(cè)試用例 覆蓋分支 覆蓋條件 覆蓋組合 【(2,0,4),(2,0,3)】L1(4,6) , 【(2,1,1),(2,1

40、,2)】L3(2,6) , 【(1,0,3),(1,0,4)】L3(2,6) , 【(1,1,1),(1,1,1)】L2(2,3) ,(6) 點(diǎn)覆蓋,點(diǎn)覆蓋,要求選取足夠多的測(cè)試數(shù)據(jù),使得程序執(zhí)行路徑至少經(jīng)過(guò)流圖的每個(gè)結(jié)點(diǎn)一次。 由于流圖的每個(gè)結(jié)點(diǎn)與一條或多條語(yǔ)句相對(duì)應(yīng),顯然點(diǎn)覆蓋標(biāo)準(zhǔn)和語(yǔ)句覆蓋標(biāo)準(zhǔn)是相同的。,(7) 邊覆蓋,邊覆蓋,要求選取足夠多的測(cè)試數(shù)據(jù),使得程序執(zhí)行路徑至少經(jīng)過(guò)流圖中的每條邊一次。 通常邊覆蓋標(biāo)準(zhǔn)和判定覆蓋標(biāo)準(zhǔn)是一致的。,(8) 路徑覆蓋,路徑覆蓋,選取足夠多的測(cè)試數(shù)據(jù),使得程序的每條可能路徑都至少執(zhí)行一次。 測(cè)試用例 覆蓋分支 覆蓋條件 【(2,0,4),(2,0,3)

41、】L1(4,6) 【(3,0,3),(3,0,1)】L4(4,3) 【(1,0,3),(1,0,4)】L3(2,6) 【(1,1,1),(1,1,1)】L2(2,3) 路徑覆蓋是很強(qiáng)的邏輯覆蓋。,路徑測(cè)試 基本路徑測(cè)試 條件測(cè)試路徑選擇 循環(huán)測(cè)試路徑選擇,2.控制結(jié)構(gòu)測(cè)試,路徑測(cè)試(Path testing),路徑測(cè)試就是設(shè)計(jì)足夠的測(cè)試用例,覆蓋程序中所有可能的路徑。 測(cè)試用例 通過(guò)路徑 覆蓋條件 【(2,0,4),(2,0,3)】L1(4,6) 【(1,1,1),(1,1,1)】L2(2,3) 【(1,1,2),(1,1,3)】L3(2,6) 【(3,0,3),(3,0,1)】L4(4,3)

42、,基本路徑測(cè)試,基本路徑測(cè)試方法是在程序的流圖的基礎(chǔ)上,分析程序的環(huán)形復(fù)雜性,導(dǎo)出基本可執(zhí)行路徑集合,設(shè)計(jì)測(cè)試用例的方法。設(shè)計(jì)出的測(cè)試用例要保證在測(cè)試中,程序的每一個(gè)可執(zhí)行語(yǔ)句至少要執(zhí)行一次,而且每個(gè)條件在執(zhí)行時(shí)都將分別取真、假兩種值。 基本路徑測(cè)試方法把覆蓋的路徑數(shù)壓縮到一定限度內(nèi),程序中的循環(huán)體最多只執(zhí)行一次。,基本路徑測(cè)試步驟: 導(dǎo)出程序流程圖的拓?fù)浣Y(jié)構(gòu)流圖(程序圖、控制流圖) 計(jì)算流圖G的環(huán)形復(fù)雜度V(G) 確定只包含獨(dú)立路徑的基本路徑集合 設(shè)計(jì)測(cè)試用例 獨(dú)立路徑(Independent paths):指至少引入程序的一個(gè)新處理語(yǔ)句集合或一個(gè)新條件的路徑。,程序的流圖,符號(hào)為流圖的一個(gè)

43、結(jié)點(diǎn),表示一個(gè)或多個(gè)源程序語(yǔ)句。箭頭為邊,表示控制流的方向。,在選擇或多分支結(jié)構(gòu)中,分支的匯聚處應(yīng)有一個(gè)匯聚結(jié)點(diǎn)。 邊和結(jié)點(diǎn)圈定的面積叫做區(qū)域,當(dāng)對(duì)區(qū)域計(jì)數(shù)時(shí),圖形外的區(qū)域也應(yīng)記為一個(gè)區(qū)域。 如果判斷中的條件表達(dá)式是由一個(gè)或多個(gè)邏輯運(yùn)算符(OR,AND,NAND,NOR)連接的復(fù)合條件表達(dá)式,則需要改為一系列只有單個(gè)條件的嵌套的判斷。,導(dǎo)出程序流程圖的拓?fù)浣Y(jié)構(gòu)-流圖,1,2,3,6,4,5,7,10,11,節(jié)點(diǎn),邊,R4,區(qū)域,1,2,3,4,5,8,7,6,9,11,8,9,R1,R2,R3,10,計(jì)算流圖G的環(huán)形復(fù)雜度CC的不同方法 (Cyclomatic complexity) CC=區(qū)

44、域個(gè)數(shù)=4 CC=E-N+2=11-9+2=4 CC=判定節(jié)點(diǎn)個(gè)數(shù)+1=3+1=4,確定只包含獨(dú)立路徑的基本路徑集 程序的環(huán)形復(fù)雜度給出了程序基本路徑集中的獨(dú)立路徑條數(shù),這是確保程序中每個(gè)可執(zhí)行語(yǔ)句至少執(zhí)行一次所必需的測(cè)試用例數(shù)目的上界。 從控制流圖來(lái)看,一條獨(dú)立路徑是至少包含一條在其它獨(dú)立路徑中從未有過(guò)的邊的路徑。,例如,在圖示的控制流圖中,一組獨(dú)立的路徑是path1:1-11path2:1-2-3-4-5-10-1-11path3:1-2-3-6-8-9-10-1-11path4:1-2-3-6-7-9-10-1-11 一條新路徑必須包含一條新邊 路徑 path1,path2,path3,

45、path4組成了控制流圖的一個(gè)基本路徑集。 環(huán)形復(fù)雜度4是構(gòu)成這個(gè)基本路徑集的獨(dú)立路徑的數(shù)量,也是設(shè)計(jì)測(cè)試用例的數(shù)目。,設(shè)計(jì)測(cè)試用例,保證基本路徑集中每條路徑的執(zhí)行 根據(jù)判斷結(jié)點(diǎn)給出的條件,選擇適當(dāng)?shù)臄?shù)據(jù)以保證某一條路徑可以被測(cè)試到 用邏輯覆蓋方法。 每個(gè)測(cè)試用例執(zhí)行之后,與預(yù)期結(jié)果進(jìn)行比較。如果所有測(cè)試用例都執(zhí)行完畢,則可以確信程序中所有的可執(zhí)行語(yǔ)句至少被執(zhí)行了一次。 必須注意,一些獨(dú)立的路徑(如例中的路徑1),往往不是完全孤立的,有時(shí)它是程序正常的控制流的一部分,這時(shí),這些路徑的測(cè)試可以是另一條路徑測(cè)試的一部分。,條件測(cè)試路徑選擇,當(dāng)程序中判定多于一個(gè)時(shí),形成的分支結(jié)構(gòu)可以分為兩類:嵌套型

46、分支結(jié)構(gòu)和串接(連鎖)型分支結(jié)構(gòu)。 對(duì)于嵌套型分支結(jié)構(gòu),若有n個(gè)判定語(yǔ)句,需要n+1個(gè)測(cè)試用例; 對(duì)于串接(連鎖)型分支結(jié)構(gòu),若有n個(gè)判定語(yǔ)句,需要有2n個(gè)測(cè)試用例,覆蓋它的2n條路徑。當(dāng)n較大時(shí)將無(wú)法測(cè)試。,循環(huán)測(cè)試路徑選擇,循環(huán)分為4種不同類型:簡(jiǎn)單循環(huán)、串接(連鎖)循環(huán)、嵌套循環(huán)和非結(jié)構(gòu)循環(huán)。,(1)簡(jiǎn)單循環(huán)(設(shè)n是循環(huán)允許的最大次數(shù)) 零次循環(huán):從循環(huán)入口到出口,跳過(guò)循環(huán) 一次循環(huán):檢查循環(huán)初始值 二次循環(huán):通過(guò)循環(huán)兩次 m次循環(huán): 通過(guò)循環(huán)m次,mn-1 最大次數(shù)循環(huán)n、比最大次數(shù)少一次n-1、比最大次數(shù)多一次n+1的循環(huán)。,(2) 嵌套循環(huán) 對(duì)最內(nèi)層循環(huán)做簡(jiǎn)單循環(huán)的全部測(cè)試。所有其

47、它層的循環(huán)變量置為最小值; 逐步外推,對(duì)其外面一層循環(huán)進(jìn)行測(cè)試。測(cè)試時(shí)保持所有外層循環(huán)的循環(huán)變量取最小值,所有其它嵌套內(nèi)層循環(huán)的循環(huán)變量取“典型”值。 反復(fù)進(jìn)行,直到所有各層循環(huán)測(cè)試完畢。 對(duì)全部各層循環(huán)同時(shí)取最小循環(huán)次數(shù),或者同時(shí)取最大循環(huán)次數(shù),(3)串接(連鎖)循環(huán) 如果各個(gè)循環(huán)互相獨(dú)立,則可以用與簡(jiǎn)單循環(huán)相同的方法進(jìn)行測(cè)試。但如果幾個(gè)循環(huán)不是互相獨(dú)立的,則需要使用測(cè)試嵌套循環(huán)的辦法來(lái)處理。 (4)非結(jié)構(gòu)循環(huán) 這一類循環(huán)應(yīng)該使用結(jié)構(gòu)化程序設(shè)計(jì)方法重新設(shè)計(jì)。,黑盒測(cè)試方法是在程序接口上進(jìn)行測(cè)試,主要是為了發(fā)現(xiàn)以下錯(cuò)誤: 是否有不正確或遺漏了的功能? 在接口上,輸入能否正確地接受? 能否輸出正

48、確的結(jié)果? 是否有數(shù)據(jù)結(jié)構(gòu)錯(cuò)誤或外部信息(例如數(shù)據(jù)文件)訪問(wèn)錯(cuò)誤? 性能上是否能夠滿足要求? 是否有初始化或終止性錯(cuò)誤? 用黑盒測(cè)試發(fā)現(xiàn)程序中的錯(cuò)誤,必須在所有可能的輸入條件和輸出條件中確定測(cè)試數(shù)據(jù),來(lái)檢查程序是否都能產(chǎn)生正確的輸出。但這是不可能的。,7.7黑盒測(cè)試技術(shù) (Black-box testing),等價(jià)類劃分 邊界值分析 錯(cuò)誤推測(cè)法,等價(jià)類劃分(Equivalence partitioning),等價(jià)類劃分方法是一種典型的黑盒測(cè)試方法。等價(jià)類劃分方法把所有可能的輸入數(shù)據(jù),即程序的輸入域劃分成若干等價(jià)類(每個(gè)等價(jià)類中的一個(gè)典型值在測(cè)試中的作用與這一類中所有其它值的作用相同),然后從每

49、個(gè)等價(jià)類中選取少數(shù)有代表性的數(shù)據(jù)做為測(cè)試用例。 使用這一方法設(shè)計(jì)測(cè)試用例要經(jīng)歷劃分等價(jià)類(列出等價(jià)類表)和選取測(cè)試用例兩步。,等價(jià)類是指某個(gè)輸入域的子集合。在該子集合中,各個(gè)輸入數(shù)據(jù)對(duì)于揭露程序中的錯(cuò)誤都是等效的。測(cè)試某等價(jià)類的代表值就等價(jià)于對(duì)這一類其它值的測(cè)試。 等價(jià)類的劃分有兩種不同的情況: 有效等價(jià)類(正向集):是指對(duì)于程序的規(guī)格說(shuō)明來(lái)說(shuō),是合理的,有意義的輸入數(shù)據(jù)構(gòu)成的集合。 無(wú)效等價(jià)類(反向集):是指對(duì)于程序的規(guī)格說(shuō)明來(lái)說(shuō),是不合理的,無(wú)意義的輸入數(shù)據(jù)構(gòu)成的集合。 在設(shè)計(jì)測(cè)試用例時(shí),要同時(shí)考慮有效等價(jià)類和無(wú)效等價(jià)類的設(shè)計(jì)。,劃分等價(jià)類,(1)如果輸入條件規(guī)定了取值范圍,則可以確立一個(gè)

50、有效等價(jià)類和兩個(gè)無(wú)效等價(jià)類。 例,在程序的規(guī)格說(shuō)明中,對(duì)輸入條件有一句話: “ 項(xiàng)數(shù)可以從1到999 ” 則有效等價(jià)類是“1項(xiàng)數(shù)999”兩個(gè)無(wú)效等價(jià)類是“項(xiàng)數(shù)1”或“項(xiàng)數(shù)999”。 例,輸入值是學(xué)生成績(jī),范圍是0100,劃分等價(jià)類的原則,0 100,有效等價(jià)類 0成績(jī)100,無(wú)效等價(jià)類 成績(jī)100,無(wú)效等價(jià)類 成績(jī)0,(2)如果輸入條件規(guī)定了輸入值的集合,或者是規(guī)定了“必須如何”的條件,這時(shí)可確立一個(gè)有效等價(jià)類和一個(gè)無(wú)效等價(jià)類。 例,在Pascal語(yǔ)言中對(duì)變量標(biāo)識(shí)符規(guī)定為“以字母打頭的串”。那么所有以字母打頭的構(gòu)成有效等價(jià)類,而不在此集合內(nèi)(不以字母打頭)的歸于無(wú)效等價(jià)類。,(3)如果規(guī)定了輸

51、入數(shù)據(jù)的一組值,而且程序要對(duì)每個(gè)輸入值分別進(jìn)行處理。這時(shí)可為每一個(gè)輸入值確立一個(gè)有效等價(jià)類,此外針對(duì)這組值確立一個(gè)無(wú)效等價(jià)類,它是所有不允許的輸入值的集合。 例,輸入條件說(shuō)明學(xué)歷可為:??啤⒈究?、碩士、博士四種之一,則分別取這四個(gè)值作為四個(gè)有效等價(jià)類,另外把四種學(xué)歷之外的任何學(xué)歷作為無(wú)效等價(jià)類。,(4)如果規(guī)定了輸入數(shù)據(jù)必須遵守的規(guī)則,則可以確立一個(gè)有效等價(jià)類(符合規(guī)則)和若干個(gè)無(wú)效等價(jià)類(從不同角度違反規(guī)則)。 例:Pascal語(yǔ)言規(guī)定“一個(gè)語(yǔ)句必須以分號(hào);結(jié)束”。這時(shí),可以確定一個(gè)有效等價(jià)類“以;結(jié)束”,若干個(gè)無(wú)效等價(jià)類“以:結(jié)束”、“以,結(jié)束”、“以、結(jié)束”等。,在確立了等價(jià)類之后,建立

52、等價(jià)類表,列出所有劃分出的等價(jià)類。 再?gòu)膭澐殖龅牡葍r(jià)類中按以下原則選擇測(cè)試用例: 為每一個(gè)等價(jià)類規(guī)定一個(gè)唯一編號(hào); 設(shè)計(jì)一個(gè)新的測(cè)試用例,使其盡可能多地覆蓋尚未被覆蓋的有效等價(jià)類,重復(fù)這一步,直到所有的有效等價(jià)類都被覆蓋為止; 設(shè)計(jì)一個(gè)新的測(cè)試用例,使其僅覆蓋一個(gè)尚未被覆蓋的無(wú)效等價(jià)類,重復(fù)這一步,直到所有的無(wú)效等價(jià)類都被覆蓋為止。,確立測(cè)試用例,示例,例:某報(bào)表處理系統(tǒng)要求用戶輸入處理報(bào)表的日期,日期限制在2003年1月至2008年12月,即系統(tǒng)只能對(duì)該段期間內(nèi)的報(bào)表進(jìn)行處理,如日期不在此范圍內(nèi),則顯示輸入錯(cuò)誤信息。 系統(tǒng)日期規(guī)定由年、月的6位數(shù)字字符組成,前四位代表年,后兩位代表月。 如何

53、用等價(jià)類劃分法設(shè)計(jì)測(cè)試用例,來(lái)測(cè)試程序的日期檢查功能?,第一步:等價(jià)類劃分,輸入條件 有效等價(jià)類 無(wú)效等價(jià)類,報(bào)表日期的 類型及長(zhǎng)度,6位數(shù)字字符(1),有非數(shù)字字符 (4) 少于6個(gè)數(shù)字字符 (5) 多于6個(gè)數(shù)字字符 (6),年份范圍,在20032008 之間 (2),小于2003 (7) 大于2008 (8),月份范圍,在112之間(3),“報(bào)表日期”輸入條件的等價(jià)類表,小于1 (9) 大于12 (10),第二步:為有效等價(jià)類設(shè)計(jì)測(cè)試用例,測(cè)試數(shù)據(jù) 期望結(jié)果 覆蓋范圍,200306,等價(jià)類(1)(2)(3),輸入有效,對(duì)表中編號(hào)為1,2,3的3個(gè)有效等價(jià)類用一個(gè)測(cè)試用例覆蓋:,(1)6位數(shù)

54、字字符 (2)年在20032008之間 (3)月在112之間,測(cè)試數(shù)據(jù) 期望結(jié)果 覆蓋范圍,003MAY 輸入無(wú)效 等價(jià)類(4) 20035 輸入無(wú)效 等價(jià)類(5) 2003005 輸入無(wú)效 等價(jià)類(6) 200105 輸入無(wú)效 等價(jià)類(7) 200905 輸入無(wú)效 等價(jià)類(8) 200300 輸入無(wú)效 等價(jià)類(9) 200313 輸入無(wú)效 等價(jià)類(10),不能出現(xiàn)相同 的測(cè)試用例,本例的10個(gè)等價(jià)類至 少需要8個(gè)測(cè)試用例,第三步:為每一個(gè)無(wú)效等價(jià)類至少 設(shè)計(jì)一個(gè)測(cè)試用例,準(zhǔn)考證號(hào)數(shù)據(jù)格式定義:共6位數(shù)字組成,其中第一位 為專業(yè)代號(hào):1-行政專業(yè),2-法律專業(yè),3-財(cái)經(jīng)專業(yè) 后5位為考生順序號(hào)

55、,編碼范圍為: 行政專業(yè)準(zhǔn)考證號(hào)碼為:110001111215 法律專業(yè)準(zhǔn)考證號(hào)碼為:210001212006 財(cái)經(jīng)專業(yè)準(zhǔn)考證號(hào)碼為:310001314015,準(zhǔn)考證號(hào)碼的等價(jià)類劃分 有效等價(jià)類:(1) 110001 111215 (2) 210001 212006 (3) 310001 314015 無(wú)效等價(jià)類:(4) - 110000 (5) 111216 210000 (6) 212007 31000 (7) 314016 + ,例:對(duì)招干考試系統(tǒng)“輸入學(xué)生成績(jī)”子模塊設(shè)計(jì)測(cè)試錄入準(zhǔn)考證號(hào)的測(cè)試用例,例:在某一PASCAL語(yǔ)言版本中規(guī)定:“標(biāo)識(shí)符是由字母開(kāi)頭,后跟字母或數(shù)字的任意組合構(gòu)成

56、。有效字符數(shù)為8個(gè),最大字符數(shù)為80個(gè)?!辈⑶乙?guī)定“標(biāo)識(shí)符必須先說(shuō)明,再使用”,“在同一說(shuō)明語(yǔ)句中,標(biāo)識(shí)符至少必須有一個(gè)。” 用等價(jià)類劃分方法,建立輸入等價(jià)類表:,下面選取了9個(gè)測(cè)試用例,它們覆蓋了所有的等價(jià)類 VAR x,T1234567:REAL; BEGIN x := 3.414; T1234567 := 2.732; . (1), (2), (4), (8), (9), (12), (14) VAR :REAL; (3) VAR x,:REAL; (5) VAR T12345678:REAL; (6) VAR T12345.:REAL; (7) 多于80個(gè)字符 VAR T$:CHAR;

57、 (10) VAR GOTO:INTEGER; (11) VAR 2T:REAL; (13) VAR PAR:REAL; (15) BEGIN . PAP := SIN (3.14 * 0.8) / 6;,2.邊界值分析,邊界值分析也是一種黑盒測(cè)試方法,是對(duì)等價(jià)類劃分方法的補(bǔ)充。 人們從長(zhǎng)期的測(cè)試工作經(jīng)驗(yàn)得知,大量的錯(cuò)誤是發(fā)生在輸入或輸出范圍的邊界上,而不是在輸入范圍的內(nèi)部。因此針對(duì)各種邊界情況設(shè)計(jì)測(cè)試用例,可以查出更多的錯(cuò)誤。,軟件邊界與懸崖很類似 如果在懸崖峭壁邊可以自信地安全行走,平地就不在話下。,比如,在做三角形計(jì)算時(shí),要輸入三角形的三個(gè)邊長(zhǎng):A、B和C。 我們應(yīng)注意到,要構(gòu)成三角形,

58、這三個(gè)數(shù)值應(yīng)當(dāng)滿足 A0、 B0、 C0、 ABC、 ACB、 BCA。 但如果把六個(gè)不等式中的任何一個(gè)大于號(hào)“”錯(cuò)寫(xiě)成大于等于號(hào)“”,那就不能構(gòu)成三角形。問(wèn)題恰出現(xiàn)在容易被疏忽的邊界附近。,這里所說(shuō)的邊界是指,相對(duì)于輸入等價(jià)類和輸出等價(jià)類而言,稍高于其邊界值及稍低于其邊界值的一些特定情況。 使用邊界值分析方法設(shè)計(jì)測(cè)試用例,首先應(yīng)確定邊界情況。應(yīng)當(dāng)選取正好等于,剛剛大于,或剛剛小于邊界的值做為測(cè)試數(shù)據(jù),而不是選取等價(jià)類中的典型值或任意值做為測(cè)試數(shù)據(jù)。,測(cè)試臨近邊界的合法數(shù)據(jù),以及剛超過(guò)邊界的非法數(shù)據(jù)。,3.錯(cuò)誤推測(cè)(error guessing),可以靠經(jīng)驗(yàn)和直覺(jué)推測(cè)程序中可能存在的各種錯(cuò)誤,

59、從而有針對(duì)性地編寫(xiě)檢查這些錯(cuò)誤的例子。這就是錯(cuò)誤推測(cè)法。 錯(cuò)誤推測(cè)法的基本想法是:列舉出程序中所有可能有的錯(cuò)誤和容易發(fā)生錯(cuò)誤的特殊情況,根據(jù)它們選擇測(cè)試用例。 例如,如果輸入或輸出的數(shù)目允許變化(如檢索的或生成的表的項(xiàng)數(shù)),則輸入或輸出的數(shù)目為0和1的情況(如表為空或只有一項(xiàng))是容易出錯(cuò)的情況。,黑盒測(cè)試與白盒測(cè)試比較,黑盒測(cè)試 白盒測(cè)試,優(yōu) 點(diǎn),缺 點(diǎn),性 質(zhì),適用于各階段測(cè)試 從產(chǎn)品功能角度測(cè)試 容易入手生成測(cè)試數(shù)據(jù),可構(gòu)造測(cè)試數(shù)據(jù)使特定程 序部分得到測(cè)試 有一定的充分性度量手段 可獲較多工具支持,某些代碼得不到測(cè)試 如果規(guī)格說(shuō)明有誤, 則無(wú)法發(fā)現(xiàn) 不易進(jìn)行充分性測(cè)試,不易生成測(cè)試數(shù)據(jù)(通

60、常) 無(wú)法對(duì)未實(shí)現(xiàn)規(guī)格說(shuō)明的 部分進(jìn)行測(cè)試 工作量大,通常只用于單 元測(cè)試,有應(yīng)用局限,是一種確認(rèn)(validation)技術(shù) 回答“我們?cè)跇?gòu)造一個(gè)正確的系統(tǒng)嗎?”,是一種驗(yàn)證(verification)技術(shù) 回答“我們?cè)谡_地構(gòu)造一個(gè)系統(tǒng)嗎?”,7.8調(diào)試(Debug),調(diào)試(即排錯(cuò))與成功的測(cè)試形影相隨。成功的測(cè)試發(fā)現(xiàn)了錯(cuò)誤;而調(diào)試是確定錯(cuò)誤的原因和準(zhǔn)確位置,并加以改正。 調(diào)試是把錯(cuò)誤的外部表現(xiàn)和它的內(nèi)在原因聯(lián)系起來(lái)的目前尚未被人深入認(rèn)識(shí)的智力過(guò)程,所以它仍是一項(xiàng)技巧,是軟件開(kāi)發(fā)過(guò)程中最艱巨的腦力勞動(dòng)。,調(diào)試工作困難的原因,非技術(shù)原因:開(kāi)發(fā)人員心理方面的原因。 錯(cuò)誤的癥狀和原因所處的位置可

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論