全面的面向?qū)ο筌浖臏y試基本知識介紹_第1頁
全面的面向?qū)ο筌浖臏y試基本知識介紹_第2頁
全面的面向?qū)ο筌浖臏y試基本知識介紹_第3頁
全面的面向?qū)ο筌浖臏y試基本知識介紹_第4頁
全面的面向?qū)ο筌浖臏y試基本知識介紹_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、面向?qū)ο筌浖臏y試面向?qū)ο筌浖臏y試 本章要點本章要點 面向?qū)ο筌浖臏y試與傳統(tǒng)軟件的區(qū)別; 類測試價值的評估方法; 類測試用例設(shè)計方法; 特殊類的測試方法; 劃分面向?qū)ο筌浖y試的方法; 開源工具Junit的使用方法。 本章目標(biāo)本章目標(biāo) 了解面向?qū)ο蟮臏y試與傳統(tǒng)軟件測試的異同; 掌握類測試的基礎(chǔ)知識; 重點理解針對抽象類以及接口類等特殊類的測試技巧,設(shè)計類測試用例和測試驅(qū)動程序的幾種方法; 初步了解Junit,并掌握安裝和卸載此工具的方法,以及如何使用它進行簡單的測試。 面向?qū)ο蟮臏y試與傳統(tǒng)測試的比較面向?qū)ο蟮臏y試與傳統(tǒng)測試的比較 傳統(tǒng)的測試計算機軟件的策略是從“小型測試”開始,逐步走向“大

2、型測試”,且單元測試集中在最小的可編譯程序單位子程序。 面向?qū)ο蟪绦虻慕Y(jié)構(gòu)不再是傳統(tǒng)的功能模塊結(jié)構(gòu),而是作為一個整體,并且對每個開發(fā)階段都有不同以往的要求和結(jié)果,已經(jīng)不可能用功能細(xì)化的觀點來檢測面向?qū)ο蠓治龊驮O(shè)計的結(jié)果。 面向?qū)ο蟮能浖y試分為:面向?qū)ο蠓治龅臏y試,面向?qū)ο笤O(shè)計的測試,面向?qū)ο缶幊痰臏y試, 面向?qū)ο髥卧獪y試,面向?qū)ο蠹蓽y試,面向?qū)ο笙到y(tǒng)測試。 1、傳統(tǒng)的面向過程分析與面向?qū)ο蠓治觯∣OA) 2、結(jié)構(gòu)化的設(shè)計方法與面向?qū)ο笤O(shè)計(OOD) 3、典型的面向?qū)ο蟪绦蚓哂欣^承、封裝和多態(tài)的新特性。 4、傳統(tǒng)的單元測試的對象是軟件設(shè)計的最小單位模塊。 5、傳統(tǒng)的集成測試,主要有兩種通過集

3、成完成的功能模塊進行測試的方式:自頂向下集成 自底向上集成。 6、為了保證軟件的功能完整性,除了單元測試和集成測試,還必須經(jīng)過規(guī)范的系統(tǒng)測試。信息隱蔽對測試的影響信息隱蔽對測試的影響 類的重要作用之一是信息隱蔽。它對類中所封裝的信息的存取進行控制,從而避免類中有關(guān)實現(xiàn)細(xì)節(jié)的信息被錯誤地使用。該隱蔽機制給測試帶來了困難。封裝和繼承對測試的影響封裝和繼承對測試的影響 若一個類得到了充分的測試,當(dāng)其被子類繼承若一個類得到了充分的測試,當(dāng)其被子類繼承后,繼承的方法在子類的環(huán)境中的行為特征需要后,繼承的方法在子類的環(huán)境中的行為特征需要重新測試。重新測試。 多態(tài)性對測試的影響多態(tài)性對測試的影響 傳統(tǒng)軟件測

