北大测试全套课件和教案 9. 第4章 第3讲

更新时间:2024-05-30 12:44:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《软件测试基础》授课教案

授课内容:第四章 白盒测试技术 授课课次:第9次课

授课时数:2学时 授课日期: 上课教室: 目的与要求:

掌握白盒测试中基本路经测试的概念和方法; 了解程序插桩的概念和方法。 教学重点:

基本路经测试 教学难点:

程序插桩 教学方式:

1. 运用《白盒测试技术》课件进行课堂讲授,让学生理解基本路径测试的概念,掌握

基本路径测试方法;

2. 进行课堂练习,加深对基本路径测试的理解和使用。 教学内容:

1.程序结构分析 2.DD路径测试 3.基本路径测试 4.程序插桩 内容提要及时间分配:

1、课前引导(8分钟)

? 回顾6种覆盖法的基本思想。 ? 白盒测试中有哪些常用方法?

2、本课内容(75分钟)

? 程序结构分析 ? DD路径测试 ? 基本路径测试 ? 程序插桩

3、课后小结(5分钟) 4、布置作业(2分钟) 教学参考书:

1. 软件测试方法和技术 朱少民 清华大学出版社 2. 软件测试 Paul C.Jorgensen 机械工业出版社 讨论与思考:

把第2章的NextDate问题的伪代码转换成为控制流图,并简化。 作 业:

1.请把下面的程序流程图转化成控制流图。

1236479118105

2.重新编写程序片断14~20,用嵌套if-then-else语句替代复合条件。

14. if(a=b)AND (b=c) 15. Then Output(“Equilateral”)

16. Else If(a<>b)AND(a<>c)AND(b<>c) 17. Then Output(“Scalence”) 18. Else Output(“Isosecles”) 19. EndIf 20. EndIf

比较你改写后的程序和上面程序片断的圈复杂度。 复问题目:

序号 1 2 3 题 目 学 生 成 绩 教 学 内 容 与 方 法 步 骤

4.2.3程序结构分析

引言:程序的结构形式是白盒测试的主要依据。这一部分将从控制流分析和数据流分析的不同方面讨论如何分析程序结构。我们的目的是要在程序中找到隐藏的错误。

1. 控制流分析

由于非结构化程序会给测试带来许多不必要的困难,所以业界要求写出的程序具有良好的结构。上个世纪70年代以来,结构化程序的概念逐渐被人们普遍接受。体现这一要求对某些语言并不困难,比如Pascal、C,因为它们都具有反映基本控制结构的相应得控制语句。但对于有些开发语言要做到这一点,程序人员就要很注意程序结构化的要求,比如说汇编语言,若使用汇编语言编写程序,开发人员就尤其要注意程序的结构化要求。

正是由于这个原因,系统地检查程序的控制结构变得十分有意义了。 a) 控制流图

程序流程图又称框图,是我们最熟悉,也是最容易理解的一种程序控制结构的图形表示了。在这种图上的框里面常常标明了处理要求或者条件,但是,这些标注在做路径分析时是不重要的。为了了更加突出控制流的结构,需要对程序流程图做一些简化。在图4-2种我们给出了简化的例子。其中(a)图示一个含有两个出口判断和循环的程序流程图,我们把它简化成(b)的形式,称这种简化了的程序流程图叫做控制流图。 在控制流图中只有两种图形符号,它们是:

? 节点:以标有编号的圆圈表示。它代表了程序流程图中矩形框表示的处理、菱形表示的

两个到多个出口判断以及两条到多条流线相交的汇合点。

? 控制流线或弧:以箭头表示。它与程序流程图中的流线是一致的,表明了控制的顺序。

为了方便讨论,控制流线通常标有名字,如图中所标的a、b、c等。

为了使控制流图在机器上表示,我们可以把它表示成矩阵的形式,称为控制流图矩阵。图4-3表示了图4-2的控制流图矩阵,这个矩阵有5行5列,是由该控制图中5个节点决定的。矩阵中6个元素a、b、c、d、e和f的位置决定了它们所连接节点的号码。例如,弧d在矩阵中处于第3行第4列,那是因为它在控制流图中连接了节点3至节点4。这里必须注意方向,图中节点4到节点3没有弧,所以矩阵中第4行第3列也就没有元素。

