--程序分析技术软件测试方法和技术由安博测试空间技术中心提供软件测试方法和技术董瑞志~nature_dongEmail:hello_u@eyou.comMSN:nature_dong@hotmail.com联系电话:13913688630内容提要•程序分析的视角–文本视角–句法视角–功能视角–计算流视角•程序分析技术–故障插入–变体分析–数据流分析–控制流分析–程序切片–程序插装文本视角•从文本的视角来看,一个程序被看作是字符或记号的序列。•文本视角提供的信息是物理的、基本的。它一般不对文本内容的语法和语义进行分析,而只对文本本身的基本内容进行分析。例如,分析文本的规模、行数、词汇数、词汇频度等内容。•文本视角是其他视角分析的基础。句法视角•一个程序可以被看成一个分层结构,它可以被分解到子程序,再被分解到语句组,然后被分解到语句等等,直到符号层。在这个分解中,每个最基本的元素以及元素间的组合关系是由程序语言的语法决定的。这种视角被称为句法视角。功能视角•程序可以被看成是一个功能集,功能被认为是对一个有序对(x,y)集合的指示。其中y是由程序在输入x处阻塞而产生的输出。用输入x执行程序和观察它的输出(如果有的话)是一种分析技术,该技术提供了程序在给定输入上的直接证据。计算流视角•一个程序可以被看成一个有限计算集的表示。一个计算是当程序执行特定输入时产生的数据状态的轨迹。通过一次执行来促使一个程序的计算流被完整分析,可以服务于估计在代码中遗留缺陷的数量、测试数据捕捉缺陷的能力和程序隐藏缺陷的可能性。变体分析•变体分析(变异分析)使用故障插入来分析测试数据的属性。带有插入错误的程序称为一个变体或变异。•变体分析在程序测试中的应用是相当广泛的,并且是一个相当重要的技术,可以用于验证测试的充分性。Tobecontinue……变体分析故障插入是一个统计的方法,用于评价遗留在一个程序中的故障数量和种类。首先,故障被插入到一个程序中,然后,程序被测试,并且发现故障的数量可用来估计还没有被发现故障的数量。主要目的是为了评价系统的哪些模块、哪些代码是危险模块、危险代码,容易出问题,从而评价系统的容错能力。控制流分析程序流程图:程序流程图是一种程序控制结构的图形表示方式。在程序流程图上的处理框内常常标明了处理要求或条件。Tobecontinue……控制流分析控制流图:为了更加突出控制流的结构,需要对程序流程图做些简化,这种简化了的流程图称为控制流图,即流图。Tobecontinue……控制流分析控制流图中的符号:①节点:以标有编号的圆圈表示,代表程序流程图中矩形框所表示的处理、菱形表示的分支及多选择结构点。②控制流线:以带箭头的直线或弧表示,与程序流程图中的数据流线是一致的,表明了控制的顺序。控制流线通常标有名字,如图中所标的a、b、c等。Tobecontinue……控制流分析为便于表示和处理控制流图,可以把控制流图表示成矩阵的形式,称为控制流图矩阵。控制流矩阵:nxn,n为控制流图中节点数量。Tobecontinue……控制流分析•控制流图矩阵数据流分析数据流分析最初是随着编译系统要生成有效的目标码而出现的,这类方法主要用于代码优化。数据流分析方法在确认系统中也得到成功的运用,用以查找如引用未定义变量等程序错误,以及用来查找对未曾使用的变量再次赋值等数据流异常的情况。数据流分析重要性•在程序测试中,找出这些错误是很重要的。因为这常常是常见程序错误的表现形式,如错拼名字、名字混淆或是丢失了语句。数据流分析的两个概念变量定义:如果程序中某一语句执行时能够改变某个变量V的值,则称V是被该语句定义的。变量引用:如果程序中某一语句的执行引用了内存中变量V的值,则说该语句引用变量V。数据流分析案例例如:1.语句X:=Y十Z定义了X,引用了Y和Z;2.语句ifY>Zthengotoexit引用了Y和Z。3.输入语句READX定义了X。4.输出语句WRITEX引用了X。Tobecontinue……数据流分析案例每个语句定义和引用的变量的列表。Tobecontinue……数据流分析程序中有两个错误:语句2使用了变量W,而在此之前并末对其定义。语句5、6使用变量V,这在第一次执行循环时也未对其定义过。程序中还包含两个异常:语句6对Z的定义从未使用过。语句8对W的定义也从未使用过。程序切片•对于给定的一个程序行为的子集,通过切片技术把程序减小到一个最小化形式,并且仍旧能产生给定的行为。这个简化后的程序就称为切片。Tobecontinue……程序切片•对于一个中等复杂的程序来说,要进行比较完整的测试其成本是非常高的。那么使用切片技术,可以把一个规模较大且较复杂的程序转换成多个使用一定切片标准而获得的切片程序,这些切片相对原来的程序来说,要简单且易于测试。程序插装程序插装是一种基本的白盒测试手段,在软件测试中有着广泛的应用。Tobecontinue……程序插装什么是程序插装?程序插装方法简单地说是借助在被测程序中插入检查点的方法,来实现白盒测试的目的。Tobecontinue……程序插装的目的通过测试这些检查点的信息,可以了解执行过程中程序的动态特性,如程序的实际执行路径,或是特定变量在特定时刻的取值。Tobecontinue……程序插装•从这一思想发展出的程序插装技术能够按用户的要求,获取程序的各种信息,成为测试工作的有效手段。•通过程序插装技术我们可以了解一个程序在某次运行中所有可执行语句被覆盖(或称被经历)的情况,或是每个语句的实际执行次数。Tobecontinue……程序插装的应用•测试覆盖率和测试用例有效性度量;•断言检测;•数据流异常检测;•路径智能分解Tobecontinue……用于测试覆盖率和测试用例有效性度量的程序插装可能的测试覆盖度量:程序中每个语句至少被执行一次;在流程图中的每个分支至少被经过一次;每个可能被执行的路径至少被经过一次。……可能途径:在控制流中确定一个点集;在程序中的这些点上插入软件计数器;用一组测试用例测试这个程序;检查计数器的值以确定获得的覆盖率的范围。Tobecontinue……程序插装•计数器的实现可以使用一个已命名的子程序或子过程。Tobecontinue…..程序插装•以计算整数x和整数Y的最大公约数程序为例。Tobecontinue…..程序插装图中虚线框并不是原来程序的内容,而是为了记录语句执行次数而插入的。虚线框语句形式为:C(i)=C(i)十1i=1,2,…,6Tobecontinue…..程序插装程序从入口开始执行,到出口结束。凡经历的计数语句都能记录下该程序点的执行次数。如果我们在程序的入口处还插入了对计数器C(i)初始化的语句,在出口处插人了打印这些计数器的语句,就构成了完整的插装程序。经过插装的程序便能记录并输出在各程序点上语句的实际执行次数。Tobecontinue…..程序插装•插装后的程序:Tobecontinue…..程序插装•经过插装的程序,一方面可检验测试的结果数据,另一方面还可借助插入语句给出的信息了解程序的执行特性。•所以,我们有时把插入的语句称为“探测器”或“探针”,借以实现“探查”或“监控”的功能。Tobecontinue…..程序插装在应用程序插装方法时,需要考虑的问题:①探测哪些信息;②在程序的什么部位设置探测点;③需要设置多少个探测点。①②需要结合具体程序分析。③需要考虑如何设置最少探测点,达到测试的目的。Tobecontinue…..程序插装实践表明,程序插装方法是应用很广的技术,特别是在完成程序的测试和调试时非常有效。Tobecontinue……用于断言检测的程序插装在程序的特定部位插入某些用以判断变量特性的语句,使这些语句在程序执行中得以证实,从而使程序的运行特性得以证实。把插入的这些语句称为断言。断言是程序插装技术的一个典型使用。程序员必须在程序的正确位置放人正确的断言,这不是一件容易的事情。ThankYou!