4、試中經(jīng)常使用靜態(tài)分析技術(shù)對代碼進行分析;面向?qū)ο筌浖?,由于動態(tài)綁定和多態(tài)性的存在所帶來的不確定性,給測試覆蓋率的滿足增大了難度。類測試基礎(chǔ)類測試基礎(chǔ) 1 1、類測試概念、類測試概念:驗證類的實現(xiàn)是否和該類的說明完全一致。 2 2、類測試的方法、類測試的方法:通過代碼檢查或執(zhí)行測試用例的方法來有效地進行類測試。(后者優(yōu)于前者)。 3 3、類測試人員、類測試人員 類測試通常由開發(fā)人員來進行;(會帶來好處和不足之處)。4 4、類測試時間、類測試時間 類的測試伴隨著開發(fā)過程中的各個階段,當(dāng)類的說明或?qū)崿F(xiàn)發(fā)生變化時應(yīng)該執(zhí)行回歸測試。5 5、類測試過程、類測試過程 為類創(chuàng)建實例-創(chuàng)造適當(dāng)?shù)沫h(huán)境-運行測試

5、用例(向一個實例發(fā)送一個或多個消息)-通過參數(shù)來檢查測試運行的結(jié)果-清除執(zhí)行測試用例所需的測試環(huán)境。 類在類在UMLUML中的描述中的描述 UML(Unified Modeling Language)語言是一種支持對象技術(shù)的建模語言,是在計算機系統(tǒng)中表示真實世界的語言,描述真實世界中的對象和它們之間的關(guān)系,支持應(yīng)用的開發(fā)。 在UML中,用來表示類的符號是矩形,并劃分為三個區(qū)域,分別是: 名稱區(qū)域:顯示類的名稱 屬性區(qū)域:顯示在類中定義的變量。 操作區(qū)域:顯示在類中定義的方法。 如圖-1所示:ClassNameAttributesOperation()ClassNameAttributesOpe

6、ration()InterfaceOperation()具體類抽象類接口類圖-1 類的UML表示法 類之間的關(guān)系分為六類,分別是關(guān)聯(lián)、泛化、實現(xiàn)、依賴、聚合和組合。每種關(guān)系分別使用不同的符號來表示(如:表-1所示),并分別用私有的、保護的和公有的三個關(guān)鍵字來修飾類(如:表-2所示)。表-1 UML類圖符號描述 關(guān)鍵詞UML符號說明泛化關(guān)聯(lián)實現(xiàn)依賴聚合組合同一層次可見用作定義其他類的基類用作定義其他類的接口一方調(diào)用另一方的部分一方是另一方的部分一方是另一方的必要組成部分1.n1表-2 UML類圖作用域描述類測試的價值類測試的價值 選擇將每個類作為一個單元進行單獨的測試,還是將其同其他類綁定進行集

7、成測試,需要使用如下3個要素來進行測試價值的評估:關(guān)鍵詞UML符號說明私有保護公有-#+私有的,只在當(dāng)前類中可見保護的,只對繼承的類中可見公共的,所有的關(guān)聯(lián)對象都是可見的 1、類本身的復(fù)雜程度 2、類在整個系統(tǒng)中的層次 3、開發(fā)該類測試驅(qū)動程序需要投入的成本 4、類本身的風(fēng)險程度類測試用例設(shè)計類測試用例設(shè)計 一般基于如下一般基于如下3個標(biāo)準(zhǔn)設(shè)計測試系列,即基于個標(biāo)準(zhǔn)設(shè)計測試系列,即基于狀態(tài)的覆蓋率、基于限制的覆蓋率和基于代碼的狀態(tài)的覆蓋率、基于限制的覆蓋率和基于代碼的覆蓋率。覆蓋率。 設(shè)計測試用例的方法有多種: (例子詳見教材) 1、根據(jù)前置和后置條件確定測試用例 2、根據(jù)狀態(tài)轉(zhuǎn)換確定測試用例

