软件工程课件:第07章 实现(编码与测试)_第1页
软件工程课件:第07章 实现(编码与测试)_第2页
软件工程课件:第07章 实现(编码与测试)_第3页
软件工程课件:第07章 实现(编码与测试)_第4页
软件工程课件:第07章 实现(编码与测试)_第5页
已阅读5页,还剩159页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1第七章 实现(编码与测试)Implementation=Coding + Testing实现:编码与测试问题定义可行性研究需求分析总体设计详细设计编码与单元测试综合测试软件维护软件定义时期软件开发时期软件维护时期编码将软件设计的结果转化成程序设计语言编写的计算机程序。开发人员对软件的最小设计单位-模块进行单元测试。测试熟悉软件测试的步骤:单元测试、集成测试、确认测试。掌握软件测试的方法:白盒测试、黑盒测试、灰盒测试。掌握软件调试(纠错)的方法:调试过程、调试方法。了解软件可靠性基本概念及估算方法。第七章 实现(编码与测试)7.1 编码7.2 软件测试基础 7.3 单元测试7.4 集成测试7.

2、5 确认测试7.6 白盒测试技术7.7 黑盒测试技术7.8 调试7.9 软件可靠性37.1 编码编码就是把软件设计结果翻译成用某种程序设计语言书写的程序。7.1.1 选择程序设计语言7.1.2 编码风格1. 程序内部的文档2. 数据说明3. 语句构造4. 输入输出5. 效率7.1.1 选择程序设计语言为什么程序设计语言是人和计算机通信的最基本的工具,它的特点必然会影响人的思维和解题方式,会影响人和计算机通信的方式和质量,也会影响其他人阅读和理解程序的难易程度。因此,编码之前的一项重要工作就是选择一种适当的程序设计语言。实用选择标准:用户对编程语言的要求。可以使用的编译程序。可以得到的软件工具。

3、 工程规模。程序员的编程语言知识。软件可移植性要求。 软件的应用领域。效率:阅读理解、开发、测试、运行、维护7.1.2 编码风格程序实际上也是一种供人阅读的文章,应该使程序具有良好的风格。“好的”程序应遵循的规则:程序文档:源程序文档化,易于理解的标识符命名、适当的注释、清晰的程序视觉组织等。数据说明:易于理解,便于查阅。语句构造:结构化,简单、直观,技巧不过份。输入输出:遵循人机界面设计准则。效率:效率满足需求;不要为了追求效率而过份使用技巧,牺牲程序的清晰性、可读性。(1)程序文档程序中的标识符(名字)程序中的注释程序的视觉组织 符号名的命名符号名即标识符,包括模块名、变量名、常量名、标号

4、名、子程序名、数据区名以及缓冲区名等。名字的意义这些名字应能反映它所代表的实际东西,应有一定实际意义。例如,表示次数的量用Times,表示总量的用Total,表示平均值的用Average,表示和的量用Sum等。名字的使用名字不是越长越好,应当选择精炼的意义明确的名字。必要时可使用缩写名字,但这时要注意缩写规则要一致。要给每一个名字加注释。在一个程序中,一个变量只应用于一种用途。夹在程序中的注释是程序员与日后的程序读者之间通信的重要手段。注释决不是可有可无的。一些正规的程序文本中,注释行的数量占到整个源程序的1/3到1/2,甚至更多。注释分为序言性注释和功能性注释。 程序的注释序言性注释通常置于

5、每个程序模块的开头部分,它应当给出程序的整体说明,对于理解程序本身具有引导作用。序言性注释包括: 程序标题;有关本模块功能和目的的说明; 主要算法说明:算法概要、大意; 接口说明:包括调用形式,参数描述,子程序清单; 有关数据描述:重要的变量及其用途,约束或限制条件,以及其它有关信息; 模块位置:在哪一个源文件中,或隶属于哪一个软件包; 开发简历:模块设计者,复审者,复审日期,修改日期及有关说明等。序言性注释功能性注释嵌在源程序体中,用以描述其后的语句或程序段是在做什么工作,或是执行了下面的语句会怎么样,而不要解释下面怎么做。要点描述一段程序,而不是每一个语句;用缩进和空行,使程序与注释容易区