11245

aac23fbcb3de

4ed5f

(a) (b)

图4-2程序流程图和控制流图 图4-3 控制流图矩阵 除了用程序流程图可以转化成控制流图以外,还可以把伪代码表示的处理过程转化成控制流图。根据程序建构控制流图很容易,如图4-4所示,我们把三角形伪代码实现过程转化成了控制流图。对于不可执行语句我们不把它映射成节点,比如变量和类型说明语句。 1. Program triangle2 ‘version of simple 2. Dim a,b,c As Integer 3. Dim IsATriangle As Boolean

4. Output(“Enter 3 integers which are sides of a triangle”) 5. Input(a,b,c)

6. Output(“Side A is ”,a) 7. Output(“Side B is ”,b) 8. Output(“Side C is ”,c)

9. If (a14. Then if(a=b)AND (b=c) 15. Then Output(“Equilateral”)

16. Else If(a<>b)AND(a<>c)AND(b<>c) 17. Then Output(“Scalence”)

456978101213211511141617192018222318. Else Output(“Isosecles”) 19. EndIf 20. EndIf

21.Else Output(“NOT a Triangle”) 22.EndIf 23.End triangle2

图4-4 三角形伪代码映射成的控制流图

我们有的时候为了方便会把一条伪代码语句做为一个节点,但有的时候,我们可以把几个节点合并成一个,合并的原则是:若在一个节点序列中没有分支,则我们可以把这个序列的节点都合并成一个节点。比如图4-4我们可以合并成如图4-5的形式。对于不可执行语句我们不把它映射成节点,比如变量和类型说明语句。

当过程设计中包含复合条件时,生成控制流图的方法要复杂一些。在这种情况下,我们要把复合条件拆开成一个个简单条件,让每一个简单条件对应流图中一个节点。这样的节点我们把它叫判定节点,它会引出两条或者多条边。如图4-6所示。

491012132115171914161811判定节点a??If a OR b Then call x Else call yEndIf??b x y

2220

23图4-5 简化后的三角形控制流图 图4-6 包含复合条件的伪代码转化成控制流图

b) 程序结构的基本要求

我们对于程序结构提出以下4点基本要求,这些要求是,写出的程序不应该包含:

? 转向并不存在的标号; ? 没有用过的语句标号;

? 从程序入口进入后无法达到的语句; ? 不能达到停机语句的语句。

显然,这些要求是合理的。目前,对这些情况的检测主要通过编译器和程序分析工具来实现。

2. 数据流分析

在单元测试中,数据仅仅在一个模块或者一个函数种流通。但是,数据流的通路往往涉及多个集成模块,甚至于整个软件,所以我们有必要进行数据流的测试,尽管它非常耗时。

数据流分析最初是随着编译系统要生成有效的目标代码而出现的,这类方法主要用于优化代码。数据流测试是指一个基于通过程序的控制流,从建立的数据目标状态的序列中发现异常的结构测试方法。数据流测试用作路径测试的“真实性检查”。

早期的数据流分析常常集中于现在叫做定义/引用异常的缺陷: ? 变量杯定义,但是从来没有使用。 ? 所使用的变量没有被定义。 ? 变量在使用之前被定义了两次。

因为程序内的语句因变量的定义和使用而彼此相关,所以用数据流测试方法更能有效地发现软件缺陷。但是,在度量测试覆盖率和选择测试路径的时候,数据流测试很困难。

4.2.4 DD-路径测试

引言:DD路径测试,即决策到决策路径测试。在讨论DD-路径测试之前,我们先要了解什么叫做链,在这里,链出现在有向图中,是一条起始节点和终止节点不同的路径,并且每个节点的出度=1,入度=1。也有一种长度为0的退化链情况,意思就是这条连只有一个节点和0条边。

1. DD路径概念:

DD-路径是控制流图中的一条链,只要满足下列五种情况之一: (1) 由一个节点组成,入度=0; (2) 由一个节点组成,出度=0;