8、 3、根據(jù)訪問控制修飾符(限定類、屬性或方法被程序里的其他部分訪問和調(diào)用的修飾符)來確定測試用例。 類測試驅(qū)動程序設(shè)計類測試驅(qū)動程序設(shè)計 從開發(fā)的角度:測試驅(qū)動的基本思想是在對設(shè)計 之前先考慮好測試代碼; 從測試的角度:為了執(zhí)行測試,運行測試用例, 找出軟件中隱藏的BUG。 因此,測試驅(qū)動程序的構(gòu)建應(yīng)該簡單、透明、易維護,能夠提供盡可能多的服務(wù),同時兼顧自增量更新,更理想的情況就是能夠復(fù)用已存在的測試驅(qū)動程序的代碼。 編寫類測試驅(qū)動程序的方法有很多種 ,以Java語言為例來說明測試驅(qū)動程序設(shè)計的結(jié)構(gòu)。 (主要以兩票系統(tǒng)為例講解,詳見教材) 1、在main方法中寫入需要運行的測試用例,即實現(xiàn)ma

9、in方法,然后編譯、執(zhí)行該類。 2、在類中實現(xiàn)一個靜態(tài)測試方法,通過調(diào)用該測試方法來收集每個測試用例的執(zhí)行結(jié)果。 3、實現(xiàn)獨立的測試類,它的職責(zé)是執(zhí)行并收集每個測試用例的結(jié)果。 類測試的延伸類測試的延伸 本節(jié)將簡要介紹類測試構(gòu)造思想以及如何對接口類、抽象類等進行測試的方法。 一、繼承層次結(jié)構(gòu)中類的測試 繼承是實現(xiàn)接口和代碼復(fù)用的有效機制。根據(jù)繼承機制的特點,父類中被測試用例所測試的代碼被子類繼承,只要父類代碼沒有被子類“覆蓋”,那么就不用重新創(chuàng)建這些測試用例。 圖-6顯示了各類之間的繼承關(guān)系: Class_A+operation1()+operation2()Class_B+operation

10、3()Class_C+operation2()+operation3()圖-6 類之間的繼承關(guān)系Class_A類有兩個實例方法operation1()和operation2(),Class_B類繼承了Class_A類并且實現(xiàn)了新的實例方法operation3(),Class_C類繼承了Class_B類,覆蓋了Class_B類的實例方法operation3()和實例方法operation2(). 根據(jù)圖-6中這三個類之間的區(qū)別,可以確定繼承的測試用例中是否需要產(chǎn)生新的子類測試用例,哪些測試用例適用于測試子類,哪些測試用例在測試子類中不必執(zhí)行,如下表-7所示:類繼承類類方法是否改變是否增加測試用例

11、Class_AClass_BClass_BClass_AClass_Coperation1()operation2()operation3()operation2()operation1()operation3()operation2()operation1()FalseFalseFalseTrueTrueTrueFalseFalseTrueFalseTrueTrue 由此,可以得出繼承層次結(jié)構(gòu)中類測試的測試用例可以采用如下增補原則: 1)如果子類新增了一個或者多個新的操作,就需要增加相應(yīng)的測試用例。 2)如果子類定義的同名方法覆蓋了父類的方法,就需要增加相應(yīng)的測試用例。 那么,在具體構(gòu)建類測

12、試用例時可以采用如圖-7所示的結(jié)構(gòu)。對于基類我們要全部測試,底層的測試類可以對其父類的測試方法回歸。 Class_A+operation1()+operation2()Class_B+operation3()Class_C+operation2()+operation3()Class_A_TestCase+testoperation1()+testoperation2()Class_B_TestCase+testoperation3()Class_C_TestCase+testoperation2()+testoperation3()圖-7 類測試用例的構(gòu)建 二、接口類測試 對類進行測試時需要

13、構(gòu)建可執(zhí)行的類實例,而接口不存在任何構(gòu)造方法無法被實現(xiàn)。 由于接口一定會在某個類中實現(xiàn),因此就使用一個實現(xiàn)接口的類來做測試。遵循以下原則:l如果接口沒有被任何類實現(xiàn)就無需進行測試。l如果已被別的類實現(xiàn),那么就針對實現(xiàn)該接口的類進行測試。(如下圖-8)Class_C+Class_C+a_Method()+b_Method()+c_Method()Class_C_TestCase+Class_C_TestCase()+a_Method()+b_Method()+c_Method()+newObject()+testA_Method()+testB_Method()+testB_Method()In