6、别;注释要正确。例如: /* ADD AMOUNT TO TOTAL */ TOTAL = AMOUNTTOTAL上面注视不清楚,如果注明把月销售额计入年度总额,便使读者理解了下面语句的意图: /* ADD MONTHLY-SALES TO ANNUAL-TOTAL */ TOTAL = AMOUNTTOTAL功能性注释恰当地利用空格,可以突出运算的优先性,避免发生运算的错误。例如 ,将表达式 (A17)ANDNOT(B49)ORC写成 (A17) AND NOT (B49) OR C自然的程序段之间可用空行隔开;移行也叫做向右缩格。它是指程序中的各行不必都在左端对齐,都从第一格起排列。这样做

7、使程序完全分不清层次关系。对于选择语句和循环语句,把其中的程序段语句向右做阶梯式移行。使程序的逻辑结构更加清晰。例如,两重选择结构嵌套写成下面的移行形式,层次就清楚得多。 IF() THEN IF() THEN ELSE ENDIF ELSE ENDIF 视觉组织:使用空格、空行和移行数据说明指程序中用到的常量、变量、文件等数据对象的定义。在设计阶段已经确定了数据结构的组织及其复杂性。在编写程序时,则需要注意数据说明的风格。为了使程序中数据说明更易于理解和维护,必须注意以下几点:a. 数据说明的次序应该标准化。有次序易查阅,能加速测试、调试和维护的过程。b. 当多个变量名在一个语句中说明时,应

8、该按字母顺序排列这些变量。c. 如果设计时使用了一个复杂的数据结构,则应该用注解说明用程序设计语言实现这个数据结构的方法和特点。(2) 数据说明数据说明的次序数据说明 常量说明 简单变量类型说明 数组说明 公用数据块说明 所有的文件说明数据类型说明 整型量说明 实型量说明 字符量说明 逻辑量说明数据说明有次序易查阅,能加速测试、调试和维护的过程。变量名按字母顺序排列 b. 当多个变量名在一个语句中说明时,应该按字母顺序排列这些变量,便于查找。 例如,把 integer size, length, width, cost, price 写成 integer cost, length, price

9、 , size, width (3)语句构造AI = AIAT;AT = AIAT;AI = AIAT;WORK = AT;AT = AI;AI = WORK;构造语句时应该遵循的原则是,每个语句都应该简单而直接,不能为了提高效率而使程序变得过分复杂;也不要刻意追求技巧性,使程序编写得过于紧凑。功能:AT与AI交换数据值未使用中间变量难懂使用中间变量清晰例:语句构造int i,j; for ( i = 1; i = n; i+ ) for ( j = 1; j = n; j+ ) Vij ( ij ) * ( ji ) for ( i1; i = n; i+ ) for ( j1; j = 0

10、 & char 1) AND (B=0)(A=2) OR (X1)返回X=X/AX=X+1FFTTabdce只需设计一个测试用例: 输入数据:A=2, B=0, X=4 即达到了语句覆盖。语句覆盖是最弱的逻辑覆盖(如:AND 写成 OR,X1 写成 X 1) AND (B=0)(A=2) OR (X1)返回X=X/AX=X+1FFTTabdce可设计两组测试用例: A=3,B=0 ,X=3 可覆盖c、d分支 A=2,B=1 ,X=1 可覆盖b、e分支 两组测试用例可覆盖所有判定的真假分支 判定覆盖仍是弱的逻辑覆盖,只覆盖了全部路径的一半。773、条件覆盖使每个判定的每个条件的可能取值至少执行一

11、次。开始(A1) AND (B=0)(A=2) OR (X1)返回X=X/AX=X+1FFTTabdce满足条件:T1,T1, T2,T2 T3,T3 T4,T4第一判定表达式:设条件 A1 取真 记为T1 假 T1 条件 B=0 取真 记为T2 假 T2第二判定表达式:设条件 A=2 取真 记为T3 假 T3 条件 X1 取真 记为T4 假 T478测试用例 通过 满足的 覆盖A B X 路径 条件 分支1 0 3 abe T1,T2,T3,T4 b,e2 1 1 abe T1,T2,T3,T4 b,e 两个测试用例覆盖了四个条件八种可能取值。 未覆盖c、d分支,不满足判定覆盖的要求. 条件