(3) 由一个节点组成,入度>=2或者出度>=2;

(4) 由一个节点组成,入度=1并且出度=1; (5) 长度>=的最大链。

2. 举例

为了便于理解,我们用图3-4三角形伪代码映射成的控制流图来说明这五种情况。很显然,我们可以看出节点4的入度为0,是DD-路径的第一种情况,我们把它叫做“第一”;节点5-8是第五种情况,我们可以把这4个节点合成一个DD-路径,为什么是5-8,而不是5-7或者5-9呢?因为若是5-9的话,就会违反入度=出度=1的原则,若是5-7,就会违反“最大”的原则;节点10、11、15、17、18、21是情况4的DD-路径;节点9、12、13、14、16、19、20、22是情况3的DD-路径;而节点23的出度为0,是DD-路径的第二种情况,我们把它叫做“最后”。根据图4-4,我们画出图4-8对应的三角形程序DD-路径图,它包括的路径 名都列举在表4-8中。

控制流图节点

4 5-8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

DD-路径名称

第一 A B C D E F H I J K L M N G O 最后

定义情况

1 5 3 4 4 3 3 3 4 3 4 4 3 3 4 3 2

第一ABCEFGIKMNOHJLD最后

图4-8 三角形程序DD-路径图

提出DD-路径的目的很多质量机构都把DD-路径覆盖作为测试覆盖的最低可接受级别。E.F.Miller发现,当通过一组测试用例满足DD-路径覆盖要求时,可以发现全部缺陷中的大约85%(Miller 1991)。

如果每一条DD-路径都被遍历,则我们知道每个判断分支都被执行,其实就是遍历DD-路径图中每条边。对于if类的 语句,这意味着真、假分支都要覆盖。对于CASE语句,则每个子句都要覆盖。

4.2.5基本路径测试

引言:基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法。设计出的测试用例要保证在测试中程序的每个可执行语句至少执行一次。基本路径测试法包括以下5个方面: (1) 程序的控制流图:描述程序控制流的一种图示方法。 (2) 程序环境复杂性:

环形复杂度是一种为程序逻辑复杂性提供定量测度的软件度量,将该度量用于计算程序

的基本独立路径数目边。

例如:图4-8中的复杂性度量,我们用V(G)表示,用n代表节点数目,用e代表控制流线的数目,那么:V(G)=e-n+2=20-17+2=5。由此,我们可以得到三角形程序段的基本路径集中最多有5条独立路径。

(3) 导出测试用例:通过程序的控制流图导出基本路径集,列出程序的独立路径。 (4) 准备测试用例,确保基本路径集中的每一条路径的执行。

(5) 图形矩阵:是在基本路径测试中起辅助作用的软件工具,利用它可以实现自动地确定一

个基本路径集。

下面我们通过一个实例来说明基本路径测试。

例:请看以下代码,它由C++语言书写。,把它转化成图形矩阵,,最后请使用基本路径测试法为变量temp设计测试用例,使之满足基本路径覆盖要求。