14、terface_A+a_method()+b_method()圖-8 InterFace接口測試類圖 三、抽象類測試 如果要構(gòu)造抽象類的測試驅(qū)動程序首先要繼承測試驅(qū)動類,并且需要同時繼承被測試抽象類,因為該類不能被具體化。但Java采用單繼承機制,因此對該抽象類的測試驅(qū)動程序就不能同時繼承兩個抽象類,通常,采用以下兩種方法來處理抽象類的測試問題: 1、一般情況下,利用Java的內(nèi)類機制,在抽象類的測試驅(qū)動程序內(nèi)引入內(nèi)類,讓內(nèi)類實現(xiàn)對被測試抽象類的繼承,然后把它作為引用體,這樣對內(nèi)類的測試就等價于對被測試抽象類的測試。舉例如下: /* AbstractExample.java*創(chuàng)建日期:*創(chuàng)建人

15、員:*修改日期:*修改人員:*/package applet.unedu.tlpe.test;public abstract class AbstractExample implements Examplepublic AbstractExample()/*AbstractExampleTester.java*創(chuàng)建日期:*創(chuàng)建人員:*修改日期:*修改人員:*/package applet.unedu.tlpe.test;public abstract class AbstractExampleTester extends TestCasestatic class AbstractExample

16、_Inner extends AbstractExamplepublic AbstractExample_Inner()super(argumentname);public AbstractExampleTester()super(argumentname);public Example newObject(argumentname)return new AbstractExample_Inner();public void testAbstractExample_Inner() 2、如果抽象類被具體類繼承,那么,在創(chuàng)建該具體類的測試驅(qū)動程序時要繼承抽象類的測試驅(qū)動程序,在以后的回歸測試中,只

17、要執(zhí)行最低層的測試類,就可以對其父測試類重新執(zhí)行一次測試,同時將測試結(jié)果分別返回。 四、重載和覆蓋測試 覆蓋是在子類中重新定義了從父類中繼承的同名方法;重載與覆蓋不同,不是子類對父類同名方法的重新定義,而是類對自身已有的同名方法的重新定義。 在測試過程中,可以參考如下兩個原則: 要對類實例方法的所有重載形式分別進行測試。 子類的測試驅(qū)動程序在繼承父類測試驅(qū)動程序的同時,要對覆蓋了父類的同名方法進行測試,而且應(yīng)該重新對父類的類實例方法的所有重載形式執(zhí)行一次測試。 package applet.unedu.tlpe.test;public class reload public reload()p

18、ublic int method_a()return “method_a()”;public int method_a(String a)return “method_a(String a)”;public int method_a(String a,String b)return “method_a(String a,String b)”;public int method_b()return “method_b()”;public int method_c()return “method_c()”; reload_TestCase為reload類的測試驅(qū)動程序,該類對reload類中包含的

19、method_a實例方法的三種重載形式分別進行了測試,代碼如下:/*reload_TestCase .java*/package applet.unedu.tlpe.test;public class reload_TestCase extends TestCase.public reload_TestCase(argument )public void testMethod_a()public void testMethod_a_a()public void testMethod_a_ab()public void testMethod_b()public void testMethod_c

20、() 五、異常測試 因為存在異常,在構(gòu)建測試用例時,還要考慮如何測試在某種特殊情況下程序代碼是否返回了指定的狀態(tài)。 面向?qū)ο鬁y試的層次面向?qū)ο鬁y試的層次 在傳統(tǒng)軟件中,確定單元的指導(dǎo)方針是: 1、能夠自身編譯的最小程序塊; 2、單一過程/函數(shù)(獨立); 3、由一個人完成的小規(guī)模工作。 面向?qū)ο筌浖y試與傳統(tǒng)方法的區(qū)別:指導(dǎo)方針中沒有明確說明是把類還是方法作為單元。 下面對分別以方法和類作為單元的測試進行簡單的介紹和比較。 以方法為單元 可以將面向?qū)ο髥卧獪y試歸結(jié)為傳統(tǒng)的單元測試。 可以使用所有傳統(tǒng)功能性測試和結(jié)構(gòu)性測試技術(shù)。 前期工作相對容易,但后續(xù)測試工作重。 以類為單元 面向?qū)ο鬁y試的層次