12、覆盖不一定包含判定覆盖 判定覆盖也不一定包含条件覆盖(A1) AND (B=0)(A=2) OR (X1)X=X/AX=X+1FFTTabdce794. 判定/条件覆盖选取足够多的测试用例,使判断中的每个条件的所有可能取值至少执行一次,同时每个判断本身的所有可能判断结果至少执行一次.开始(A1) AND (B=0)(A=2) OR (X1)返回X=X/AX=X+1FFTTabdce满足条件:T1,T1, T2,T2 T3,T3 T4,T480测试用例 通过 满足的条件 覆盖A B X 路径 分支2 0 4 ace T1,T2,T3,T4 c,e1 1 1 abd T1,T2,T3,T4 b,d

13、能同时满足判定、条件两种覆盖标准的取值 5、条件组合覆盖所有可能的条件取值组合至少执行一次 A1, B=0 A1, B0 A1, B=0 A1, B0 A=2, X1 A=2, X1 A2, X1 A2, X1测试用例 通过 满足的 覆盖A B X 路径 条件 分支2 0 4 ace T1,T2,T3,T4 c,e2 1 1 abe T1,T2,T3,T4 b,e1 0 2 abd T1,T2,T3,T4 b,d1 1 1 abd T1,T2,T3,T4 b,d(A1) AND (B=0)(A=2) OR (X1)X=X/AX=X+1FFTTabdce82 以上根据测试数据对源程序语句检测的详

14、尽程度,简单讨论了几种逻辑覆盖标准。在上面的分析过程中常常谈到测试数据执行的程序路径,显然,测试数据可以检测的程序路径的多少,也反映了对程序测试的详尽程度。从对程序路径的覆盖程度分析,能够提出下述一些主要的逻辑覆盖标准。语句覆盖法评述836. 点覆盖图论中点覆盖的概念定义如下:如果连通图G的子图G是连通的,而且包含G的所有结点,则称G是G的点覆盖。 在第5章中已经讲述了从程序流程图导出流图的方法。在正常情况下流图是连通的有向图。满足点覆盖标准要求选取足够多的测试数据,使得程序执行路径至少经过流图的每个结点一次,由于流图的每个结点与一条或多条语句相对应,显然,点覆盖标准和语句覆盖标准是相同的。8

15、47. 边覆盖图论中边覆盖的定义是:如果连通图G的子图G是连通的,而且包含G的所有边,则称G是G的边覆盖。为了满足边覆盖的测试标准,要求选取足够多测试数据,使得程序执行路径至少经过流图中每条边一次。通常边覆盖和判定覆盖是一致的。8. 路径覆盖路径覆盖的含义是,选取足够多测试数据,使程序的每条可能路径都至少执行一次(如果程序图中有环,则要求每个环至少经过一次)。857.6.2 控制结构测试1. 基本路径测试2. 条件测试3. 循环测试1.基本路径测试方法概要“基本路径测试”是McCabe提出的基于“程序环形复杂度”来确定程序中路径进行测试的一种控制结构测试方法,属于白盒测试技术。设计测试用例时,