1. void ReadPara( CString temp) 2. {

3. if ( temp = = \

4. m_oper.SetCurSel(0); 5. else 6. {

7. if (temp = = \

8. m_oper.SetCurSel(1); 9. else 10. {

11. if ( temp = = \12. m_oper.SetCurSel(2); 13. else 14. {

15. if( temp = = \

16. m_oper.SetCurSel(3); 17. else 18. {

19. if ( temp = = \

20. m_oper.SetCurSel(4); 21. else

22. m_oper.SetCurSel(5); 23. } 24. } 25. } 26. } 27. return; 28. }

1.画出这段代码的控制流图,如4-9所示:

2348121620232425262728711151922 图4-9 例题控制流图

2.根据控制流图,计算环路复杂度V(G)=22-18+2=6。 3.导出测试用例,列出路径: Path1:2-3-4-27-28 Path2:2-3-7-8-26-27-28 Path3:2-3-7-11-12-25-26-27-28 Path4:2-3-7-11-15-16-24-25-26-27-28 Path5:2-3-7-11-15-19-20-23-24-25-26-27-28 Path6:2-3-7-11-15-19-22-23-24-25-26-27-28 4.设计测试用例

根据第3步中给出的路径,下面设计测试用例列在表3-9中。 Path 1 Path 2 Path 3 传入参数 ReadPara(”>=”) ReadPara(”>”) ReadPara(”==”) 预期调用 m_oper.SetCurSel(0) m_oper.SetCurSel(1) m_oper.SetCurSel(2) Path 4 Path 5 Path 6 ReadPara(”<”) ReadPara(”<=”) ReadPara(”+”) m_oper.SetCurSel(3) m_oper.SetCurSel(4) m_oper.SetCurSel(5) 5.图形矩阵的画法在前面我们已经讲过,这里不再赘述。

4.2.6 程序插桩

在软件测试中,常常要用到一种“插桩”技术,通过在源代码中加入记录信息语句,以便进行运行信息的追踪和调试,统计有关的运行资源状况。 想做插桩,可以思考以下几点:

(1)如果出现在语句中包含了return语句,怎么在它前面插入指定语句?同时保证语句的语法合法性?

例如: for ( j=0;j<10000;j++) {

if ( j == k)

return ; <----- 不能直接在之前插入,否则意义全变了; }

(2)当出现需要在for 循环语句、while循环语句中进行插入信息时候,很可能会导致程序运行时间非常长,是否有办法改进“插桩”机制?

(3)是否可以由用户进行指定,比如for 语句、while语句或者指定的语句前不允许进行“插桩”,怎么实现?

(4)如果对于一个庞大的系统软件,我们需要进行对所运行的程序的每个函数记录其运行的有关参数,如:运行开始时间、退出时间、运行总时间、调用次数等等的统计,您有什么更好的建议与想法呢? 小 结

白盒测试作为软件质量保证中的重要一环,对产品稳定性起到至关重要的影响,不幸的是,由于实施白盒测试有较高技术难度,该软件过程常被厂商忽略,因为难于实施,所以容易失败,失败后产生畏惧心理,就更不愿意进一步去尝试,如此形成恶性循环。我们应该克服这种心理恐惧,不畏惧“白盒测试”这只拦路虎,只要方法得当,白盒测试还是能做起来的。

Path 4 Path 5 Path 6 ReadPara(”<”) ReadPara(”<=”) ReadPara(”+”) m_oper.SetCurSel(3) m_oper.SetCurSel(4) m_oper.SetCurSel(5) 5.图形矩阵的画法在前面我们已经讲过,这里不再赘述。

4.2.6 程序插桩

在软件测试中,常常要用到一种“插桩”技术,通过在源代码中加入记录信息语句,以便进行运行信息的追踪和调试,统计有关的运行资源状况。 想做插桩,可以思考以下几点:

(1)如果出现在语句中包含了return语句,怎么在它前面插入指定语句?同时保证语句的语法合法性?

例如: for ( j=0;j<10000;j++) {

if ( j == k)

return ; <----- 不能直接在之前插入,否则意义全变了; }

(2)当出现需要在for 循环语句、while循环语句中进行插入信息时候,很可能会导致程序运行时间非常长,是否有办法改进“插桩”机制?

(3)是否可以由用户进行指定,比如for 语句、while语句或者指定的语句前不允许进行“插桩”,怎么实现?

(4)如果对于一个庞大的系统软件,我们需要进行对所运行的程序的每个函数记录其运行的有关参数,如:运行开始时间、退出时间、运行总时间、调用次数等等的统计,您有什么更好的建议与想法呢? 小 结

白盒测试作为软件质量保证中的重要一环,对产品稳定性起到至关重要的影响,不幸的是,由于实施白盒测试有较高技术难度,该软件过程常被厂商忽略,因为难于实施,所以容易失败,失败后产生畏惧心理,就更不愿意进一步去尝试,如此形成恶性循环。我们应该克服这种心理恐惧,不畏惧“白盒测试”这只拦路虎,只要方法得当,白盒测试还是能做起来的。

本文来源:https://www.bwwdw.com/article/fi96.html

Top