第6章 软件测试

上传人:wjs****19 文档编号:241812896 上传时间:2024-07-26 格式:PPT 页数:177 大小:1.98MB
返回 下载 相关 举报
第6章 软件测试_第1页
第1页 / 共177页
第6章 软件测试_第2页
第2页 / 共177页
第6章 软件测试_第3页
第3页 / 共177页
点击查看更多>>
资源描述
华北电力大学计控学院华北电力大学计控学院 软件测试软件测试基础基础 软件测试软件测试步骤步骤 白盒白盒测试测试技术技术 黑盒测试技术黑盒测试技术 6.1 软件测试的基本概念软件测试的基本概念l l是为了发现错误而执行程序的过程。是为了发现错误而执行程序的过程。l是是根根据据软软件件开开发发各各阶阶段段的的规规格格说说明明和和程程序序的的内内部部结结构构而而精精心心设设计计一一批批测测试试用用例例(即即输输入入数数据据及及其其预预期期的的输输出出结结果果),并并利利用用这这些些测测试试用用例例去运行程序,以发现程序错误的过程。去运行程序,以发现程序错误的过程。软件测试的概念软件测试的概念软件测试背景软件测试背景软件是人编的所以不完美Intel的的pentium处理器处理器1994年浮点除法缺陷。2000.8,处理器出现了一个可能导致运行程序被挂起的执行指令问题。1999.12.3,美国航天局火星极地登陆飞船失踪。美国航天局火星极地登陆飞船失踪。1991年年,爱国者导弹防御系统系统时钟错误积累造爱国者导弹防御系统系统时钟错误积累造成跟踪系统失去精确度。成跟踪系统失去精确度。世界各地解决千年虫问题,花费超过数亿美元。世界各地解决千年虫问题,花费超过数亿美元。软件生存期各阶段间需保持的正确性软件生存期各阶段间需保持的正确性用户要求用户要求用户用户:我要什么我要什么?运行结果运行结果计算机计算机:程序运行得程序运行得到的结果到的结果源程序源程序程序员程序员:我要让计算我要让计算机做什么机做什么?设计说明书设计说明书设计员设计员:我要让软件我要让软件做什么做什么?需求说明书需求说明书分析员分析员:我要提我要提供什么供什么?理解正确性理解正确性表达正确性表达正确性表达正确性表达正确性理解正确性理解正确性设计正确性设计正确性理解正确性理解正确性编码正确性编码正确性输入正确性输入正确性运行正确性运行正确性相符吗相符吗?Myers软件测试目标软件测试目标(1)测试是程序的执行过程,测试是程序的执行过程,目的在于目的在于发现错误;发现错误;(2)一个好的测试用例在于一个好的测试用例在于能发现至今未发现的错误;能发现至今未发现的错误;(3)一个成功的测试是一个成功的测试是发现了至今未发现的错误的测试。发现了至今未发现的错误的测试。E.W.DijkstraE.W.Dijkstra 指出指出:“程序测试能证明错误的存在程序测试能证明错误的存在,但不能证明错但不能证明错误不存在误不存在.”测试的目的是发现程序中的错误,是为了证测试的目的是发现程序中的错误,是为了证明程序有错明程序有错,而不是证明程序无错而不是证明程序无错.在整个软件开发中在整个软件开发中,测试工作量测试工作量一般占一般占30%30%40%40%,甚至,甚至50%50%。在人命关天的软件在人命关天的软件(如飞机控制、核反应堆等)如飞机控制、核反应堆等)中,测试所花费的时间往往是其它软件工程活动中,测试所花费的时间往往是其它软件工程活动时间之和的三到五倍。时间之和的三到五倍。关于测试和测试人员关于测试和测试人员Windows20002000开发人员中:开发人员中:项目经理约项目经理约250人人 开发人员约开发人员约1700人人 测试人员测试人员约约3200人人 读者是否注意到,当测试组发现一个错误后,有多少程序员发出宽慰的叹息,他们会说:“唷!我很高兴程序在交付之前测试出了这个错误。”然而另有一些程序员,在测试员报告他们程序中的错误特别是指出一段代码中的多个错误时,他们却对此忿恨不满。我曾经见到过这种程序员怒发冲冠,也曾听到有些项目负责人说为什么测试员让我不得安宁。有一次,我还阻止过一位项目负责人和一位测试负责人之间的拳打脚踢,原因是项目负责人已经处于推迟交付产品的巨大压力之下,而测试组还在继续报告错误,这使他很不安。软件测试的原则软件测试的原则1.应尽早地和不断地进行软件测试应尽早地和不断地进行软件测试这是软件开发者的座右铭。这是软件开发者的座右铭。据美国一家公司统计,查出的软件错误中,据美国一家公司统计,查出的软件错误中,属于需求分析和软件设计的错误约占属于需求分析和软件设计的错误约占64%64%,属于程序编写的错误仅占属于程序编写的错误仅占 36%36%。程序编写。程序编写的许多错误是的许多错误是“先天的先天的”。开发前期出现错误的扩展开发前期出现错误的扩展计划计划需求需求分析分析设设计计编编码码测测试试AB2.测试用例测试用例:以发现错误为目的而精心设计的一以发现错误为目的而精心设计的一 组测试数据。组测试数据。测试用例应由测试用例应由测试用例应由测试用例应由测试输入数据测试输入数据和对应的和对应的和对应的和对应的预期输出预期输出结果结果这两部分组成。这两部分组成。这两部分组成。这两部分组成。测试用例测试用例=输入数据输入数据+期望结果期望结果3.程序员应避免检查自己的程序。程序员应避免检查自己的程序。4.在设计测试用例时,应包括在设计测试用例时,应包括合理的输入条合理的输入条件件和和不合理的输入条件不合理的输入条件。程序测试举例程序测试举例例:程序例:程序 TriangleTriangle,输入三个整数,表示一个输入三个整数,表示一个 三角形的三个边长,该程序产生一个结果,三角形的三个边长,该程序产生一个结果,指出该三角形是等边三角形、等腰三角形还指出该三角形是等边三角形、等腰三角形还 是不等边三角形。是不等边三角形。判断三角型的测试用例设计判断三角型的测试用例设计:输入数据输入数据 预期结果预期结果 (1)6,6,6 (1)6,6,6 等边等边 (2)8,8,4 (2)8,8,4 等腰等腰 (3)4,5,6 (3)4,5,6 一般一般 还应输入还应输入非法数据非法数据:0,7,90,7,9 -7,3,5 -7,3,5 a,2,7 a,2,75.充分注意测试中的群集现象。充分注意测试中的群集现象。80-2080-20原则:原则:原则:原则:8080的缺陷聚集在的缺陷聚集在的缺陷聚集在的缺陷聚集在2020的模块中,经的模块中,经的模块中,经的模块中,经常出错的模块改错后还会经常出错。常出错的模块改错后还会经常出错。常出错的模块改错后还会经常出错。常出错的模块改错后还会经常出错。经验表明,测试后程序中残存的错误数目与该程经验表明,测试后程序中残存的错误数目与该程经验表明,测试后程序中残存的错误数目与该程经验表明,测试后程序中残存的错误数目与该程序中已发现的错误数目成正比。序中已发现的错误数目成正比。序中已发现的错误数目成正比。序中已发现的错误数目成正比。6.严格执行测试计划,排除测试的随意性。严格执行测试计划,排除测试的随意性。7.应当对每一个测试结果做全面检查。应当对每一个测试结果做全面检查。8.妥善保存测试计划,测试用例,出错统计和妥善保存测试计划,测试用例,出错统计和最终分析报告,为维护提供方便。最终分析报告,为维护提供方便。程序的结果程序的结果正确的结果正确的结果l软件测试的对象 软件测试应贯穿于软件定义与开发的整个期间。需求分析、概要设计、详细设计、程序编码等各阶段所得到的文档资料,包括需求规格说明、概要设计规格说明、详细设计规格说明以及源程序,都应成为软件测试的对象。到程序的测试为止,软件开发工作已经经历了许多环节,每个环节都可能发生问题。为了把握各个环节的正确性,人们需要进行各种确认和验证工作。6.1 软件测试的基本概念软件测试的基本概念 确认确认(validation),是一系列的活动和过程,其目的是想证实在一个给定的外部环境中软件的逻辑正确性。它包括需求规格说明的确认和程序的确认,而程序的确认又分为静态确认与动态确认。验证验证(verification),则试图证明在软件生存期各个阶段,以及阶段间的逻辑协调性、完备性和正确性。下图为软件生存期各个重要阶段之间所要保持的正确性。6.1 软件测试的基本概念软件测试的基本概念 测试信息流如下图所示。6.1 软件测试的基本概念软件测试的基本概念l测试信息流l l机器测试与人工测试机器测试与人工测试l l 机器测试机器测试机器测试机器测试在设定的测试数据上执行被测程序的过程。在设定的测试数据上执行被测程序的过程。在设定的测试数据上执行被测程序的过程。在设定的测试数据上执行被测程序的过程。又称动态测试。又称动态测试。又称动态测试。又称动态测试。l l人工测试人工测试人工测试人工测试采用人工方法进行,目的在于检查程序的静采用人工方法进行,目的在于检查程序的静采用人工方法进行,目的在于检查程序的静采用人工方法进行,目的在于检查程序的静态结构,找出编译不能发现的错误。态结构,找出编译不能发现的错误。态结构,找出编译不能发现的错误。态结构,找出编译不能发现的错误。测试方法与技术测试方法与技术l代码审查代码审查以小组会的形式,发现程序在结构、功能、编码以小组会的形式,发现程序在结构、功能、编码风格等方面存在的问题。可查出风格等方面存在的问题。可查出30%70%的错的错误误l走查走查以小组会的形式进行,把测试数据以小组会的形式进行,把测试数据“输入输入”到被到被测程序,并在纸上跟踪监视程序的执行情况,让测程序,并在纸上跟踪监视程序的执行情况,让人代替机器沿着程序的逻辑走一遍人代替机器沿着程序的逻辑走一遍。l桌前检查桌前检查设计模块时,程序作者自己检查。设计模块时,程序作者自己检查。人工测试的分类人工测试的分类l l黑盒测试黑盒测试l l白盒测试白盒测试机器测试的分类机器测试的分类黑盒测试黑盒测试l l把把把把测试对象测试对象测试对象测试对象看做看做看做看做一个黑盒子一个黑盒子一个黑盒子一个黑盒子,测试人员完全测试人员完全测试人员完全测试人员完全不考虑程序内部的逻辑结构和内部特性,只不考虑程序内部的逻辑结构和内部特性,只不考虑程序内部的逻辑结构和内部特性,只不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书依据程序的需求规格说明书依据程序的需求规格说明书依据程序的需求规格说明书,检查程序的功,检查程序的功,检查程序的功,检查程序的功能是否符合它的功能说明。能是否符合它的功能说明。能是否符合它的功能说明。能是否符合它的功能说明。l l黑盒测试又叫做黑盒测试又叫做黑盒测试又叫做黑盒测试又叫做功能测试功能测试功能测试功能测试或或或或数据驱动测试。数据驱动测试。数据驱动测试。数据驱动测试。白盒测试白盒测试l l把测试对象看做一个透明的盒子把测试对象看做一个透明的盒子把测试对象看做一个透明的盒子把测试对象看做一个透明的盒子,它允许测,它允许测,它允许测,它允许测试人员利用程序内部的逻辑结构及有关信息,试人员利用程序内部的逻辑结构及有关信息,试人员利用程序内部的逻辑结构及有关信息,试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径设计或选择测试用例,对程序所有逻辑路径设计或选择测试用例,对程序所有逻辑路径设计或选择测试用例,对程序所有逻辑路径进行测试。进行测试。进行测试。进行测试。l l通过在不同点检查程序的状态,确定实际的通过在不同点检查程序的状态,确定实际的通过在不同点检查程序的状态,确定实际的通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。因此白盒测试状态是否与预期的状态一致。因此白盒测试状态是否与预期的状态一致。因此白盒测试状态是否与预期的状态一致。因此白盒测试又称为又称为又称为又称为结构测试结构测试结构测试结构测试或或或或逻辑驱动测试。逻辑驱动测试。逻辑驱动测试。逻辑驱动测试。l l主要对程序模块进行如下检查:主要对程序模块进行如下检查:l l 对程序模块的对程序模块的所有独立的执行路径所有独立的执行路径至少测试一至少测试一次;次;l 对对所有的逻辑判定,取所有的逻辑判定,取“真真”与取与取“假假”的两的两种情况都至少测试一次;种情况都至少测试一次;l 在循环的边界和运行在循环的边界和运行 界限内执行循环体;界限内执行循环体;l 测试内部数据结构的测试内部数据结构的 有效性。有效性。l穷举测试穷举测试无论哪种测试方法,包含所有可能无论哪种测试方法,包含所有可能 情况的测试为穷举测试。情况的测试为穷举测试。l l黑盒穷举测试黑盒穷举测试黑盒穷举测试黑盒穷举测试必须对必须对必须对必须对所有输入数据的各种可能值的排列组合都进行测试所有输入数据的各种可能值的排列组合都进行测试所有输入数据的各种可能值的排列组合都进行测试所有输入数据的各种可能值的排列组合都进行测试,来检查程序是否都能产生正确的输出。来检查程序是否都能产生正确的输出。来检查程序是否都能产生正确的输出。来检查程序是否都能产生正确的输出。l l白盒穷举测试白盒穷举测试白盒穷举测试白盒穷举测试对每条通路都应在每种可能的输入数据下执行一次。对每条通路都应在每种可能的输入数据下执行一次。对每条通路都应在每种可能的输入数据下执行一次。对每条通路都应在每种可能的输入数据下执行一次。l l选择测试选择测试在实际测试中,只能选择一些有代表在实际测试中,只能选择一些有代表在实际测试中,只能选择一些有代表在实际测试中,只能选择一些有代表性的典型的测试用例,进行有限的测试。性的典型的测试用例,进行有限的测试。性的典型的测试用例,进行有限的测试。性的典型的测试用例,进行有限的测试。穷举测试与选择测试穷举测试与选择测试l l假设一个程序假设一个程序假设一个程序假设一个程序P P有有有有输入量输入量输入量输入量X X和和和和Y Y及及及及输出量输出量输出量输出量Z Z。在字在字在字在字长为长为长为长为3232位的计算机上运行。若位的计算机上运行。若位的计算机上运行。若位的计算机上运行。若X X、Y Y取整数取整数取整数取整数,按,按,按,按黑盒方法进行穷举测试:黑盒方法进行穷举测试:黑盒方法进行穷举测试:黑盒方法进行穷举测试:l l可能采用的可能采用的可能采用的可能采用的 测试数据组:测试数据组:测试数据组:测试数据组:232232 264 l l如果测试一组数据需要如果测试一组数据需要如果测试一组数据需要如果测试一组数据需要1 1毫秒,一年工作毫秒,一年工作毫秒,一年工作毫秒,一年工作365365 2424小时,完成所有测试需小时,完成所有测试需小时,完成所有测试需小时,完成所有测试需5 5亿年亿年亿年亿年。264x10-3/3600/24/365黑盒穷举测试黑盒穷举测试l l右图的程序流右图的程序流程图,它包括程图,它包括一个执行一个执行20次次的循环的循环。包含的不同执行路径数达包含的不同执行路径数达包含的不同执行路径数达包含的不同执行路径数达5 52020条,对每一条路径进条,对每一条路径进条,对每一条路径进条,对每一条路径进 行测试需要行测试需要行测试需要行测试需要1 1毫秒,假定一年工作毫秒,假定一年工作毫秒,假定一年工作毫秒,假定一年工作365 365 24 24小时,小时,小时,小时,520 x10-3/3600/24/365=3170 要想把所有路径测试完,需要想把所有路径测试完,需要想把所有路径测试完,需要想把所有路径测试完,需31703170年。年。年。年。白盒穷举测试白盒穷举测试人工测试人工测试机器测试机器测试代码审查代码审查走查走查桌前检查桌前检查黑盒测试黑盒测试白盒测试白盒测试测试方法测试方法穷举测试穷举测试选择测试选择测试测试数据测试数据l l测试用例:以发现错误为目的而精心设测试用例:以发现错误为目的而精心设计的一组测试数据。计的一组测试数据。l l测试用例的格式测试用例的格式 (输入数据输入数据),(预期结果预期结果)测试用例设计测试用例设计6.2 白盒测试技术白盒测试技术l l 语句覆盖语句覆盖l l 判定覆盖判定覆盖l l 条件覆盖条件覆盖l l 判定条件覆盖判定条件覆盖l l 条件组合覆盖条件组合覆盖l l 路径覆盖路径覆盖1.逻辑覆盖逻辑覆盖 概念概念 是以是以程序内部的逻辑结构为基础程序内部的逻辑结构为基础 的设计测试用例的技术。的设计测试用例的技术。分类分类(A1)and(B=0)(A=2)or(X1)X=X/AX=X+1T TT TF FF Fa ab bd dc ce e输入输入A A,B B,X X输出输出A A,B B,X Xmain()float A,B,X;scanf(“%f%f%f”,&A,&B,&X);if (A1&B=0)X=X/A;if (A=2|X1)X=X+1;printf(“A=%f,B=%f,X=%f”,A,B,X);L1L1(a a c c e e)=(A1)and(B=0)=(A1)and(B=0)andand (A=2)or(X/A1)(A=2)or(X/A1)=(A1)and(B=0)and(A=2)=(A1)and(B=0)and(A=2)or or (A1)and(B=0)and(X/A1)(A1)and(B=0)and(X/A1)=(A=2)and(B=0)(A=2)and(B=0)or or (A1)and(B=0)and(X/A1)(A1)and(B=0)and(X/A1)白盒测试用例的设计L2(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)=(A1)and (X1)or or (B0)and(A2)and(X 1)白盒测试用例的设计L3(a b e)=not(A1)and(B=0)and (A=2)or(X1)=not(A1)or not(B=0)and (A=2)or(X1)=(A 1)and(X1)or(B0)and(A=2)or(B0)and(X1)白盒测试用例的设计L4(a c d)=(A1)and(B=0)and not(A=2)or(X/A1)=(A1)and(B=0)and(A2)and(X/A 1)白盒测试用例的设计语句覆盖语句覆盖l语句覆盖就是设计若干个测试用例,运行被测语句覆盖就是设计若干个测试用例,运行被测程序,使得程序,使得每一可执行语句至少执行一次每一可执行语句至少执行一次。L1(a c e)=(A=2)and(B=0)or (A1)and(B=0)and(X/A1)n n 满足语句覆盖的测试用例满足语句覆盖的测试用例 格式:格式:(A,B,X),(A,B,X)【(2,0,4)(2,0,4),(2,0,3)(2,0,3)】覆盖覆盖 ace【L1】n虽然语句覆盖检验了每一个可执行语句,但可虽然语句覆盖检验了每一个可执行语句,但可能发现不了判断中逻辑运算的错误。语句覆盖能发现不了判断中逻辑运算的错误。语句覆盖是最弱的逻辑覆盖标准。是最弱的逻辑覆盖标准。n n如如如如A1&B=0A1&B=0 错写成错写成错写成错写成 A1|B=0A1|B=0,该测试用该测试用该测试用该测试用例依然成立。例依然成立。例依然成立。例依然成立。【(2,0,4)(2,0,4),(2,0,3)(2,0,3)】void main()float A,B,X;scanf(“%f%f%f”,&A,&B,&X);if (A1|B=0)X=X/A;if (A=2|X1)X=X+1;printf(“A=%f,B=%f,X=%f”,A,B,X);判定覆盖判定覆盖l判定覆盖,判定覆盖,又称为又称为又称为又称为分支覆盖。分支覆盖。分支覆盖。分支覆盖。就是设计若干个测就是设计若干个测试用例,运行被测程序,使得试用例,运行被测程序,使得程序中每个判断框程序中每个判断框的取真分支和取假分支至少执行一次的取真分支和取假分支至少执行一次。L1:L1:(A=2)and(B=0)(A=2)and(B=0)oror (A1)and(B=0)and(X/A1)(A1)and(B=0)and(X/A1)L2:L2:(A1)and (X1)(A1)and (X1)oror (B0)and(A2)and(X 1)(B0)and(A2)and(X 1)L1:【(2,0,4),(2,0,3)】L2:【(1,1,1),(1,1,1)】判定覆盖判定覆盖l判定覆盖,判定覆盖,又称为又称为又称为又称为分支覆盖。分支覆盖。分支覆盖。分支覆盖。就是设计若干个测就是设计若干个测试用例,运行被测程序,使得试用例,运行被测程序,使得程序中每个判断框程序中每个判断框的取真分支和取假分支至少执行一次的取真分支和取假分支至少执行一次。L3:L3:not(B=0)and(A=2)not(B=0)and(A=2)or or not(A1)not(A1)and(X1)and(X1)or not(B=0)and(X1)not(B=0)and(X1)L4:L4:(A1)and(B=0)and not(A=2)(A1)and(B=0)and not(A=2)andnotandnot(X/A1)(X/A1)L3:【(2,1,1),(2,1,2)】L4:【(3,0,3),(3,1,1)】关于判定覆盖的讨论关于判定覆盖的讨论l判定覆盖只比语句覆盖稍强一些,但实际效果表判定覆盖只比语句覆盖稍强一些,但实际效果表明,只是判定覆盖,还不能保证一定能查出在判明,只是判定覆盖,还不能保证一定能查出在判断的条件中存在的错误。断的条件中存在的错误。l如果有多个条件的或运算,则条件之间有屏蔽作如果有多个条件的或运算,则条件之间有屏蔽作用。用。l因此,还需要更强的逻辑覆盖准则去检验判断内因此,还需要更强的逻辑覆盖准则去检验判断内部条件。部条件。条件覆盖条件覆盖l条件覆盖就是设计若干个测试用例,运行被测程条件覆盖就是设计若干个测试用例,运行被测程序,使得程序中序,使得程序中每个判断框中的每个条件的可能每个判断框中的每个条件的可能取值至少执行一次。取值至少执行一次。n对所有条件的取值加以标记对所有条件的取值加以标记uu第一个判断第一个判断第一个判断第一个判断 条件条件 A1 取真为取真为 ,取假为,取假为 条件条件 B0 取真为取真为 ,取假为,取假为uu第二个判断:第二个判断:第二个判断:第二个判断:条件条件 A2 取真为取真为 ,取假为,取假为 条件条件 X1 取真为取真为 ,取假为,取假为T4 测试用例测试用例测试用例测试用例 覆盖分支覆盖分支覆盖分支覆盖分支 条件取值条件取值条件取值条件取值【(2,0,4),(2,0,3)】L1(c,e)【(1,0,1),(1,0,1)】L2(b,d)【(2,1,1),(2,1,2)】L3(b,e)判定覆盖不一定包含条件覆盖判定覆盖不一定包含条件覆盖条件覆盖不一定包含判定覆盖条件覆盖不一定包含判定覆盖或或【(1,0,3)(1,0,3),(1,0,4)(1,0,4)】L3(b,e)L3(b,e)【(2,1,1)(2,1,1),(2,1,2)(2,1,2)】L3(b,e)L3(b,e)l判定条件覆盖就是判定条件覆盖就是设计足够的测试用例,设计足够的测试用例,使得使得每个判断框每个判断框的所的所有可能取值至少执行有可能取值至少执行一次;一次;判断框中判断框中每个条件每个条件的的所有可能取值至少执所有可能取值至少执行一次行一次。判定条件覆盖判定条件覆盖 测测 试试 用用 例例覆盖分支覆盖分支 条件取值条件取值【(2,0,4),(2,0,3)】L1(c,e)(A=2)and(B=0)or(A1)and(B=0)and(X/A1)(A1)and (X1)or (B0)and(A2)and(X 1)【(1,1,1),(1,1,1)】L2(b,d)条件组合覆盖条件组合覆盖l条件组合覆盖就是设计足够的测试用例,运行条件组合覆盖就是设计足够的测试用例,运行被测程序,使得被测程序,使得每个判断框的所有可能的条件每个判断框的所有可能的条件取值组合取值组合至少执行一次至少执行一次。n n A A1,B1,B0 0 作作作作 A A1,B0 1,B0 作作作作 A A 1,B1,B0 0 作作作作 A A 1,B0 1,B0 作作作作 A A2,X2,X1 1 作作作作 A A2,X2,X 1 1 作作作作 A2,XA2,X1 1 作作作作 A2,XA2,X 1 1 作作作作 条件组合覆盖是一种相当强的覆盖准则,可条件组合覆盖是一种相当强的覆盖准则,可以有效地检查各种可能的条件取值的组合是否正以有效地检查各种可能的条件取值的组合是否正确。它不但可覆盖所有条件的可能取值的组合,确。它不但可覆盖所有条件的可能取值的组合,还可覆盖所有判断的可取分支,还可覆盖所有判断的可取分支,但可能有的路径但可能有的路径会遗漏掉。测试还不完全会遗漏掉。测试还不完全。测测测测 试试试试 用用用用 例例例例 覆盖条件覆盖条件覆盖条件覆盖条件 覆盖组合覆盖组合覆盖组合覆盖组合【(2,0,4),(2,0,3)(2,0,4),(2,0,3)】(L1)(L1),【(2,1,1),(2,1,2)(2,1,1),(2,1,2)】(L3)(L3),【(1,0,3),(1,0,4)(1,0,3),(1,0,4)】(L3)(L3),【(1,1,1),(1,1,1)(1,1,1),(1,1,1)】(L2)(L2),T T T T1234T T T T1234T T T T1234T T T T1234路径覆盖路径覆盖l路径覆盖就是设计足够的测试用例,路径覆盖就是设计足够的测试用例,覆盖程覆盖程序中所有可能的路径序中所有可能的路径。测测测测 试试试试 用用用用 例例例例 通过路径通过路径通过路径通过路径 覆盖条件覆盖条件覆盖条件覆盖条件【(2,0,4),(2,0,3)(2,0,4),(2,0,3)】ace(L1)ace(L1)【(1,1,1),(1,1,1)(1,1,1),(1,1,1)】abdabd (L2)(L2)【(1,1,2),(1,1,3)(1,1,2),(1,1,3)】abeabe (L3)(L3)【(3,0,3),(3,0,1)(3,0,3),(3,0,1)】acdacd (L4)(L4)路径覆盖并不一定达到条件组合覆盖路径覆盖并不一定达到条件组合覆盖6.2 白盒测试技术白盒测试技术l l 语句覆盖语句覆盖语句覆盖语句覆盖l l 判定覆盖判定覆盖判定覆盖判定覆盖l l 条件覆盖条件覆盖条件覆盖条件覆盖l l 判定条件覆盖判定条件覆盖判定条件覆盖判定条件覆盖l l 条件组合覆盖条件组合覆盖条件组合覆盖条件组合覆盖l l 路径覆盖路径覆盖路径覆盖路径覆盖1.逻辑覆盖逻辑覆盖 概念概念概念概念 是以是以是以是以程序内部的逻辑结构为基础程序内部的逻辑结构为基础程序内部的逻辑结构为基础程序内部的逻辑结构为基础的设计的设计的设计的设计 测试用例的技术。测试用例的技术。测试用例的技术。测试用例的技术。分类分类分类分类 6.3 基本路径测试基本路径测试l l基本路径测试基本路径测试把覆盖的路径数压缩到一定限度内,把覆盖的路径数压缩到一定限度内,程序中的每程序中的每条语句至少执行一次。每个条件在执行时都将分条语句至少执行一次。每个条件在执行时都将分别取真、假值。别取真、假值。l l 基本原理基本原理是在程序控制流图的基础上,分析控制构造的环是在程序控制流图的基础上,分析控制构造的环路复杂性,导出基本可执行路径集合,设计测试路复杂性,导出基本可执行路径集合,设计测试用例。用例。程序的控制流图程序的控制流图l控制流图控制流图 描述程序控制流的一种图示方法。描述程序控制流的一种图示方法。即即退化的程序流程图退化的程序流程图。l符号符号 控制流图的一个控制流图的一个控制流图的一个控制流图的一个结点结点,表示一个或多个,表示一个或多个,表示一个或多个,表示一个或多个 无分支的无分支的无分支的无分支的PDLPDL语句或源程序语句。语句或源程序语句。语句或源程序语句。语句或源程序语句。一组顺序处理框可以映射为一个单一的结点。一组顺序处理框可以映射为一个单一的结点。一组顺序处理框可以映射为一个单一的结点。一组顺序处理框可以映射为一个单一的结点。箭头箭头 为为为为边边,表示控制流的,表示控制流的,表示控制流的,表示控制流的方向方向。基本控制结构的表示基本控制结构的表示l在选择或多分支结构中,分支的汇聚处应在选择或多分支结构中,分支的汇聚处应有一个汇聚结点。有一个汇聚结点。l l边和结点圈定的区域叫做区域边和结点圈定的区域叫做区域,当对区域,当对区域计数时,图形外的区域也应记为一个区域。计数时,图形外的区域也应记为一个区域。n如果判断中的条件表达式是由一个或多个逻辑如果判断中的条件表达式是由一个或多个逻辑 运算符运算符(OR,AND,.)连接的连接的复合条件表达式复合条件表达式,则需改为一系列则需改为一系列只有单个条件的嵌套的判断。只有单个条件的嵌套的判断。McCabe方法,又称方法,又称环路复杂性环路复杂性度量,是一度量,是一种种基于基于程序控制流程序控制流的复杂性度量方法。的复杂性度量方法。它基于一个程序模块的流图中它基于一个程序模块的流图中环路的个数环路的个数。环路复杂度环路复杂度 有向图有向图G的环路复杂性的公式:的环路复杂性的公式:I.I.V(G)V(G)mmn n2 2 其中,V(G)-有向图G中的环路个数 m -图G中边的个数 n -图G中结点个数 II II区域个数区域个数 IIIIIIV V(GG)=判定结点数判定结点数判定结点数判定结点数+1+1环路复杂度的计算环路复杂度的计算(1)(1)V(G)V(G)=边的条数边的条数-节点个数节点个数+2=11-9+2=4+2=11-9+2=4(2)(2)V(G)V(G)=区域个数区域个数 =4=4(3)(3)V(G)V(G)=判定节点个数判定节点个数+1=3+1=4+1=3+1=4计算环路复杂度计算环路复杂度 环形复杂度的说明环形复杂度的说明l环路复杂度取决于程序控制结构的复杂度环路复杂度取决于程序控制结构的复杂度。l1000行语句组成的顺序结构的程序和行语句组成的顺序结构的程序和1行语句的环行语句的环路复杂度相同。路复杂度相同。l对于复杂度超过对于复杂度超过10的程序,应分成几个小程序,的程序,应分成几个小程序,以减少程序中的错误。以减少程序中的错误。Walsh用实例证实了这个建议的正确性。他发现,在McCabe复杂度为10的附近,存在出错率的间断跃变。1)根据过程设计结果画出相应的控制流图。)根据过程设计结果画出相应的控制流图。2)计算环路复杂性,得到基本路径数。)计算环路复杂性,得到基本路径数。l程序的环路复杂性给出了程序的环路复杂性给出了程序基本路径集中的独立程序基本路径集中的独立路径条数路径条数。l这是确保程序中每个可执行语句至少执行一次所必这是确保程序中每个可执行语句至少执行一次所必需的需的测试用例数目测试用例数目的上界。的上界。基本路径测试步骤基本路径测试步骤 例:图示的控制流图中,一组独立的路径是:例:图示的控制流图中,一组独立的路径是:path1path1:1 11 path2path2:1-2-3-6-7-9-10-1 11 path3path3:1-2-3-6-8-9-10-1 11 path4path4:1-2-3-4-5-10-1 11 路径路径 path1,path2,path3,path4组成了控制流图的一个基本路径集。组成了控制流图的一个基本路径集。3)确定线性独立路径的基本集合)确定线性独立路径的基本集合 包括一组以前没有处理的语句或条件包括一组以前没有处理的语句或条件包括一组以前没有处理的语句或条件包括一组以前没有处理的语句或条件 的一条路径。的一条路径。的一条路径。的一条路径。4)导出测试用例)导出测试用例l导出测试用例,导出测试用例,确保基本路径集中的每一条确保基本路径集中的每一条确保基本路径集中的每一条确保基本路径集中的每一条路径的执行。路径的执行。路径的执行。路径的执行。l根据判断结点给出的条件,选择适当的数据根据判断结点给出的条件,选择适当的数据以保证某一条路径可以被测试到以保证某一条路径可以被测试到 用逻辑用逻辑用逻辑用逻辑覆盖方法。覆盖方法。覆盖方法。覆盖方法。l每个每个测试用例执行之后测试用例执行之后,与预期结果进行与预期结果进行比较比较。如果所有测试用例都执行完毕,则。如果所有测试用例都执行完毕,则可以确信程序中所有的可执行语句至少被可以确信程序中所有的可执行语句至少被执行了一次。执行了一次。l必须注意,一些独立的路径必须注意,一些独立的路径(如例中的路径如例中的路径1),往往不是完全孤立的,有时它是程序,往往不是完全孤立的,有时它是程序正常的控制流的一部分,这时,这些路径正常的控制流的一部分,这时,这些路径的测试可以是另一条路径测试的一部分。的测试可以是另一条路径测试的一部分。循环测试路径选择循环测试路径选择l l循环分类循环分类简单循环简单循环嵌套循环嵌套循环串接循环串接循环P102P102串接循环串接循环 循环测试路径选择循环测试路径选择1)简单循环)简单循环 零次循环零次循环零次循环零次循环:从循环入口直接跳到循环出口。:从循环入口直接跳到循环出口。一次循环一次循环一次循环一次循环:检查循环初始值方面的错误。:检查循环初始值方面的错误。二次循环二次循环二次循环二次循环:检查多次循环时才能暴露的错误:检查多次循环时才能暴露的错误 m m m m次循环次循环次循环次循环:m mn n,也是检查在多次循环时也是检查在多次循环时 才能暴露的错误。才能暴露的错误。n n n n次循环、次循环、次循环、次循环、n+1n+1n+1n+1次循环、次循环、次循环、次循环、n-1n-1n-1n-1次循环次循环次循环次循环n n 循环允许的最大次数循环允许的最大次数循环允许的最大次数循环允许的最大次数对对最内层循环最内层循环做简单循环的全部测试。做简单循环的全部测试。所有其它层的循环变量置为最小值;所有其它层的循环变量置为最小值;逐步外推,对其外面一层循环进行测试。逐步外推,对其外面一层循环进行测试。测试时,所有测试时,所有外层循环的循环变量取最小值外层循环的循环变量取最小值,所有其所有其它嵌套它嵌套内层循环的循环变量取内层循环的循环变量取“典型典型”值值。反复进行,直到所有各层循环测试完毕。反复进行,直到所有各层循环测试完毕。对全部各层循环同时取最小循环次数,对全部各层循环同时取最小循环次数,或者同时取最大循环次数或者同时取最大循环次数2)嵌套循环嵌套循环l例:嵌套循环例:嵌套循环input l,m,nfor i=1 to lfor j=1 to mfor k=1 to nx=i*i+j*j+k*knextnextnext3)串接循环串接循环各个循环各个循环互相独立互相独立互相独立互相独立,可以,可以用与简单循环相同的方法用与简单循环相同的方法进行测试。进行测试。几个循环几个循环不是互相独立不是互相独立不是互相独立不是互相独立的的,需要使用测试嵌套循环的需要使用测试嵌套循环的办法来处理。办法来处理。白盒测试用例的设计串接循环串接循环串接循环串接循环6.4 黑盒测试技术黑盒测试技术l l 等价类划分等价类划分l l 边界值分析边界值分析l l 错误推测法错误推测法等价类划分等价类划分l l等价类划分法等价类划分法 把所有可能的输入数据把所有可能的输入数据,即程序的输入域,即程序的输入域划划分成若干部分分成若干部分,然后,然后从每一部分中选取少数有从每一部分中选取少数有代表性的数据作为测试用例代表性的数据作为测试用例。n n 等价类等价类等价类等价类 某个输入域的子集合。某个输入域的子集合。某个输入域的子集合。某个输入域的子集合。在该子集合中,在该子集合中,各个输入数据对于揭露程各个输入数据对于揭露程 序中的错误都是等效的序中的错误都是等效的。测试某等价类的代。测试某等价类的代 表值就等价于对这一类其它值的测试。表值就等价于对这一类其它值的测试。l等价类划分是一种典型的黑盒测试方法,等价类划分是一种典型的黑盒测试方法,使用这一方法时,使用这一方法时,完全不考虑程序的内部完全不考虑程序的内部结构结构,只依据程序的规格说明来设计测试只依据程序的规格说明来设计测试用例用例。l l等价类划分法的测试步骤等价类划分法的测试步骤l l划分等价类划分等价类划分等价类划分等价类(列出等价类表)(列出等价类表)l l选取测试用例选取测试用例选取测试用例选取测试用例等价类的划分等价类的划分 有效等价类有效等价类 对于程序的规格说明来说,是合理的,有意对于程序的规格说明来说,是合理的,有意义的输入数据构成的集合。义的输入数据构成的集合。无效等价类无效等价类 对于程序的规格说明来说,是不合理的,无对于程序的规格说明来说,是不合理的,无意义的输入数据构成的集合。意义的输入数据构成的集合。设计测试用例时,要同时考虑有效等价类和设计测试用例时,要同时考虑有效等价类和无效等价类的设计。无效等价类的设计。1)若输入条件规定了取值范围,或值的若输入条件规定了取值范围,或值的 个数,则可以确立一个有效等价类和个数,则可以确立一个有效等价类和 两个无效等价类。两个无效等价类。例例:输入输入值是学生成绩,范围是值是学生成绩,范围是0 0100100。0 1000 100 无效等价类无效等价类 成绩成绩0100100 划分等价类的原则划分等价类的原则4)如果规定了输入数据的一组值,而且程序如果规定了输入数据的一组值,而且程序要对每个输入值分别进行处理。要对每个输入值分别进行处理。这时可为这时可为 每一个输入值确立一个有效等价类,此外针每一个输入值确立一个有效等价类,此外针对这组值确立一个无效等价类,它是所有不对这组值确立一个无效等价类,它是所有不允许的输入值的集合。允许的输入值的集合。例例:分房中规定对教授、副教授、讲师和助:分房中规定对教授、副教授、讲师和助教分别计算分数,做相应的处理。因此可以教分别计算分数,做相应的处理。因此可以确定确定4个有效等价类为教授、副教授、讲师和个有效等价类为教授、副教授、讲师和助教,一个无效等价类,它是所有不符合以助教,一个无效等价类,它是所有不符合以上身份的人员的集合。上身份的人员的集合。5)如果规定了输入数据必须遵守的规则,则如果规定了输入数据必须遵守的规则,则可以确立可以确立一个有效等价类一个有效等价类(符合规则)和(符合规则)和若干个无效等价类若干个无效等价类(从不同角度违反规则)。(从不同角度违反规则)。例:例:C语言规定语言规定“一个语句必须以分号一个语句必须以分号;结束结束”。这时,可以确定一个有效等价类。这时,可以确定一个有效等价类“以以;结束结束”,若干个无效等价类,若干个无效等价类“以以:结结束束”、“以以,结束结束”、“以以 结束结束”等。等。6)如果程序的处理对象是表格,则应该使用如果程序的处理对象是表格,则应该使用空表、含一行、含多行的表。空表、含一行、含多行的表。l确定等价类,建立等价类表,列出所有划分确定等价类,建立等价类表,列出所有划分出的等价类。出的等价类。使用等价类划分法确定测试用例使用等价类划分法确定测试用例l从等价类中选择测试用例的原则从等价类中选择测试用例的原则1)为每一个等价类规定一个唯一编号;为每一个等价类规定一个唯一编号;2)设计一个新的测试用例,使其设计一个新的测试用例,使其尽可能多地覆盖尽可能多地覆盖 尚未被覆盖的有效等价类,尚未被覆盖的有效等价类,重复这一步,直到重复这一步,直到 所有的有效等价类都被覆盖为止;所有的有效等价类都被覆盖为止;3)设计一个新的测试用例,使其设计一个新的测试用例,使其仅覆盖一个尚未仅覆盖一个尚未 被覆盖的无效等价类被覆盖的无效等价类,重复这一步,直到所有,重复这一步,直到所有 的无效等价类都被覆盖为止。的无效等价类都被覆盖为止。l l例:用等价类划分法设计测试用例例:用等价类划分法设计测试用例C语言规定语言规定:标识符是由字母或下划线开头;标识符是由字母或下划线开头;后跟字母、数字或下划线的任意组合构成;后跟字母、数字或下划线的任意组合构成;系统保留字不能做标识符;系统保留字不能做标识符;有效字符数为有效字符数为8个。个。标识符必须先说明,再使用。标识符必须先说明,再使用。在同一说明语句中,标识符至少必须有一个。在同一说明语句中,标识符至少必须有一个。用等价类划分方法,建立输入等价类表用等价类划分方法,建立输入等价类表标识符是由字母或下划线开头;标识符是由字母或下划线开头;标识符是由字母或下划线开头;标识符是由字母或下划线开头;后跟字母、数字或下划线的任意组合构成后跟字母、数字或下划线的任意组合构成后跟字母、数字或下划线的任意组合构成后跟字母、数字或下划线的任意组合构成系统保留字不能做标识符系统保留字不能做标识符系统保留字不能做标识符系统保留字不能做标识符有效字符数为有效字符数为有效字符数为有效字符数为8 8个个个个标识符必须先说明,再使用标识符必须先说明,再使用标识符必须先说明,再使用标识符必须先说明,再使用在同一说明语句中,标识符至少必须有一个在同一说明语句中,标识符至少必须有一个在同一说明语句中,标识符至少必须有一个在同一说明语句中,标识符至少必须有一个l从等价类中选择测试用例的原则从等价类中选择测试用例的原则1)为每一个等价类规定一个唯一编号;为每一个等价类规定一个唯一编号;2)设计一个新的测试用例,使其设计一个新的测试用例,使其尽可能多地覆盖尽可能多地覆盖 尚未被覆盖的有效等价类,尚未被覆盖的有效等价类,重复这一步,直到重复这一步,直到 所有的有效等价类都被覆盖为止;所有的有效等价类都被覆盖为止;3)设计一个新的测试用例,使其设计一个新的测试用例,使其仅覆盖一个尚未仅覆盖一个尚未 被覆盖的无效等价类被覆盖的无效等价类,重复这一步,直到所有,重复这一步,直到所有 的无效等价类都被覆盖为止。的无效等价类都被覆盖为止。l l选取测试用例,覆盖有效等价类选取测试用例,覆盖有效等价类 float xyz,_ _ _,T1234567,my_name1;xyz=3.414;T1234567=2.732;(1),(2),(3),(4),(5),(6),(7),(8),(10)int age;(9)float x,;0个个(14)float student11,student12;8个个(15)char par;pap=A;未说明已使用未说明已使用(16)int;0个个(17)n n选取测试用例,覆盖无效等价类选取测试用例,覆盖无效等价类 float 2t;非字母下划线非字母下划线非字母下划线非字母下划线(11)char t*;非字母数字下划线字符非字母数字下划线字符非字母数字下划线字符非字母数字下划线字符(12)int goto;保留字保留字保留字保留字(13)边界值分析边界值分析l为什么要用边界值分析为什么要用边界值分析 大量的错误都发生在输入或输出范围的边界上,而大量的错误都发生在输入或输出范围的边界上,而不是在输入范围的内部。不是在输入范围的内部。因此针对各种边界情况设计测试用例,可以查出更因此针对各种边界情况设计测试用例,可以查出更多的错误。多的错误。l边界值分析不仅考虑边界值分析不仅考虑输入输入条件,条件,还要考虑还要考虑输出输出空间产生的测试空间产生的测试 情况。情况。l这里所说的边界是相对于输入等价类和这里所说的边界是相对于输入等价类和输出等价类而言,即一般选取的测试数输出等价类而言,即一般选取的测试数据应在边界值附近。应当选取据应在边界值附近。应当选取正好等于正好等于,刚刚大于刚刚大于,或或刚刚小于刚刚小于边界的值做为测边界的值做为测试数据,而不是选取等价类中的典型值试数据,而不是选取等价类中的典型值或任意值做为测试数据。或任意值做为测试数据。例:有条件例:有条件:-1 x 1则:有效等价类是则:有效等价类是 “-1 x 1”无效等价类是无效等价类是“x1”和和 “x-1”测试数据应为:测试数据应为:-1,1,1.001,-1.001 如果在悬崖峭壁边可以自信地安全行走,平地如果在悬崖峭壁边可以自信地安全行走,平地就不在话下。如果软件在能力达到极限时能够运就不在话下。如果软件在能力达到极限时能够运行,那么在正常情况下就不会出什么问题行,那么在正常情况下就不会出什么问题。软件边界与悬崖很类似错误推测法错误推测法l人们靠人们靠经验和直觉经验和直觉推测程序中可能存在的推测程序中可能存在的各种错误,从而有针对性地编写检查这些各种错误,从而有针对性地编写检查这些错误的例子。这就是错误推测法。错误的例子。这就是错误推测法。l错误推测法的基本想法是:错误推测法的基本想法是:列举出程序中列举出程序中所有可能有的错误和容易发生错误的特殊所有可能有的错误和容易发生错误的特殊情况,根据它们选择测试用例。情况,根据它们选择测试用例。6.5 软件测试的策略软件测试的策略n软件测试的步骤软件测试的步骤p单元测试单元测试p组装测试组装测试p确认测试确认测试p系统测试系统测试单元测试单元测试(Unit Testing)l单元测试又称模块测试,单元测试又称模块测试,是针对软件设计是针对软件设计的最小单位的最小单位 程序模块程序模块,进行正确性检进行正确性检验验的测试工作。的测试工作。其目的在于发现各模块内部可能存在的其目的在于发现各模块内部可能存在的各种差错。各种差错。单元测试重点单元测试重点(1)模块接口测试模块接口测试l对通过被测模块的数据流进行测试对通过被测模块的数据流进行测试l 调用本模块的调用本模块的输入参数输入参数是否正确;是否正确;l 本模块本模块调用子模块调用子模块时输入给子模块的参数时输入给子模块的参数是否正确;是否正确;l 全局量全局量的定义在各模块中是否一致;的定义在各模块中是否一致;l在做在做内外存交换内外存交换时要考虑:时要考虑:l l 文件属性是否正确;文件属性是否正确;l OPEN与与CLOSE语句是否正确;语句是否正确;l 缓冲区容量与记录长度是否匹配;缓冲区容量与记录长度是否匹配;l 在进行读写操作之前是否打开了文件;在进行读写操作之前是否打开了文件;l 在结束文件处理时是否关闭了文件;在结束文件处理时是否关闭了文件;l 正文书写输入错误,正文书写输入错误,l IO错误是否检查并做了处理。错误是否检查并做了处理。(2)局部数据结构测试局部数据结构测试l不正确或不一致的数据类型说明不正确或不一致的数据类型说明l使用尚未赋值或尚未初始化的变量使用尚未赋值或尚未初始化的变量l错误的初始值或错误的缺省值错误的初始值或错误的缺省值l变量名拼写错或书写错变量名拼写错或书写错l不一致的数据类型不一致的数据类型l全局数据对模块的影响全局数据对模块的影响(3)重要的执行路径测试重要的执行路径测试l选择适当的测试用例,对模块中选择适当的测试用例,对模块中重要的重要的执行路径执行路径进行测试。进行测试。l应当设计测试用例查找由于应当设计测试用例查找由于错误的计算错误的计算错误的计算错误的计算、不不不不正确的比较正确的比较正确的比较正确的比较或或不正常的控制流不正常的控制流不正常的控制流不正常的控制流而导致的错误。而导致的错误。l对基本执行路径和循环进行测试可以发现大对基本执行路径和循环进行测试可以发现大量的路径错误。量的路径错误。(4)出错处理测试出错处理测试l出错的描述是否难以理解出错的描述是否难以理解l出错的描述是否能够对错误定位出错的描述是否能够对错误定位l显示的错误与实际的错误是否相符显示的错误与实际的错误是否相符l对错误条件的处理正确与否对错误条件的处理正确与否l在对错误进行处理之前,错误条件是否已经在对错误进行处理之前,错误条件是否已经引起系统的干预等引起系统的干预等.(5)边界条件测试边界条件测试l注意数据流、控制流中刚好等于、大于或注意数据流、控制流中刚好等于、大于或小于确定的比较值时出错的可能性。对这小于确定的比较值时出错的可能性。对这些地方要仔细地选择测试用例,认真加以些地方要仔细地选择测试用例,认真加以测试。测试。l如果对模块运行时间有要求的话,还要专如果对模块运行时间有要求的话,还要专门进行关键路径测试,以确定最坏情况下门进行关键路径测试,以确定最坏情况下和平均意义下影响模块运行时间的因素。和平均意义下影响模块运行时间的因素。单元测试需要从程序
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 生活常识


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!