软件编码和软件测试.ppt
《软件编码和软件测试.ppt》由会员分享,可在线阅读,更多相关《软件编码和软件测试.ppt(175页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、 第第4章章 软件编码和软件测试软件编码和软件测试本章内容:l结构化程序设计(程序设计语言的选择 程序设计风格)l软件测试目标l测试方法l测试步骤l设计测试方案l测试原则和测试策略l软件调试、验证与确认l软件测试文档重点:l程序设计风格l设计软件测试方案4.1结构化程序设计v 结构化程序设计结构化程序设计(StructuredProgramming,SP)n仅采用顺序、选择、重复三种基本控制结构;n每种基本结构只有一个入口、一个出口;n将这三种基本控制结构根据程序的逻辑,嵌套或组合成结构化程序,完成预定的功能。v结构化程序设计的特点结构化程序设计的特点n源程序有清晰性,并能较好地适合自顶向下或
2、自底向上的程序设计技术。n在详细设计阶段,使系统结构具有模块化和清晰性的特性。n在软件编码阶段,使软件易于理解、修改,便于重复使用。4.1.1程序设计语言的选择1.程序设计语言的分类程序设计语言的分类(1)面向机器语言:机器语言和汇编语言。(2)高级程序设计语言2.高级语言选用的实用标准高级语言选用的实用标准(1)项目的应用领域(2)软件开发环境(3)根据系统用户的要求来选择(4)软件开发人员的知识4.1.2程序设计风格n源程序文档编写规则1源程序文档编写时,其标识符名称、注解和程序布局等要合理。2.数据说明3.语句构造要简单直接4.输入输出语句5.程序效率程序设计主要应考虑的是程序的正确性、
3、可理解性、可测试性和可维护性。程序的注释n夹在程序中的注释是程序员与日后的程序读者之间通信的重要手段。n注释决不是可有可无的。n一些正规的程序文本中,注释行的数量占到整个源程序的13到12,甚至更多。n注释分为序言性注释和功能性注释。序言性注释n通常置于每个程序模块的开头部分,它应当给出程序的整体说明,对于理解程序本身具有引导作用。有些软件开发部门对序言性注释做了明确而严格的规定,要求程序编制者逐项列出。n有关项目包括:n程序标题;n有关本模块功能和目的的说明;n主要算法;n接口说明:包括调用形式,参数描述,子程序清单;n有关数据描述:重要的变量及其用途,约束或限制条件,以及其它有关信息;n模
4、块位置:在哪一个源文件中,或隶属于哪一个软件包;n开发简历:模块设计者,复审者,复审日期,修改日期及有关说明等。功能性注释n功能性注释嵌在源程序体中,用以描述其后的语句或程序段是在做什么工作,或是执行了下面的语句会怎么样。而不要解释下面怎么做。n例如,/*ADD AMOUNT TO TOTAL*/TOTAL=AMOUNTTOTAL 不好。如果注明把月销售额计入年度总额,便使读者理解了下面语句的意图:/*ADD MONTHLY-SALES TO ANNUAL-TOTAL*/TOTAL=AMOUNTTOTALn要点n描述一段程序,而不是每一个语句;n用缩进和空行,使程序与注释容易区别;n注释要正确
5、。语句结构 在设计阶段确定了软件的逻辑流结构,但构造单在设计阶段确定了软件的逻辑流结构,但构造单个语句则是编码阶段的任务。语句构造力求简单、个语句则是编码阶段的任务。语句构造力求简单、直接,不能为了片面追求效率而使语句复杂化。直接,不能为了片面追求效率而使语句复杂化。在一行内只写一条语句n在一行内只写一条语句,并且采取适当的移行在一行内只写一条语句,并且采取适当的移行格式,使程序的逻辑和功能变得更加明确。格式,使程序的逻辑和功能变得更加明确。n许多程序设计语言允许许多程序设计语言允许在一行内写多个语句在一行内写多个语句。但这种方式但这种方式会使程序可读性变差会使程序可读性变差。因而不可取。因而
6、不可取。n例如,有一段排序程序例如,有一段排序程序FOR I:=1 TO N1 DO BEGIN T:=I;FOR J:=I1 TO N DO IF AJAT THEN T:=J;IF TI THEN BEGIN WORK:=AT;AT:=AI;AI:=WORK;END END;n由于一行中包括了多个语句,掩盖了程序的循环结构由于一行中包括了多个语句,掩盖了程序的循环结构和条件结构,使其可读性变得很差。和条件结构,使其可读性变得很差。FOR I:=1 TO N-1 DO /改进布局改进布局 BEGIN T:=I;FOR J:=I1 TO N DO IF AJAT THEN T:=J;IF TI
7、 THEN BEGIN WORK:=AT;AT:=AI;AI:=WORK;END END;程序编写首先应当考虑清晰性n程序编写首先应当考虑清晰性,程序编写首先应当考虑清晰性,不要刻意不要刻意追求技追求技巧性,使程序编写得过于紧凑。巧性,使程序编写得过于紧凑。例如,有一个用例如,有一个用 C 语句写出的程序段:语句写出的程序段:AI=AIAT;AT=AIAT;AI=AIAT;n此段程序可能不易看懂,有时还需用实际数据试验一下。此段程序可能不易看懂,有时还需用实际数据试验一下。n实际上,这段程序的功能就是交换实际上,这段程序的功能就是交换AI和和AT中的内容。中的内容。目的是为了节省一个工作单元。
8、如果改一下:目的是为了节省一个工作单元。如果改一下:WORK=AT;AT=AI;AI=WORK;就能让读者一目了然了。就能让读者一目了然了。程序要能直截了当地说明程序员的用意。n程序编写得要简单,写清楚,直截了当地说明程程序编写得要简单,写清楚,直截了当地说明程序员的用意。序员的用意。例如,例如,for(i=1;i=n;i+)for(j=1;j=n;j+)Vij (ij)*(ji)除法运算()在除数和被除数都是整型量时,其结果除法运算()在除数和被除数都是整型量时,其结果只取整数部分,而得到整型量。只取整数部分,而得到整型量。当当 ij 时时,i/j=0 当当 ji 时时,j/i=0 得到的数
9、组得到的数组 当当ij时时 Vij=(ij)*(ji)=0 当当ij时时 Vij=(ij)*(ji)=1这样得到的结果这样得到的结果 V 是一个单位矩阵。是一个单位矩阵。n写成以下的形式,就能让读者直接了解程序编写者的写成以下的形式,就能让读者直接了解程序编写者的意图。意图。for(i1;i=n;i+)for(j1;j 3)&(z3)&(z5)if(x=4)|(y5)8 8 j=x*y+10;/j=x*y+10;/语语句句块块2 29 9 j=j%3;/j=j%3;/语语句句块块3 31010 逻辑覆盖法(续)X3&z5执行语句块执行语句块3FFTTabdce2794 58语句覆盖n要实现要实
10、现DoWork函数的语句覆盖,只需设计一个测试函数的语句覆盖,只需设计一个测试用例就可以覆盖程序中的所有可执行语句。用例就可以覆盖程序中的所有可执行语句。n只要通过路径只要通过路径abd(或流图中(或流图中2-45-7-8-9)就可以语)就可以语句覆盖。句覆盖。测试用例输入为:测试用例输入为:x=4、y=5、z=5 程序执行的路径是:程序执行的路径是:abdn分析:分析:语句覆盖可以保证程序中的每个语句都得到执行,语句覆盖可以保证程序中的每个语句都得到执行,但发现不了判定中逻辑运算的错误,即它并不是一但发现不了判定中逻辑运算的错误,即它并不是一种充分的检验方法。例如在第一个判定种充分的检验方法
11、。例如在第一个判定(x3)&(z5错误写为错误写为y3)&(z3 取真值记为取真值记为T1,取假值记为取假值记为-T1 条件条件z5):条件条件x=4 取真值记为取真值记为T3,取假值记为取假值记为-T3 条件条件y5 取真值记为取真值记为T4,取假值记为取假值记为-T4条件覆盖(续)n根据条件覆盖的基本思想,要使上述根据条件覆盖的基本思想,要使上述4个条件可能个条件可能产生的产生的8种情况至少满足一次,设计测试用例如下:种情况至少满足一次,设计测试用例如下:测试用例测试用例 执行执行路径路径 覆盖条件覆盖条件覆盖覆盖分支分支x=4、y=6、z=5 abd T1、T2、T3、T4 bd x=2
12、、y=5、z=15 ace-T1、-T2、-T3、-T4 cen分析:上面这组测试用例不但覆盖了分析:上面这组测试用例不但覆盖了4个条件的全部个条件的全部8种情况,而且将两个判定的种情况,而且将两个判定的4个分支个分支b、c、d、e也也同时覆盖了,即同时达到了条件覆盖和判定覆盖。同时覆盖了,即同时达到了条件覆盖和判定覆盖。条件覆盖(续)n说明:虽然前面的一组测试用例同时达到了条件覆说明:虽然前面的一组测试用例同时达到了条件覆盖和判定覆盖,但是,并不是说满足条件覆盖就一盖和判定覆盖,但是,并不是说满足条件覆盖就一定能满足判定覆盖。如果设计了下表中的这组测试定能满足判定覆盖。如果设计了下表中的这组
13、测试用例,则虽然满足了条件覆盖,但只是覆盖了程序用例,则虽然满足了条件覆盖,但只是覆盖了程序中第一个判定的取假分支中第一个判定的取假分支c 和第二个判定的取真分和第二个判定的取真分支支d,不满足判定覆盖的要求,不满足判定覆盖的要求。测试用例测试用例 执行路执行路径径 覆盖条件覆盖条件覆盖覆盖分支分支x=2、y=6、z=5 acd-T1、T2、-T3、T4 cdx=4、y=5、z=15 acdT1、-T2、T3、-T4 cd判定/条件覆盖n判定判定/条件覆盖实际上是将判定覆盖和条件覆盖结条件覆盖实际上是将判定覆盖和条件覆盖结合起来的一种方法,即:设计足够的测试用例,使合起来的一种方法,即:设计足
14、够的测试用例,使得判定中每个条件的所有可能取值至少满足一次,得判定中每个条件的所有可能取值至少满足一次,同时每个判定的可能结果也至少出现一次。同时每个判定的可能结果也至少出现一次。n根据判定根据判定/条件覆盖的基本思想,只需设计以下两条件覆盖的基本思想,只需设计以下两个测试用例便可以覆盖个测试用例便可以覆盖4个条件的个条件的8种取值以及种取值以及4个个判定分支。判定分支。测试用例测试用例 执行执行路径路径 覆盖条件覆盖条件覆盖覆盖分支分支x=4、y=6、z=5 abdT1、T2、T3、T4 bdx=2、y=5、z=15ace-T1、-T2、-T3、-T4 ce判定/条件覆盖(续)n分析:从表面
15、上看,判定分析:从表面上看,判定/条件覆盖测试了各个判条件覆盖测试了各个判定中的所有条件的取值,但实际上,编译器在检查定中的所有条件的取值,但实际上,编译器在检查含有多个条件的逻辑表达式时,某些情况下的某些含有多个条件的逻辑表达式时,某些情况下的某些条件将会被其它条件所掩盖。因此,判定条件将会被其它条件所掩盖。因此,判定/条件覆条件覆盖也不一定能够完全检查出逻辑表达式中的错误。盖也不一定能够完全检查出逻辑表达式中的错误。例如:对于第一个判定例如:对于第一个判定(x3)&(z3和和z3为假,则编译器将不再检查为假,则编译器将不再检查z5)来说,若条件来说,若条件x=4满足,满足,就认为该判定为真
16、,这时将不会再检查就认为该判定为真,这时将不会再检查y5,那么,那么同样也无法发现这个条件中的错误。同样也无法发现这个条件中的错误。组合覆盖n组合覆盖的目的是要使设计的测试用例能覆盖每一组合覆盖的目的是要使设计的测试用例能覆盖每一个判定的所有可能的条件取值组合。个判定的所有可能的条件取值组合。n对对DoWork函数中的各个判定的条件取值组合加以函数中的各个判定的条件取值组合加以标记:标记:1、x3,z3,z=10 记做记做T1-T2,第一个判定的取假分支第一个判定的取假分支 3、x=3,z10 记做记做-T1 T2,第一个判定的取假分支第一个判定的取假分支 4、x=10 记做记做-T1-T2,
17、第一个判定的取假分支第一个判定的取假分支 5、x=4,y5 记做记做T3 T4,第二个判定的取真分支第二个判定的取真分支 6、x=4,y5 记做记做-T3 T4,第二个判定的取真分支第二个判定的取真分支 8、x!=4,y 0)5 6 if(iType=0)7 x=y+2;break;8 else9 if(iType=1)10 x=y+10;11 else12 x=y+20;13 14 746971012131446913101214基本路径测试方法(续)n画出控制流图:画出控制流图:n计算环形复杂度:计算环形复杂度:10(条边)(条边)-8(个节点)(个节点)+2=4n导出独立路径导出独立路径
18、(用语句编号表示)(用语句编号表示)路径路径1:414 路径路径2:46714 路径路径3:4691013414 路径路径4:4691213414467910121314基本路径测试方法(续)输入数据输入数据预期输出预期输出测试路径测试路径测试用例测试用例1irecordnum=0itype=0 x=0y=04-14测试用例测试用例2irecordnum=1itype=0 x=0y=04-6-7-14测试用例测试用例3irecordnum=1itype=1x=10y=04-6-9-10-13-4-14测试用例测试用例4irecordnum=1itype=2x=0y=204-6-9-12-13-
19、4-14n设计测试用例:设计测试用例:4.3循环测试方法n从本质上说,循环测试的目的就是检查循环结构的有从本质上说,循环测试的目的就是检查循环结构的有效性。效性。n通常,循环可以划分为简单循环、嵌套循环、串接循通常,循环可以划分为简单循环、嵌套循环、串接循环和非结构循环环和非结构循环4类。类。(1)测试简单循环。设其循环的最大次数为)测试简单循环。设其循环的最大次数为n,可采用,可采用以下测试集:以下测试集:跳过整个循环;跳过整个循环;只循环一次;只循环一次;只循环两次;只循环两次;循环循环 m 次,其中次,其中mn;分别循环分别循环 n-1、n 和和 n+1 次。次。循环测试方法(续)(2)
20、测试嵌套循环。如果将简单循环的测试方法用于嵌套循环,)测试嵌套循环。如果将简单循环的测试方法用于嵌套循环,可能的测试次数会随嵌套层数成几何级数增加。可能的测试次数会随嵌套层数成几何级数增加。此时可采用此时可采用以下办法减少测试次数:以下办法减少测试次数:测试从最内层循环开始,所有外层循环次数设置为最小值;测试从最内层循环开始,所有外层循环次数设置为最小值;对最内层循环按照简单循环的测试方法进行;对最内层循环按照简单循环的测试方法进行;由内向外进行下一个循环的测试,本层循环的所有外层循环仍由内向外进行下一个循环的测试,本层循环的所有外层循环仍取最小值,而由本层循环嵌套的循环取某些取最小值,而由本
21、层循环嵌套的循环取某些“典型典型”值;值;重复上一步的过程,直到测试完所有循环。重复上一步的过程,直到测试完所有循环。(3)测试串接循环。若串接的各个循环相互独立,则可分别采用)测试串接循环。若串接的各个循环相互独立,则可分别采用简单循环的测试方法;否则采用嵌套循环的测试方法。简单循环的测试方法;否则采用嵌套循环的测试方法。(4)对于非结构循环这种情况,无法进行测试,需要按结构化程)对于非结构循环这种情况,无法进行测试,需要按结构化程序设计的思想将程序结构化后,再进行测试。序设计的思想将程序结构化后,再进行测试。Z路径覆盖下的循环测试方法nZ路径覆盖是路径覆盖的一种路径覆盖是路径覆盖的一种变体
22、,它是将程序中体,它是将程序中的循的循环结构构简化化为选择结构的一种路径覆盖。构的一种路径覆盖。n循循环简化的目的是限制循化的目的是限制循环的次数,无的次数,无论循循环的的形式和循形式和循环体体实际执行的次数,行的次数,简化后的循化后的循环测试只考只考虑执行循行循环体一次和零次(不体一次和零次(不执行)两种行)两种情况,即考情况,即考虑执行行时进入循入循环体一次和跳体一次和跳过循循环体体这两种情况两种情况。在循在循环简环简化的化的思路下,循思路下,循环环与判与判定分支的效果是一定分支的效果是一样样的,即的,即:循循环环要要么么执执行行、要么跳要么跳过过。产生测试用例n在实践中,除了前面给出的各
23、种方法外,通常还可在实践中,除了前面给出的各种方法外,通常还可以采用以下三种方法来补充设计测试用例:以采用以下三种方法来补充设计测试用例:(1)通过非路径分析得到测试用例)通过非路径分析得到测试用例 这种方法得到的测试用例是在应用系统本身的这种方法得到的测试用例是在应用系统本身的实践中提供的,基本上是测试人员凭工作经验的得实践中提供的,基本上是测试人员凭工作经验的得到,甚至是猜测得到的。到,甚至是猜测得到的。(2)寻找尚未测试过的路径并生成相应的测试用例)寻找尚未测试过的路径并生成相应的测试用例 这种方法需要穷举被测程序的所有路径,并与这种方法需要穷举被测程序的所有路径,并与前面已测试路径进行
24、对比。前面已测试路径进行对比。(3)通过指定特定路径并生成相应的测试用例)通过指定特定路径并生成相应的测试用例最少测试用例数计算n为实现测试的逻辑覆盖,必须设计足够多的测试用为实现测试的逻辑覆盖,必须设计足够多的测试用例,并使用这些测试用例执行被测程序,实施测试。例,并使用这些测试用例执行被测程序,实施测试。我们关心的是:对于某个具体的程序来说,至少需我们关心的是:对于某个具体的程序来说,至少需要设计多少个测试用例。这里提供一种估算最少测要设计多少个测试用例。这里提供一种估算最少测试用例数的方法。试用例数的方法。n我们知道,结构化程序是由我们知道,结构化程序是由 3 种基本控制结构组成:种基本
25、控制结构组成:顺序型(构成串行操作)、选择型(构成分支操作)顺序型(构成串行操作)、选择型(构成分支操作)和重复型(构成循环操作)。和重复型(构成循环操作)。n为了把问题化简,避免出现测试用例极多的组合爆为了把问题化简,避免出现测试用例极多的组合爆炸,把构成循环操作的重复型结构用选择结构代替。炸,把构成循环操作的重复型结构用选择结构代替。这样,任一循环便改造成进入循环体或不进入循环这样,任一循环便改造成进入循环体或不进入循环体的分支操作了。体的分支操作了。最少测试用例数计算(续)n用用N-S图表示程序的图表示程序的3种基本控制结构:种基本控制结构:图中图中图中图中A A、B B、C C、D D
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件 编码 测试
限制150内