21、,取決于單元的構(gòu)成,一般采用三層或四層方式。如果把單個操作或方法看作單元,則有四層測試,即操作/方法、類、繼承和系統(tǒng)測試。 面向?qū)ο鬁y試的主要問題是集成測試,可以看作是第三層,即在通過測試的類之間的交互測試。 JunitJunit簡介簡介 Junit是用于測試使用Java語言編寫的面向?qū)ο蟪绦虻膯卧墱y試工具。 (由Eric Gamma及Kent Beck編寫的,由SourceForge發(fā)行,使用許可證遵循IBMs common Public License Version 1.0公開版權(quán)規(guī)范) *優(yōu)點* : 1、提升程序代碼的質(zhì)量的同時,Junit測試使我們能夠更快速的編寫程序。 2、Jun

22、it使用簡單 3、Junit能夠檢驗測試結(jié)果并立即提供反饋。 4、Junit測試可以組織成一個有層次的測試系列架構(gòu)。 5、使用Junit開發(fā)測試成本低。 6、Junit測試提升軟件的穩(wěn)定性。 7、Junit測試是使用Java語言開發(fā)的。 8、Junit是免費的。 一、Junit的安裝和配置 (略) 二、Junit的卸載步驟 (略) 三、支持Junit的Java IDE 目前主要有 Forte for Java 3.0 Enterprise Edition; JBuilder 6 Enterprise Edition; Visual Age for Java等 。 四、Junit的各種斷言 Ju

23、nit提供了一些用于幫助我們確定某個被測試函數(shù)是否正常工作的輔助函數(shù),通常把這些函數(shù)稱之為斷言??梢耘袛嗄硹l件是否為真;兩數(shù)據(jù)是否相等。 下面舉出一些斷言方法: AssertEquals(String message,expected,actual) expected參數(shù)代表期望值;actual參數(shù)代表被測試代碼實際產(chǎn)生的值;message參數(shù)可選,常用于報告出錯信息。 assertNull/ assertNotNull(String message,java.lang.Object object) 用來判斷給定的對象是否為空/(是否為非空),如果答案為否,則會失敗,同樣message參數(shù)是可

24、選的。 assertSame/assertNotSame (String message,expected,actual)驗證expected參數(shù)和actual參數(shù)所引用的是否為/(不為)同一個對象,答案為否將會失敗, assertTrue(String message, boolean condition)驗證給定的二元條件是否為真,如果為假的話,將會失敗 注意:當(dāng)某個斷言失敗的時候,其所在的測試方法就會停止,也就是說剩余的斷言將不會執(zhí)行,此時應(yīng)該先修復(fù)這個失敗的測試再繼續(xù)進行其他測試。另外,當(dāng)有的測試失敗時不能給原有代碼添加新的特性!此時,應(yīng)該盡快的修復(fù)這個錯誤,直到所有的測試都順利通過。

25、 五、Junit自動化測試框架 定義:就是可以對代碼進行單元測試的框架。 簡單的自動化測試框架應(yīng)該滿足如下幾個要求: 1、能夠以某種方式將測試用例組織成一個測試包,以便可以一次執(zhí)行所有測試用例,盡量達到讓實現(xiàn)人員或者測試人員按一個按鈕就能完成所有的測試工作,并且輸出清晰的測試結(jié)果的目的。2、支持簡單的操作,可以向測試包中添加任意多個測試用例,并且不影響測試包的正常運行。3、支持測試隨意組合(一個測試包可以包含其他的測試包)。 Junit的自動化測試框架如圖-9所示:TestCasesetUp()teardown()MyTestCaseTestRun()TestSuiteaddTest()圖-9