16、先计算程序的环形复杂度,以环形复杂度为指南,定义执行路径的基本集合,然后从该基本集合导出测试用例。覆盖能力所设计出的测试用例可保证程序中的每一条语句至少执行一次(语句覆盖),且每个条件语句在执行时分别取真、假值至少一次(判定覆盖、或条件覆盖(如果拆成元条件)。87基本路径测试步骤根据过程设计结果转化成程序相应的流图按照教材6.4节中的方法。计算程序流图的环路复杂度由于程序流图的“环路复杂度”=程序“独立路径基本集”中的独立路径条数,这可确保程序中每个边至少经过一次测试所必需的测试用例数目的上界。确定线性独立路径的基本集合按照图论,一条独立路径至少包含有一条在其他独立路径中从未有过的边。在程序流

17、图中,一条独立路径至少包含有一条在其他独立路径中从未出现过的新语句或新条件。设计可强制执行基本基本集合中每条路径的测试用例根据判断结点给出的条件,选择适当的数据以保证每一条路径可以被测试到 用逻辑覆盖(语句覆盖、判定覆盖、条件覆盖、等)的方法。例:求平均值过程第一步:画流图 PROCEDURE average /*该过程计算不超过100个在规定值域内的有效数字的平均值; 同时计算有效数字的总和和个数;*/ INTERFACE RETURES average, total.input, total.valid; INTERFACE ACCEPTS value, minimum, maximum;

18、 TYPE value1100 IS SCALAR ARRAY; TYPE average, total.input, total.valid; minimum, maximum, sum IS SCALAR; TYPE i IS INTERGE;1 i=1; total.input=total.valid=0; sum=0;2,3 DO WHILE valuei-999 AND total.inputminimum AND valuei011 THEN average=sum/total.valid;12 ELSE average=-999;13 ENDIF END average图7.6

19、求平均值过程的流图求平均值过程的PDL例:求平均值过程第二步:求环形复杂度环形复杂度=边数-节点数+2=17-13+2 =6例:求平均值过程第三步:求独立路径集由于环形复杂度为6,因此最多有6条独立路径:路径1:1-2-10-11-13路径2:1-2-10-12-13路径3: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:1-2-10-11-13输入: valuek=有效输入ki; v

20、aluei=-999,2= i =100。预期结果:k个有效输入的正确的平均值和总和。路径2:1-2-10-12-13输入: value1=-999预期结果:average=-999,其他保持初始值。即0个有效输入值。路径3:1-2-3-10-11-13输入: valuei=有效输入,1= i 100,即有效输入多于100个。预期结果:前100个有效输入的正确的平均值和总和。路径4:1-2-3-4-5-8-9-2-输入:valuei=有效输入,i100; valuekminimum,ki。即有值过小的无效输入。预期结果:滤除了过小值的正确的平均值和总和路径5:1-2-3-4-5-6-8-9-2

21、-输入: valuei=有效输入,imaximum,ki。即有值过大的无效输入。预期结果滤除了过大值的正确的平均值和总和。路径6:1-2-3-4-5-6-7-8-9-2-输入: valuei=有效输入,i100; 预期结果:正确的平均值和总和。valuei-999AND total.input0valueiminimumAND valueimaximum2. 条件测试方法概述条件测试是基于程序中的条件来设计测试用例的一种控制结构测试方法,是对基本路径测试技术的补充。该方法首先找出被测程序中的所有逻辑条件(分支语句、循环语句中的条件),在将复合条件分解成简单条件(布尔变量、关系表达式),然后设计

22、测试用例覆盖所有简单条件的取值及可能的构成复合条件的组合值。覆盖能力条件测试的着重点是测试程序中的每个条件,测试用例应覆盖每个条件的各种取值和组成复合条件的简单条件的各种组合取值,可实现判定/条件覆盖、条件组合覆盖。条件表达式概念条件表达式条件表达式由布尔变量、关系表达式、布尔运算符、括号(改变计算优先序)组成,其计算结果的取值为“真”或“假”。又称为逻辑表达式。布尔表达式由布尔变量和布尔运算符构成的表达式(不包含关系表达式),其计算结果的取值为“真”或“假”。布尔常量:“真”(T)、“假”(F);布尔变量:取值为“真”或“假”的变量。布尔运算符:OR(|)、AND(&)、NOT()等。关系表

23、达式由算术量(常量、变量)、算术表达式、关系运算符构成的表达式,其计算结果的取值为“真”或“假”。关系表达式的一般形式为:E1 E2,其中E1、E2为算术表达式。关系运算符:。条件错误的类型布尔算符错布尔变量错关系算符错算术表达式错括号错条件测试策略分支测试对于复合条件C,C的真分支、假分支、C中每个简单条件都至少执行一次。域测试对于每个关系表达式( E1 E2 ),至少执行3个测试:E1比E2大、E1比E2小、E1与E2相同等对于n个变量的布尔表达式,测试n个变量的各种取值的可能组合,共有2n种。(注意可行性,n太大将导致组合爆炸!)BRO测试(Branch and relational o

24、perater)分支与关系运算符(BRO)测试对于条件C,分解出简单条件(假定为n个),确定C中对应各简单条件的输出约束(D1、D2、Dn),根据这些约束设计相应的测试用例。BRO测试策略分支与关系运算符(BRO)测试:保证检测布尔 变量和关系运算符只出现一次而且没有公共变量 的条件中的分支和关系运算符错误。BRO策略利用条件C的条件约束。有n个简单条件 的条件C的条件约束定义为(D1,D2,Dn), 其中Di刻画条件C中第I个简单条件的输出约束。 如果C的执行过程中C的每个简单条件的输出都满 足D中对应的约束,则称条件C的条件约束D由C的 执行所覆盖。96BRO测试举例例1:C1:B1&B2

25、B1,B2为布尔变量。C1的条件约束形如(D1,D2),其中D1和D2的值是t或f。BRO测试策略要求约束集(t,t), (f,t), (t,f) 由C1的执行所覆盖,如果C1由于布尔运算符错误而不正确,该约束集中至少有一个约束强制C1失败。例2:C2:B1&(E3=E4)B1为布尔变量,E3、E4为算术运算符。C2的条件约束为(D1,D2),其中D1约束是t或f,D2约束为关系运算符。因此约束集为(t,=), (f,=), (t,) ,此约束集的覆盖率将保证检测C2的布尔运算符和关系运算符错误。例3:C3:(E1E2) & (E3=E4)C3的条件约束为(D1,D2),约束集为(,=), (

26、=,=), (,) 。973.循环测试方法概述循环测试是专注于测试循环结构的有效性的一种白盒测试技术。测试的要点是发现循环次数控制中可能的错误。三种循环组合简单循环:单个循环嵌套循环:循环中有循环串接循环:一个循环接着又一个循环98三种循环图7.7 3种循环简单循环测试方法设计测试用例时考虑如下执行情况(假设n为循环容许的最多次数):通过循环0次(跳过循环)通过循环1次通过循环2次通过循环m次,1m100 无效等价类 成绩0划分等价类的例(3)如规定了输入数据的一组值,且程序对不同输入值做不同处理,则每个允许的输入值是一个有效等价类,并有一个无效等价类(所有不允许的输入值的集合)。例:输入条件

27、说明学历可为:专科、本科、硕士、博士四种之一,则分别取这四个值作为四个有效等价类,另外把四种学历之外的任何学历作为无效等价类.划分等价类的例用等价类划分法设计测试用例步骤(1)构建等价类表每一等价类(包括有效等价类和无效等价类)规定一个唯一的编号。(2)为有效等价类设计测试方案(测试用例)设计一个新的测试用例,使其尽可能多地覆盖尚未覆盖的有效等价类,重复这一步骤,直到所有有效等价类均被测试用例所覆盖;(3)为无效等价类设计测试方案(测试用例)设计一个新的测试用例,使其只覆盖一个无效等价类,重复这一步骤直到所有无效等价类均被覆盖;113某报表处理系统要求用户输入处理报表的日期,日期限制在2003

28、年1月至2008年12月,即系统只能对该段期间内的报表进行处理,如日期不在此范围内,则显示输入错误信息。系统日期规定由年、月的6位数字字符组成,前四位代表年,后两位代表月。如何用等价类划分法设计测试用例, 来测试程序的日期检查功能?例:“输入日期”的测试用例输入条件 有效等价类 无效等价类 报表日期的类型及长度6位数字字符(1)有非数字字符 (4)少于6个数字字符 (5)多于6个数字字符 (6)年份范围在20032008之间 (2)小于2003 (7)大于2008 (8)月份范围在112之间(3)“报表日期”输入条件的等价类表小于1 (9)大于12 (10)第一步:等价类划分 测试数据 期望结

29、果 覆盖范围200306等价类(1)(2)(3)输入有效对表中编号为1,2,3的3个有效等价类用一个测试用例覆盖(1)6位数字字符(2)年在20032008之间 (3)月在112之间第二步:为有效等价类设计测试用例 测试数据 期望结果 覆盖范围003MAY等价类(4)非数字输入无效20035等价类(5)少于6位输入无效2003005等价类(6)多于6位输入无效200105等价类(7)小于2003输入无效200905等价类(8)大于2003输入无效200300等价类(9)小于1输入无效200313等价类(10)大于12输入无效不能出现相同的测试用例本例的共有10个等价类至少需要8个测试用例第三步

30、:为每一个无效等价类至少 设计一个测试用例准考证号数据格式定义:共6为数字组成,其中第一位为专业代号: 1-行政专业,2-法律专业,3-财经专业后5位为考生顺序号,编码范围为: 行政专业准考证号码为:110001111215 法律专业准考证号码为:210001212006 财经专业准考证号码为:310001314015 准考证号码的等价类划分 有效等价类: (1) 110001 111215 (2) 210001 212006 (3) 310001 314015 无效等价类: (4) - 110000 (5) 111216 210000 (6) 212007 31000 (7) 314016

31、+ 例:考试系统“输入学生成绩”子模块设计测试录入准考证号的测试用例等价类划分即把输入空间分解成一系列子域,软件在一个子域内的行为应是等价的。 软件错误分为两类:计算错误和域错误针对计算错误的测试方法针对域错误的测试方法:测试域边界划定的正确性等价类划分2. 边界值分析法边界值分析法与等价类划分法区别边界值分析不是从某等价类中随便挑一个作为代表,而是使这个等价类的每个边界都要作为测试条件。边界值分析不仅考虑输入条,还要考虑输出空间产生的测试情况被测试子 域测试内点测试外点软件边界与悬崖很类似如果在悬崖峭壁边可以自信地安全行走,平地就不在话下。如果软件在能力达到极限时能够运行,那么在正常情况下就

32、不会出什么问题。边界值的选取选取刚好等于、稍大于、稍小于等价类边界值的测试数据:测试临近边界的合法数据,以及刚超过边界的非法数据.越界测试通常简单地加1或很小的数 (对于最大值)和减1或很小的数(对于最小值). 如果软件测试问题包含确定的边界,应考虑数据的类型及其特征:数据类型如:数值、字符、位置、数量、速度、地址、尺寸、等;数据类型的特征:第一个/最后一个、最小值/最大值、开始/完成、空/满、最慢/最快、相邻/最远、超过/在内、等。输入条件报表日期的类型及长度1个数字字符5个数字字符7个数字字符有1个非数字字符全部是非数字字符6个数字字符显示出错显示出错显示出错显示出错显示出错输入有效日期范

33、围月份范围“报表日期( 6位数字字符)”边界值分析法测试用例测试用例说明测试数据期望结果选取理由52003520030052003.5MAY-200305月份为1月月份为12月月份12200301200312200300200313200301200812200300200813输入有效输入有效显示出错显示出错输入有效输入有效显示出错显示出错在有效范围边界上选取数据仅有1个合法字符比有效长度少1比有效长度多1只有1个非法字符6个非法字符类型及长度均有效最小日期最大日期刚好小于最小日期刚好大于最大日期最小月份最大月份刚好小于最小月份刚好大于最大月份有效等价类和用来测试getNumDaysInMo

34、nth()方法所选的有效输入 有效等价类一个月有31天,非闰年19017(七月)一个月有31天, 闰年19047(七月)一个月有30天,非闰年19016(六月)一个月有30天, 闰年19046(六月)一个月为28或29天,非闰年19012(二月)月份输入值年份输入值一个月为28或29天, 闰年2(二月)1904用来测试getNumDaysInMonth()方法的附加边界值 等价类可以被400整除的闰年20002(二月)可以被100整除的非闰年19002(二月)非正数无效月份12910正数无效月份131513月份输入值年份输入值 3. 错误推测法(error guessing)错误推测法根据经验、直觉和预感来进行测试。其基本思想是列举出程序中可能有的错误和容易发生错误的特殊情况,并根据他们设计测试用例。错误推测用例选取在直觉认为容易出错的地方建立测试等价类:缺省值、空白、空值、零值、空表、只有一项的表、无输入条件等在已经找到软件缺陷的地方,根据其出错特点设计测试用例。 4. 因果图法因果图适合于描述对于多种输入条件的组合,相应产生多个动作的形式来设计测试用例。因果图方

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论