欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPTX文档下载  

    软件测试技术第2章ppt课件.pptx

    • 资源ID:1421347       资源大小:303.13KB        全文页数:65页
    • 资源格式: PPTX        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    软件测试技术第2章ppt课件.pptx

    软件测试技术及实践,第2章 白盒测试技术,詹慧静 陈燕 段相勇,本章学习目标,软件测试技术的基本理论 白盒测试常用的测试方法,2.1 软件测试技术概述,软件测试技术可分为白盒测试技术和黑盒测试技术两大类,任何软件产品都可以使用这两种技术进行测试。通常软件产品的测试采用黑盒测试和白盒测试相结合的方法。,白盒测试(Whitebox Testing)又称结构测试、逻辑驱动测试或基于程序的测试。白盒测试的对象是源程序,通过对程序的内部逻辑进行分析,来设计测试用例,对程序细节进行严密检验,对软件的逻辑路径进行测试。在程序的不同点检验“程序的状态”以判定其实际情况是否和预期的状态相一致。,黑盒测试(Blackbox Testing)又称功能测试、数据驱动的测试或基于规格说明的测试,是一种从用户观点出发的测试。用这种方法进行测试时,被测程序被当作一个黑盒,在不考虑程序内容结构和内部特征,测试者只知道该程序输入和输出之间的关系或程序的功能的情况下,依靠能够反映这一关系和程序功能的需求规格说明书,考虑确定测试用例和推断测试结果的正确性。软件的黑盒测试被用来证实软件功能的正确性和可操作性。,白盒测试检查的内容如下:1)对程序模块的所有独立的执行路径至少测试一遍。2)对所有的逻辑判定,取“真”与取“假”的两种情况都能至少测试一遍。3)在循环的边界和运行的界限内执行循环体。4)测试内部数据结构的有效性等。,黑盒测试主要是能发现以下几类错误:1)功能错误或功能遗漏。2)接口错误,输入及输出数据是否能通过接口正确的被传递。3)界面错误。4)数据结构或外部数据库访问错误。5)性能错误,如:性能不能满足需求。6)初始化和终止错误。,2.1 软件测试技术概述,为了能够掌握对软件进行白盒测试,需要掌握:,静态测试方法 动态测试方法,2.2 白盒测试,白盒测试技术又可分为静态测试方法和动态测试方法。 静态测试检查代码,代码被测试而不执行。动态测试则执行代码,代码被执行而不必检查。,静态测试是指不需要运行被测程序,而是使用人工和借助软件工具自动的来检查程序代码的语法、结构、过程、接口可能存在的错误,并检查软件的界面或文档可能存在的错误。 最常见的静态测试是找出源代码的语法错误,这类测试可由编译器来完成,因为编译器可以逐行的分析检验程序的语法,找出错误并报告。而对于非语法类的错误,编译器无法检查。非语法错误的静态测试主要有代码检查、静态结构分析等。它可以由人工检测,也可以借助于软件工具自动进行。,2.2.1 静态测试技术,1代码检查法 代码检查包括桌面检查、代码审查、代码走查等。,2.2.1 静态测试技术,在代码检查中,需要依据被测软件的特点,选用适当的标准与规则、规范。代码检查可使用测试工具或人工检查。可利用桌面检查、代码走查、代码审查等人工检查的方法仔细检查程序的结构、逻辑等方面的缺陷。在使用测试工具进行自动化代码检查时,测试工具一般会内置许多的编码规则。,代码检查法可以发现如下软件缺陷: 代码是否遵循设计标准、代码和设计是否一致。 代码逻辑表达的正确性。 代码结构的合理性。 代码编写是否符合代码规约、代码的可读性、编程风格是否一致。,2.2.1 静态测试技术,1代码检查法,2.2.1 静态测试技术,代码检查需要检查的内容如下:变量交叉引用表:检查未说明的变量和违反了类型规定的变量,以及变量的引用和使用情况。检查标号的交叉引用表:验证所有标号的正确性以及转向指定位置的标号是否正确。检查子程序、宏、函数:验证每次调用与所调用位置是否正确,调用的子程序、宏、函数是否存在,参数是否一致,以及检查调用方式与参数顺序、个数、类型上的一致性。等价性检查:检查全部等价变量的类型的一致性。常量检查:确认常量的取值、数制、数据类型。标准检查:检查程序是否有违反标准的问题。风格检查:检查程序的设计风格。比较控制流:比较设计控制流图和实际程序生成的控制流图的差异。选择、激活路径:在设计控制流图中选择某条路径,到实际的程序中激活这条路径。补充文档:根据以上检查项目,可以编制代码规则、规范和检查表等文档。对照程序的规格说明,详细阅读源代码:比较实际的代码,从中发现程序的问题和错误。,1代码检查法,2.2.1 静态测试技术,1)桌面检查 桌面检查由程序员检查自己编写的程序。程序员对源程序代码进行分析、检验并补充相关文档,目的是发现程序中的错误。由于程序员熟悉自己的程序及其程序设计风格,桌面检查由程序员自己进行可以节省很多的检查时间,但应避免主观片面性。,1代码检查法,2.2.1 静态测试技术,2)代码审查 由程序员和测试人员组成审查小组,通过阅读、讨论对程序进行静态分析的过程。 代码审查分两个步骤: (1)小组负责人提前把设计规格说明书、控制流程图、程序文本及有关要求、规范等分发给小组成员,作为审查的依据,小组成员充分阅读这些材料。 (2)召开程序审查会。在会上,首先由程序员逐句讲解程序的逻辑。在此过程中,程序员或其他小组成员可以提出问题,展开讨论,审查错误是否存在。实践表明,程序员在讲解过程中能发现许多原来自己没有发现的错误,而讨论和争议则促进了问题的暴露。,1代码检查法,2.2.1 静态测试技术,3)代码走查 由程序员和测试人员组成审查小组,通过逻辑运行程序发现问题的过程。与代码审查基本相同,代码走查也分为两个步骤: (1)小组负责人把设计规格说明书、控制流程图、程序文本及有关要求、规范等分发给走查小组的每个成员,小组成员充分阅读这些材料。 (2)召开程序走查会。首先由测试组成员为被测试程序设计有代表性的测试用例,使用这些测试用例逻辑运行程序。在对程序进行逻辑运行时,随时记录程序的踪迹,供分析和讨论用。借助测试用例的媒介作用,对程序的逻辑和功能提出各种疑问,结合问题开展热烈的讨论和争议,能够发现更多的问题。,2静态结构分析,2.2.1 静态测试技术,静态结构分析主要是以图形的方式表现程序的内部结构,静态结构分析通过应用程序各函数之间的调用关系展示了系统的结构,并可以直观地展示一个函数的内部逻辑结构。这两个功能可用函数调用关系图、模块控制流图完成。,2静态结构分析,2.2.1 静态测试技术,1)函数调用关系图 函数调用关系图以直观的图形方式描述一个应用程序中各个函数的调用和被调用关系。通过查看函数调用关系图,可以检查函数之间的调用关系是否符合要求,是否存在递归调用,函数的调用是否过深,有没有独立存在没有被调用的函数。从而可以发现系统是否存在结构缺陷,发现哪些函数是重要的,哪些是次要的,需要使用什么级别的覆盖要求。 2)模块控制流图 模块控制流图是由许多节点和连接节点的边组成的一种图形,其中一个节点代表一条语句或数条语句,边代表节点间控制流向,它显示了一个函数的内部逻辑结构。通过检查这些模块控制流图,能够很快发现软件的错误与缺陷。,2静态结构分析,2.2.1 静态测试技术,静态结构主要分析以下内容:1)函数的调用关系是否正确。2)是否存在孤立的函数没有被调用。3)明确函数被调用的频繁度,对调用频繁的函数可以重点检查。,2.2.2 动态测试,动态测试(Dynamic Testing),是指实际运行被测程序,输入相应的测试数据,检查输出结果和预期结果是否相符的过程。 动态测试方法的主要特征是计算机必须真正运行被测试的程序,通过输入测试用例,对其运行情况(输入/输出的对应关系)进行分析。在动态测试中,通常使用白盒测试和黑盒测试从不同的角度设计测试用例,查找软件中的错误。动态测试的黑盒测试方法及测试用例的设计在第3章中讲解,本节介绍动态测试的白盒测试方法及测试用例的设计。,2.2.2 动态测试,1程序插桩技术,程序插桩,最早是由J.C. Huang 教授提出的,它是在保证被测程序原有逻辑完整性的基础上,在程序的相应位置上插入一些探针(又称为“探测器”),通过探针的执行而得到程序运行的特征数据,通过对这些特征数据的分析,了解程序的内部行为和特征。这些探针实际上就是进行信息采集的代码段,可以是赋值语句、计数语句或采集覆盖信息的函数调用等,通过这些探针可以了解最为关注的信息,以判断程序执行过程中的一些动态特性。,2.2.2 动态测试,1程序插桩技术,由于程序插桩技术通过探针的执行来获得程序的控制流和数据流信息,以此来实现测试的目的。因此,根据探针插入的时间可以分为目标代码插桩和源代码插桩。 目标代码插桩需要对目标代码进行必要的分析以确定需要插桩的位置和内容。目标代码的格式主要和操作系统相关,与具体的编程语言及版本无关。目标代码插桩有着广泛的应用,例如在需要对内存进行监控的软件中。但是,由于目标代码中语法、语义信息不完整,而插桩技术需要对代码词法的分析有较高的要求,因此在覆盖测试工具中多采用源代码插桩。 源代码插桩是在对源代码进行完整的词法分析和语法分析的基础上进行的,这可以保证对源代码的插桩具有很高的准确度和针对性。源代码插桩需要接触到源代码,工作量较大,而且会因为编码语言及版本的不同而做适当的修改。,2.2.2 动态测试,1程序插桩技术,【例2-1】计算整数X和整数Y的最大公约数程序,通过插桩技术了解该程序在某次运行中所有可执行语句被覆盖的情况,既每个语句的实际执行次数。其插桩后的流程图如下。,2.2.2 动态测试,1程序插桩技术,设计插桩程序时要考虑和确定以下问题: 明确要探测哪些信息。可根据需要和具体情况确定。 在程序的什么部位插入探测点。 需要插入多少个探测点。就是要考虑如何能插入最少的点,来完成实际的探测问题。 程序中特定部位插入某些用以判断变量特性的语句。在程序中的特定部位插入某些 用以判断变量特性的语句,使得程序执行中这些语句得以证实,从而使程序的运行特性得到证实,把这些插入的语句称为断言语句。断言语句的作用是当程序执行到它的时候必须应该与之前的假设一致,否则,就会产生错误。例如,除法运算之前,加一条分母不为0的断言语句,可以有效的防止分母为0错误。断言语句对程序中隐藏很深,用其它方法很难发现的问题很有效。,2.2.2 动态测试,1程序插桩技术,在实际测试中通常在下面一些部位设置探测点。 程序块的第一个可执行语句之前。 for、do、do while、do until等循环语句处。 If、else、else及end if等条件语句各分支处。 函数、过程、子程序调用语句之后。 Return语句之后。 Goto语句之后。,2.2.2 动态测试,2逻辑覆盖,逻辑覆盖也是白盒测试主要的动态测试方法之一,是以程序内部的逻辑结构为基础的测试技术,是通过对程序逻辑结构的遍历实现程序的覆盖,这一方法要求测试人员对程序的逻辑结构有清楚的了解。 根据覆盖源程序语句的详细程度,逻辑覆盖包括以下不同的覆盖标准:语句覆盖、判定覆盖、条件覆盖、条件判定组合覆盖、多条件覆盖。 为了理解各种逻辑覆盖标准,根据下面源代码程序(用C语言书写),分别讨论不同的覆盖标准设计测试用例。,2.2.2 动态测试,2逻辑覆盖,【例2-2】有下列程序,其流程图如下图所示。 Void sp(int A,int B,int C) int x=0;y=0; if( A0&B1) Y=A*C; prinf(x,y); ,2.2.2 动态测试,2逻辑覆盖,1)语句覆盖(Statement Coverage) 语句覆盖的标准是设计足够的测试用例,运行被测程序,使被测程序中每条可执行语句至少执行一次。 对于例2-2,为达到“语句覆盖”的标准,只需设计一个能通过路径a-b-d的数据就可以使程序中每条可执行语句至少执行一次,为此可设计以下测试用例。 Test Case 1:A=3,B=-1,C=5 优点:语句覆盖可以很直观地从源代码得到测试用例,无须细分每条判定表达式。 缺点:语句覆盖的测试用例虽然覆盖了所有可执行语句,但并不能检查每个判断逻辑是否有问题,例如在第一个判断中把&错误的写成了|,则上面的测试用例仍可以覆盖所有的执行语句。因此语句覆盖是很不充分的一种标准,是最弱的逻辑覆盖标准。,2.2.2 动态测试,2逻辑覆盖,2)判定覆盖(Decision Coverage) 比语句覆盖稍强的覆盖标准是判定覆盖。判定覆盖的标准是设计足够的测试用例,运行被测程序,使被测程序中每个判断的“真”和“假”分支均至少执行一次,即判断的真假值均曾被满足。判定覆盖又称为分支覆盖。 对于例2-2,为达到“判定覆盖”的标准,只需设计通过路径a-c-d和a-b-e,或通过路径a-b-d和a-c-e,就可达到判定覆盖标准,为此可设计以下测试用例。 Test Case 1:A=5,B=10,C=-1(沿路径a-c-d执行) Test Case 2:A=2,B=-2,C=1(沿路径a-b-e执行),2.2.2 动态测试,2逻辑覆盖,2)判定覆盖(Decision Coverage) 判定覆盖比语句覆盖严格,每个分支都执行过了,每个语句一定也执行过。达到了判断覆盖标准一定也会达到语句覆盖标准。 优点:判定覆盖具有比语句覆盖较强的测试能力。同样判定覆盖也具有和语句覆盖一样的简单性,无须细分每个判定就可以得到测试用例。 缺点:往往大部分的判定语句是由多个逻辑条件组合而成,判定覆盖考虑的是每个判断语句的最终结果,而不能检查判断语句中每个逻辑条件是否有问题,有时某个逻辑条件有错误,设计的测试用例仍然能达到判定覆盖。因此判定覆盖仍是弱的逻辑覆盖标准。,2.2.2 动态测试,2逻辑覆盖,3)条件覆盖(Condition Coverage) 很多时候一个判断语句是由多个条件组合而成的复合判断。为了更彻底地实现逻辑覆盖,可以采用条件覆盖标准。条件覆盖的标准是设计足够的测试用例,运行被测程序,使被测程序中每个判断语句中每个逻辑条件的“真”和“假”值均至少被满足一次。 对于第1个判断语句: 条件“A0”,取真值为T1,取假值为F1; 条件“B1”,取真值为T4,取假值为F4; 为达到“条件覆盖”的标准,只需设计足够的测试用例,使得T1、F1、T2、F2、T3、F3、T4、 F4均至少被满足一次,就可达到条件覆盖标准,为此可设计以下测试用例。 Test Case 1:A=5,B=-2,C=-6,满足T1、T2、T3、F4(沿路径a-b-d执行) Test Case 2:A=-2,B=8,C=3,满足F1、F2、F3、T4(沿路径a-c-d执行),2.2.2 动态测试,2逻辑覆盖,4)条件判定组合覆盖(Decision Condition Coverage) 条件判定组合覆盖的标准是设计足够的测试用例,运行被测程序,使被测程序中每个判断语句中每个逻辑条件的“真”和“假”值均至少被满足一次,并且每个判断的“真”和“假”分支也均至少执行一次。对于例2-2,与条件覆盖一样,为程序的每个判断语句中所有条件取值加以标记。 条件“A0”、“B1”取真值分别为T1、T2、T3、T4,取假值分别为F1、F2、F3、F4。 为达到“条件判定组合覆盖”的标准,只需设计足够的测试用例,使得T1、F1、T2、F2、T3、F3、T4、 F4均至少被满足一次,并且程序中2个判断的“真”、“假”分支均至少被满足一次,就可达到条件判定组合覆盖标准,为此可设计以下测试用例。Test Case 1:A=5,B=-2,C=3,满足T1、T2、T3、T4(沿路径a-b-d执行)Test Case 2:A=-2,B=8,C=-3,满足F1、F2、F3、F4(沿路径a-c-e执行)满足条件判定组合覆盖标准的一定会满足语句覆盖、判定覆盖和条件覆盖。,2.2.2 动态测试,2逻辑覆盖,5)多条件覆盖 多条件覆盖也称为条件组合覆盖,多条件覆盖的标准是设计足够的测试用例,运行被测程序,使得每个判断中各条件的各种可能组合都至少被满足一次。显然满足多条件覆盖标准的测试用例是一定满足判定覆盖、条件覆盖和条件判定组合覆盖标准。 对于例2-2,为程序中每个判断的各条件取值的组合加以标记如下: (1)“A0,B0,B6”,记为“T1、F2”,第1个判断的取假分支。 (3)“A0,B1”,记为“T3、T4”,第2个判断的取真分支。 (6)“A=5,C1”,记为“T3、F4”,第2个判断的取真分支。 (7)“A5,C1”,记为“F3、T4”,第2个判断的取真分支。 (8)“A5,C1”,记为“F3、F4”,第2个判断的取假分支。,2.2.2 动态测试,2逻辑覆盖,5)多条件覆盖 为达到“多条件覆盖”的标准,只需设计足够的测试用例,使得上面(1)(8)组合都至少被满足一次,为此可设计以下测试用例。 Test Case 1:A=5,B=-5,C=8,4个条件取值分别T1、T2、T3、T4(沿路径a-b-d执行),满足(1)、(5)组合。 Test Case 2:A=5,B=9,C=1,4个条件取值分别T1、F2、T3、F4(沿路径a-c-d执行),满足(2)、(6)组合。 Test Case 3:A=-3,B=2,C=6,4个条件取值分别F1、T2、F3、T4(沿路径a-c-d执行),满足(3)、(7)组合。 Test Case 4:A=0,B=10,C=0,4个条件取值分别F1、F2、F3、F4(沿路径a-c-e执行),满足(4)、(8)组合。 虽然多条件覆盖比语句覆盖、判定覆盖、条件覆盖、条件判定组合覆盖有更强的覆盖准则,但仍然有a-b-e路径未被覆盖,而且当程序的判定语句较多是,其条件取值的组合数目是非常庞大。,2.2.2 动态测试,3测试覆盖准则,2)LCSAJ覆盖准则 在实施测试时,若要实现上述的Woodward层次LCSAJ覆盖,需要产生被测程序的所有LCSAJ。 尽管LCSAJ覆盖要比判定覆盖复杂得多,但是LCSAJ的自动化相对还是容易获得的。另外,对一个模块的微小变动可能对LCSAJ产生重大影响,因此维护LCSAJ的测试数据是相当困难的。一个大模块包含极其庞大的LCSAJ,因此要获得100%的覆盖率也是不现实的。然而Woodward等人提供的证据表明,把测试100%的LCSAJ作为目标比100%的判定覆盖要有效得多。,2.2.2 动态测试,3测试覆盖准则,1)错误敏感测试用例分析(ESTCA)准则 K.A.Foster的经验型覆盖准则是从硬件的早期测试方法中得到启发的。在硬件测试中,对每一个门电路的输入、输出测试都是有额定标准的。通常,电路中一个门的错误常常是“输出总是0”,或是“输出总是1”。与硬件测试中的这一情况类似,程序中谓词的取值也是比较容易出错的地方,而且它可能比硬件测试更加复杂。Foster 通过大量的实验确定了程序中谓词最容易出错的部分,得出了一套错误敏感测试用例分析ESTCA(Error Sensitive Test Cases Analysis) 准则。,2.2.2 动态测试,3测试覆盖准则,1)错误敏感测试用例分析(ESTCA)准则规则1:对于A rel B(rel可以是)型的分支谓词,在选择A与B的取值,使得测试执行到该分支语句时,应考虑AB的情况分别出现一次。规则2:对于A rel c(rel可以是,A是变量,c是常量)型的分支谓词。当rel为时,应适当地选择A,使得: A=c+M若A和c均为整数时,M=1。规则3:对外部输入变量赋值,使其在每一测试用例中均有不同的值与符号,并与同一组测试用例中其它变量的值与符号不一致。其中,规则1是为了检测rel的错误,如将“AB”。规则2是为了检测“差一”之类的错误,如将“A1”错写成“A0”。而规则3则是为了检测程序语句中的错误(如将引用一变量错写成引用一常量)。,2.2.2 动态测试,3测试覆盖准则,2)LCSAJ覆盖准则 LCSAJ覆盖(Linear Code Sequence and Jump Coverage)是线性代码顺序和跳转覆盖。在程序中,一个LCSAJ是一组顺序执行的代码,以控制跳转为其结束点。LCSAJ的起点,根据程序本身决定的。起点可以是程序第一行或转移语句的入口点,或是控制流可跳达的点。如果有几个LCSAJ首尾相接,且第一个LCSAJ起点为程序起点,最后一个LCSAJ终点为程序终点,这样的LCSAJ串就组成了程序的一条路径(LCSAJ路径)。一条LCSAJ程序路径可能是由2个、3个或多个LCSAJ组成的。基于LCSAJ与路径的这一关系,Woodward提出了LCSAJ覆盖准则,这是一个分层的覆盖准则:第一层:语句覆盖。第二层:分支覆盖。第三层:LCSAJ覆盖。即程序中的每一个LCSAJ都至少在测试中经历过一次。第四层:两两LCSAJ覆盖。即程序中每两个首尾相连的LCSAJ组合起来在测试中都要经历一次。 第n+2层:每n个首尾相连的LCSAJ组合在测试中都要经历过一次。,2.2.2 动态测试,3测试覆盖准则,2)LCSAJ覆盖准则 在实施测试时,若要实现上述的Woodward层次LCSAJ覆盖,需要产生被测程序的所有LCSAJ。 尽管LCSAJ覆盖要比判定覆盖复杂得多,但是LCSAJ的自动化相对还是容易获得的。另外,对一个模块的微小变动可能对LCSAJ产生重大影响,因此维护LCSAJ的测试数据是相当困难的。一个大模块包含极其庞大的LCSAJ,因此要获得100%的覆盖率也是不现实的。然而Woodward等人提供的证据表明,把测试100%的LCSAJ作为目标比100%的判定覆盖要有效得多。,2.2.2 动态测试,4基本路径测试法,如果某一程序的每一个独立路径都被测试过,那么可以认为程序中的每个语句都已经检验过了,即达到了语句覆盖。这种测试方法就是通常所说的基本路径测试方法。 基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法。设计出的测试用例要保证在测试中程序的每个可执行语句至少执行一次。 基本路径测试方法包括以下步骤: 1)画出程序控制流图 2)计算程序的环路复杂度,导出程序基本路径集中的独立路径条数,这是确定程序中每个可执行语句至少执行一次所必需的测试用例数目的上界。 3)根据程序的环路复杂度数目,确定程序的独立路径的集合。 4)为3)中独立路径集合中每一条独立路径设计测试用例。,2.2.2 动态测试,4基本路径测试法,1)程序的控制流图 (1)程序控制流图 程序的控制流图可以从程序的流程图简化映射得到。控制流图是描述程序控制流的一种图示方式。针对于程序的几种常用的控制结构的相应的表示如下图。其中,圆圈称为控制流图的一个结点,它表示一个或多个语句、一个处理框序列或一个条件判断框(不包含复合条件)。带箭头的直线或弧线为控制流图中控制流的方向,可称为边。,For/While 循环结构,Until 循环结构,If 分支结构,CASE 多分支结构,2.2.2 动态测试,4基本路径测试法,(2)程序的控制流图的映射规则 程序的流程图是用来描述程序的控制结构的。可将程序的流程图简化映射为相应的控制流图(假设流程图的菱形判断框不包含复合条件)。 将程序的流程图映射为相应控制流图映射规则如下:在程序流程图中,一个或顺序连接在一起的几个处理框可映射为一个节点。一个菱形判断框或一个菱形判断框与其上顺序连接在一起的几个处理框可映射为一个节点。与程序的流程图不同的是,在程序的控制流图中,一条边必须终止于一个节点。在分支或多分支结构中分支的汇聚处,即使没有执行语句也要添加一个汇聚节点。边和节点圈定的部分叫做区域。当对区域计数时,图形外的一个部分也应记为一个区域。,2.2.2 动态测试,4基本路径测试法,(2)程序的控制流图的映射规则例如,有左图的一程序的流程图,假设3、5条件判断框(不包含复合条件),按以上规则映射为相应的右图控制流图。,2.2.2 动态测试,4基本路径测试法,(2)程序的控制流图的映射规则 如果判定语句中的条件表达式为复合条件,即条件表达式由一个或多个逻辑运算符(and、or等)连接的逻辑表达式,则需要将复合条件转换为一系列只有单个条件的嵌套判断。 例如,“If a and b then x else y”或“If a or b then x else y”,假设a 和b都为单条件判断节点。,“a and b”复合条件控制流图,“a or b”复合条件控制流图,2.2.2 动态测试,4基本路径测试法,【例2-3】有下面结构的C函数,用基本路径测试方法设计测试用例。 Void pd (int x,int y, int z) While (x0) If (y=0 ) if (z10 ) 语句体1 else 语句体2 else If ( z0 ) 语句体3 语句体4 ,2.2.2 动态测试,4基本路径测试法,解:用基本路径测试方法设计测试用例的步骤如下。第一步:将被测程序流程图映射为控制流图,2.2.2 动态测试,4基本路径测试法,第二步:计算环路复杂度 可用以下3种方法计算环路复杂度。 1) 将环路复杂度定义为控制流图中的区域数。 2) 设E为控制流图的边数,N为图的结点数,则定义环路的复杂度为V(G)=EN+2。 3) 若设P为控制流图中的判断结点数,则有V(G)=P+1。 本实例控制流图中: 有5个区域,其环路复杂度为5; V(G)=E-N+2=14-11+2=5 V(G)=P+1=4+1=5 “5”是构成基本路径集的独立路径数的上界,可据此得到应该设计测试用例的数目。 从程序的环路复杂性可导出程序基本路径集合中的独立路径条数,这是确定程序中每个可执行语句至少执行一次所必须的测试用例数目的上界。,2.2.2 动态测试,4基本路径测试法,第三步:确定独立路径集合 独立路径的条数为V(G),即为5条。 路径1:1-8 路径2:1-2-3-4-10-11-1-8 路径3:1-2-3-5-10-11-1-8 路径4:1-2-6-7-9-11-1-8 路径5:1-2-6-9-11-1-8 第四步:准备测试用例 为确保基本路径集中的每一条路径的执行,根据判断节点给出的条件,选择适当的测试数据,保证每一条路径可以被测试到。 Test Case 1:x=0,y=12,z=-1 测试路径1; Test Case 2:x=3,y=0,z=20 测试路径2; Test Case 3:x=10,y=0,z=6 测试路径3; Test Case 4:x=30,y=-8,z=-10 测试路径4; Test Case 5:x=16,y=7,z=2 测试路径5;,2.2.2 动态测试,4基本路径测试法,【例2-4】有一被测程序,该程序可以根据输入的学生成绩,统计有效分数的个数、计算总分数及平均成绩。试用基本路径测试法设计测试用例。假设该程序最多可输入100个数据(以-1作为输入结束标志),解: 基本路径测试法设计测试用例的步骤如下: 第一步:将程序的流程图导出控制流图 根据题意画出程序的流程图,之后转换为控制图。 第二步:计算环路复杂度V(G) 1)按区域计算:V(G)=6 2)根据边数和节点数计算:V(G)=E-N+2=15-11+2=6 E为控制流图的边数,N为控制流图的结点数。 3)根据判断节点数计算:V(G)=P+1=5+1=6 P为控制流图的判断节点数。图2-10中,节点2、3、5、6、9为判断节点。,2.2.2 动态测试,4基本路径测试法,【例2-4】有一被测程序,该程序可以根据输入的学生成绩,统计有效分数的个数、计算总分数及平均成绩。试用基本路径测试法设计测试用例。假设该程序最多可输入100个数据(以-1作为输入结束标志),解: 第三步:确定基本路径集合。 根据环路复杂度的值,需要确定6条独立的路径。 路径1:1-2-9-11 路径2:1-2-3-4-5-8-2-3-9-11 路径3:1-2-3-4-5-6-7-8-2-3-9-10-11 路径4:1-2-3-4-5-8-2-9-10-11 路径5:1-2-3-4-5-6-8-2-9-10-11 路径6:1-2-3-4-5-6-7-8-2-9-10-11,2.2.2 动态测试,4基本路径测试法,【例2-4】有一被测程序,该程序可以根据输入的学生成绩,统计有效分数的个数、计算总分数及平均成绩。试用基本路径测试法设计测试用例。假设该程序最多可输入100个数据(以-1作为输入结束标志),解: 第四步:为每条独立路径设计测试用例 为每条独立路径设计测试用例,在测试时使每条独立路径至少被执行一次。 1)路径1(1-2-9-11)的测试用例: Score1=-1; 预期结果:结束该程序。 2)路径2(1-2-3-4-5-8-2-3-9-11)的测试用例: 输入多于100个数据,Scorei100 (1i100); 预期结果:结束该程序。 3)路径3(1-2-3-4-5-6-7-8-2-3-9-10-11)的测试用例: 输入多于100个数据,0Scorei100 (i1); 预期结果:根据输入的有效分数计算出有效分数的个数n1、总分数sum和平均成绩Average。,2.2.2 动态测试,4基本路径测试法,【例2-4】有一被测程序,该程序可以根据输入的学生成绩,统计有效分数的个数、计算总分数及平均成绩。试用基本路径测试法设计测试用例。假设该程序最多可输入100个数据(以-1作为输入结束标志),解: 4)路径4(1-2-3-4-5-8-2-9-10-11)的测试用例: Scorei-1, Scorei+1=-1 当1i100; 预期结果:根据输入的有效分数计算出有效分数的个数n1、总分数sum和平均成绩Average。 5)路径5(1-2-3-4-5-6-8-2-9-10-11)的测试用例: Scorei100,Scorei+1=-1 当1i100 预期结果:根据输入的有效分数计算出有效分数的个数n1、总分数sum和平均成绩Average。 6)路径6(1-2-3-4-5-6-7-8-2-9-10-11)的测试用例: Score100=-1; 0Scorei100 (1i100); 预期结果:根据输入的有效分数计算出有效分数的个数n1、总分数sum和平均成绩Average。,2.2.2 动态测试,5基本路径测试中的图形矩阵工具,为了使导出程序控制流图和决定基本测试路径的过程均自动化实现,有了辅助基本路径测试的软件工具,称为图形矩阵(Graph Matrix)。图形矩阵将程序的控制流图用正方形矩阵表示,矩阵的大小(即列数和行数)等于控制流图的节点数。每列和每行都对应于标识的节点,矩阵元素对应于节点间的连接(边)。控制流图的每一个节点用数字标识,每一条边用字母标识,,控制流图,图形矩阵,加权值的图形矩阵,2.2.2 动态测试,5基本路径测试中的图形矩阵工具,在图形矩阵中加入连接权值(Link Weight),在测试中就可以用于评估程序的控制结构,连接权为控制流提供了额外的信息。简单情况下,连接权为1(存在连接)或0(不存在连接。 计算矩阵每一行中“1”的个数,如果值大于或等于2,则这行所代表的节点一定是一个判断节点,再通过统计矩阵中判断节点的个数,而得出该图环路复杂性的值。利用此计算方法分析前面的图,其中第1行和第2行“1”的个数为2,因此这两行为判断节点,根据:环路复杂性的值=判断节点+1=2+1=3。 实际上,连接权值也可以赋予更有意义的属性,如执行连接(边)的概率或执行连接(边)的时间等。 利用图形矩阵可以使导出程序控制流图和决定基本测试路径的过程均自动化实现。,2.2.2 动态测试,6其他白盒测试方法,1)域测试 域测试是一种基于程序结构的测试方法。域测试的“域”指的是程序的输入域,该测试方法根据对程序输入域的分析,选择适当的测试点进行测试。将输入域分为若干不同的子域,使得每个子域对应于不同的计算,也就是每一个输入域的子域对应于程序的一条执行路径。输入域的子域划分由程序中分支语句的谓词决定。在每个子域中选择有代表性的数据元素对对应的路径进行测试,根据测试结果来寻找被执行路径的错误。,2.2.2 动态测试,6其他白盒测试方法,1)域测试 域测试主要测试如下错误: (1)域错误:程序的控制流存在错误,某个子域里的输入数据可能执行的是一条错误路径,这种错误称为路径错误,也叫做域错误。 (2)计算型错误:某个子域里的输入数据执行的路径正确,但该路径中存在语句的错误导致输出结果错误,称为计算型错误。 (3)丢失路径错误:由于程序中的某处少了一个判定谓词而引起的丢失路径错误。 域测试的缺点是: (1)为进行域测试对程序提出的限制过多。 (2)当程序中存在很多路径时,所需的测试用例很多。,2.2.2 动态测试,6其他白盒测试方法,2)符号测试 符号测试的基本思想是允许程序的输入不仅仅是具体的数值数据,而且包括符号值,符号值可以是基本的符号变量值,也可以是符号变量值的表达式。符号测试时,执行程序过程中是进行符号计算,而普通测试中是进行数值计算,所得结果是符号公式或符号谓词。简单的说,普通测试执行的是算术运算,而符号测试执行的是代数运算。符号测试的优点如下: (1)符号测试执行的是代数运算,可以作为普通测试的扩充。 (2)符号测试可以看作是程序测试和程序验证的一种折中办法。 (3)符号测试程序中仅有有限的几条执行路径。,2.2.2 动态测试,6其他白盒测试方法,2)符号测试 符号测试的缺点是: (1)分支问题不能控制 在程序执行到分支时,符号测试不能决定分支的走向,需要人工干预或其它方法使程序继续执行。 (2)二义性问题不能控制 数据项的符号值可能会存在二义性。 (3)大程序问题不能控制。,2.2.2 动态测试,6其他白盒测试方法,3)Z路径覆盖 程序中的路径指从程序入口开始,到执行过程中经历的各个语句,再到出口。通过对程序逻辑路径分析而进行的测试称为路径测试,路径测试的理想状态是做到路径覆盖,如果一个程序的逻辑路径非常复杂,包含多个判断及多个循环,可能的路径数目就会很庞大,这种情况要实现路径覆盖是不可能的。为了解决这一问题,必须舍掉一些次要因素,对循环机制进行简化,简化循环的目的是限制循环的次数。 简化循环意义下的路径覆盖称为Z路径覆盖。Z路径覆盖对循环机制进行简化,减少路径的数量,使得覆盖所有路径成为可能。无论循环的形式和循环体实际执行的次数是怎样的,简化后的循环测试都只考虑执行循环体一次和零次(不执行)两种情况,即考虑执行时进入循环体一次和跳过循环体这两种情况。,2.2.2 动态测试,6其他白盒测试方法,4)程序变异 程序变异是一种基于错误的测试技术。错误驱动测试是指该方法是针对某类特定程序错误的。 在变异测试中,测试人员首先根据被测试程序的特征设计变异算子,变异算子是在符合语法规则前提下,从原有程序生成差别极小程序(变异体)的转换规则。变异算子的设计基于经验和一些规则。通过变异算子对被测原有程序做微小的修改,即人为的引入错误,可生成大量的新程序,每个新程序称为原有程序的一个变异体。利用测试用例分别在原有程序及其变异体上执行,比较输出结果,如果输出结果不同,该变异体的变更被检测出来,也既是该变异体里的错误被检测出来,称为将该变异体杀死。如果输出结果不同,表示无法将变异体杀死,变异体无法杀死的原因有两个,一是测试数据不够充分,二是该变异体为等价变异体。在识别出等价变异体后,若已有测试用例不能杀除所有的非等价变异体,则需额外设计新的测试用例,并添加到测试用例集中,以提高测试充分性。,2.2.2 动态测试,6其他白盒测试方法,4)程序变异 变异测试还可以通过采用变异缺陷来模拟被测软件的真实缺陷,从而对测试人员提出的测试方法的有效性进行辅助评估。 变异测试的优点是便于集中目标对软件危害最大的可能错误,提高测试效率,降低成本。 变异测试可使用自动化测试来提高测试效率,由测试工具自动产生变异体,自动发现被杀死的变异体,通过与测试工具的交互可有选择的使用变异算子等。变异测试的缺点是需要大量的计算机资源。,软件测试技术可分为白盒测试技术和黑盒测试技术两大类,任何软件产品都可以使用这两种技术进行测试。通常软件产品的测试采用黑盒测试和白盒测试相结合的方法。 白盒测试技术又可分为静态测试方法和动态测试方法。静态测试主要有代码检查、静态结构分析等,代码检查又包括代码走查、桌面检查、代码审查。静态测试可以由人工检测,也可以借助于软件测

    注意事项

    本文(软件测试技术第2章ppt课件.pptx)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开