26、 Junit的自動化測試框架 Junit.Framework包中包含了Junit測試類所需的所有基類(Base Class),實際上這個包也是整個Junit的基礎(chǔ)框架(Base_Framework)。TestCase類是這個包的核心,測試人員可在繼承TestCase類的基礎(chǔ)上開發(fā)自己的測試驅(qū)動程序。其余的類用來支持TestCase類,其中的TestSuite用來聚合多個測試用例(TestCase);Assert類用來驗證期望值和實際值;TestResult類收集所有測試用例執(zhí)行后的結(jié)果;在Test接口中建立了TestCase和TestSuite之間的關(guān)聯(lián),同時它也為整個測試框架作了擴展預(yù)留。

27、下面通過一段代碼對Junit框架的使用進行簡單介紹(包含了前面介紹的斷言)。 Line 1 import junit.framework.*; /導(dǎo)入必需的Junit類庫 2 public class TestSimple extends TestCase 3 public TestSimple(String name) 4 super(name); 5 6 public void testPlus() 7 assertEquals(2,3-1); 8 9 一個測試類會包含一些測試方法;每個方法可以包含一個或者多個斷言語句,這些功能能滿足最基本的測試要求。 但有時候希望在一個測試類中能調(diào)用其他

28、測試類,或者測試人員可能只想運行一個測試類中的某些方法??梢酝ㄟ^創(chuàng)建Test suite來實現(xiàn)。 例如,給出如下一個類似TestSimple的測試驅(qū)動類,二者不同之處在于增加了一個靜態(tài)的Test suite方法,通過suite()方法就可以返回任何想得到的測試集合(測試類中沒有suite()方法時,Junit會自動運行所有以test為開頭命名的方法)。代碼如下:Line 1 import junit.framework.*; 2 public class TestSimple extends TestCase 3 public TestSimple(String name) 4 super(n

29、ame); 5 6 public void testPlus()7 assertEquals(2,3-1);8 9 public void testAdd()10 assertEquals(4,2+2); public void testMultiple() assertEquals(4,22); 15 public static Test suite() TestSuite suite=new TestSuite(); Suite.addTest( new TestClassOne(“testPlus”); Suite.addTest(20 new TestClassOne(“testAdd

30、”); return suite; 六、環(huán)境的建立和清理 每個測試的運行是相互獨立的,每次測試都要重新設(shè)置某些測試環(huán)境;在測試完成之后釋放一些資源。 Junit中的TestCase基類就為我們提供了這樣兩個方法,可以分別用于環(huán)境的建立和清理: protected void setUp(); protected void teardown(); (例子詳見教材)七、JUnit支持兩種運行單個測試的方法: 靜態(tài)的和動態(tài)的方法。 1、靜態(tài)的方法是覆蓋TestCase類的runTest()方法,一般是采用內(nèi)部類的方式創(chuàng)建一個測試實例: TestCase test01 = new testCar(tes

31、tgetWheels) public void runTest() testGetWheels(); 2、動態(tài)的方法是用內(nèi)省來實現(xiàn)runTest()以創(chuàng)建一個測試實例。這要求測試的名字就是需要調(diào)用的測試方法的名字: TestCase test01 = new testCar(testGetWheels); 八、Testsuite的使用 在JUnit中,任何測試類都能包含一個名為suite的靜態(tài)方法,即:public static Test suite();在suite()方法中,將所需要的測試實例加到一個TestSuite對象中,并返回這個TestSuite對象。 因為TestSuite和Te

32、stCase都實現(xiàn)了Test接口,而Test接口定義了運行測試所需的方法。所以,在測試類執(zhí)行的過程中,只有添加到TestSuite中的測試才能夠被運行,因此不用去運行我們暫時還不需要的測試。九、Junit中main方法的使用 使用方法如下:public static void main(String args)Junit.textui.TestRunner.run(TestdrawbhTest.class);/使用文本交互模式啟動該測試用例Junit.awtui.TestRunner.run(TestdrawbhTest.class);/使用AWT圖形交互模式啟動該測試用例Junit.swingui.TestRunner.run(Testdrawbh

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論