白盒测试技术案例详解

更新时间:2024-03-10 08:46:01 阅读量: 综合文库 文档下载

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

白盒测试技术案例详解

白盒测试的测试方法有代码检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法、域测试、符号测试、Z路径覆盖、程序变异。 其中运用最为广泛的是基本路径测试法。 基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法。

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

2. 程序圈复杂度:McCabe复杂性度量。从程序的环路复杂性可导出程序基本路径集合中的独立路径条数,这是确定程序中每个可执行语句至少执行一次所必须的测试用例数目的上界。

3. 导出测试用例:根据圈复杂度和程序结构设计用例数据输入和预期结果。 4. 准备测试用例:确保基本路径集中的每一条路径的执行。 工具方法: 图形矩阵:是在基本路径测试中起辅助作用的软件工具,利用它可以实现自动地确定一个基本路径集。

程序的控制流图:描述程序控制流的一种图示方法。

圆圈称为控制流图的一个结点,表示一个或多个无分支的语句或源程序语句

流图只有二种图形符号:

图中的每一个圆称为流图的结点,代表一条或多条语句。 流图中的箭头称为边或连接,代表控制流 任何过程设计都要被翻译成控制流图。 如何根据程序流程图画出控制流程图?

在将程序流程图简化成控制流图时,应注意:

n 在选择或多分支结构中,分支的汇聚处应有一个汇聚结点。

n 边和结点圈定的区域叫做区域,当对区域计数时,图形外的区域也应记为一个区域。 如下图所示

n 如果判断中的条件表达式是由一个或多个逻辑运算符 (OR, AND, NAND, NOR) 连接的复合条件表达式,则需要改为一系列只有单条件的嵌套的判断。 例如:

1 if a or b 2 x 3 else

4 y

对应的逻辑为:

独立路径:至少沿一条新的边移动的路径

基本路径测试法的步骤: o 第一步:画出控制流图

流程图用来描述程序控制结构。可将流程图映射到一个相应的流图(假设流程图的菱形决定框中不包含复合条件)。在流图中,每一个圆,称为流图的结点,代表一个或多个语句。一个处理方框序列和一个菱形决测框可被映射为一个结点,流图中的箭头,称为边或连接,代表控制流,类似于流程图中的箭头。一条边必须终止于一个结点,即使该结点并不代表任何语句(例如:if-else-then结构)。由边和结点限定的范围称为区域。计算区域时应包括图外部的范围。

画出其程序流程图和对应的控制流图如下

第二步:计算圈复杂度

圈复杂度是一种为程序逻辑复杂性提供定量测度的软件度量,将该度量用于计算程序的基本的独立路径数目,为确保所有语句至少执行一次的测试数量的上界。独立路径必须包含一条在定义之前不曾用到的边。 有以下三种方法计算圈复杂度:

流图中区域的数量对应于环型的复杂性;

给定流图G的圈复杂度V(G),定义为V(G)=E-N+2,E是流图中边的数量,N是流图中结点的数量;

给定流图G的圈复杂度V(G),定义为V(G)=P+1,P是流图G中判定结点的数量。

第三步:导出测试用例

根据上面的计算方法,可得出四个独立的路径。(一条独立路径是指,和其他的独立路径相比,至少引入一个新处理语句或一个新判断的程序通路。V(G)值正好等于该程序的独立路径的条数。)

ü 路径1:4-14 ü 路径2:4-6-7-14

ü 路径3:4-6-8-10-13-4-14 ü 路径4:4-6-8-11-13-4-14

根据上面的独立路径,去设计输入数据,使程序分别执行到上面四条路径。

o 第四步:准备测试用例

为了确保基本路径集中的每一条路径的执行,根据判断结点给出的条件,选择适当的数据以保证某一条路径可以被测试到,满足上面例子基本路径集的测试用例是: 举例说明:

例:下例程序流程图描述了最多输入50个值(以–1作为输入结束标志),计算其中有效的学生分数的个数、总分数和平均值。

步骤1:导出过程的流图。

步骤2:确定环形复杂性度量V(G): 1)V(G)= 6 (个区域)

2)V(G)=E–N+2=16–12+2=6

其中E为流图中的边数,N为结点数; 3)V(G)=P+1=5+1=6

其中P为谓词结点的个数。在流图中,结点2、3、5、6、9是谓词结点。 步骤3:确定基本路径集合(即独立路径集合)。于是可确定6条独立的路径: 路径1:1-2-9-10-12 路径2:1-2-9-11-12 路径3:1-2-3-9-10-12 路径4:1-2-3-4-5-8-2? 路径5:1-2-3-4-5-6-8-2? 路径6:1-2-3-4-5-6-7-8-2?

步骤4:为每一条独立路径各设计一组测试用例,以便强迫程序沿着该路径至少执行一次。

1)路径1(1-2-9-10-12)的测试用例: score[k]=有效分数值,当k < i ; score[i]=–1, 2?i?50;

期望结果:根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average。 2)路径2(1-2-9-11-12)的测试用例: score[ 1 ]= – 1 ;

期望的结果:average = – 1 ,其他量保持初值。 3)路径3(1-2-3-9-10-12)的测试用例:

输入多于50个有效分数,即试图处理51个分数,要求前51个为有效分数; 期望结果:n1=50、且算出正确的总分和平均分。 4)路径4(1-2-3-4-5-8-2?)的测试用例: score[i]=有效分数,当i<50; score[k]<0, k< i ;

期望结果:根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average。 举例说明:

例:下例程序流程图描述了最多输入50个值(以–1作为输入结束标志),计算其中有效的学生分数的个数、总分数和平均值。

步骤1:导出过程的流图。

步骤2:确定环形复杂性度量V(G): 1)V(G)= 6 (个区域)

2)V(G)=E–N+2=16–12+2=6

其中E为流图中的边数,N为结点数; 3)V(G)=P+1=5+1=6

其中P为谓词结点的个数。在流图中,结点2、3、5、6、9是谓词结点。 步骤3:确定基本路径集合(即独立路径集合)。于是可确定6条独立的路径: 路径1:1-2-9-10-12 路径2:1-2-9-11-12 路径3:1-2-3-9-10-12 路径4:1-2-3-4-5-8-2? 路径5:1-2-3-4-5-6-8-2? 路径6:1-2-3-4-5-6-7-8-2?

步骤4:为每一条独立路径各设计一组测试用例,以便强迫程序沿着该路径至少执行一次。

1)路径1(1-2-9-10-12)的测试用例: score[k]=有效分数值,当k < i ; score[i]=–1, 2?i?50;

期望结果:根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average。 2)路径2(1-2-9-11-12)的测试用例: score[ 1 ]= – 1 ;

期望的结果:average = – 1 ,其他量保持初值。 3)路径3(1-2-3-9-10-12)的测试用例:

输入多于50个有效分数,即试图处理51个分数,要求前51个为有效分数; 期望结果:n1=50、且算出正确的总分和平均分。 4)路径4(1-2-3-4-5-8-2?)的测试用例: score[i]=有效分数,当i<50; score[k]<0, k< i ;

期望结果:根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average。

连接权为“1”表示存在一个连接,在图中如果一行有两个或更多的元素“1”,则这行所代表的结点一定是一个判定结点,通过连接矩阵中有两个以上(包括两个)元素为“1”的个数,就可以得到确定该图圈复杂度的另一种算法。

案例讲解:基本路径测试??如下程序: 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. } 227. return;

328. }

47

1.画出这段代码的控制流图,如4-9所示: 8112.根据控制流图,计算环路复杂度V(G)=22-18+2=6。

12153.导出测试用例,列出路径: Path1:2-3-4-27-28 16192023242522Path2: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步中给出的路径,下面设计测试用例列在表4-9中。 Path 1 Path 2 Path 3 Path 4 Path 5 Path 6 传入参数 ReadPara(”>=”) ReadPara(”>”) ReadPara(”==”) ReadPara(”<”) ReadPara(”<=”) ReadPara(”+”) 预期调用 m_oper.SetCurSel(0) m_oper.SetCurSel(1) m_oper.SetCurSel(2) m_oper.SetCurSel(3) m_oper.SetCurSel(4) m_oper.SetCurSel(5) 5.图形矩阵的画法在前面我们已经讲过,这里不再赘述。 (请同学们自行画出)

九、最少测试用例数计算(参考)

? 为实现测试的逻辑覆盖,必须设计足够多的测试用例,并使用这些测试用例执行被

测程序,实施测试。我们关心的是:对于某个具体的程序来说,至少需要设计多少个测试用例。这里提供一种估算最少测试用例数的方法。

? 我们知道,结构化程序是由 3 种基本控制结构组成:顺序型(构成串行操作)、选

择型(构成分支操作)和重复型(构成循环操作)。

? 为了把问题化简,避免出现测试用例极多的组合爆炸,把构成循环操作的重复型结

构用选择结构代替。这样,任一循环便改造成进入循环体或不进入循环体的分支操作了。

★ 用N-S图表示程序的3种基本控制结构:

? 图中A、B、C、D、S均表示要执行的操作,P是可

取真假值的谓词,Y表真值,N表假值。

? 图中的 (c) 和 (d) 两种重复型结构代表了两种

循环。在做了简化循环的假设以后,对于一般的程序控制流,我们只考虑选择型结构。事实上它已经能体现顺序型和重复型结构了。

? 例如,下图表达了两个顺序执行的分支结构。当两个

分支谓词P1和P2取不同值时,将分别执行a或b及c或d操作。

显然,要测试这个小程序,需要至少提供4个测试用例才能作到逻辑覆盖,使得ac、ad、bc及bd操作均得到检验。其实,这里的4是图中的第1个分支谓词引出的两个操作,及第2个分支谓词引出的两个操作组合起来而得到的,即 2×2=4。并且,这里的2是由于两个并列的操作,即1+1=2 而得到的。

? 对于一般的、更为复杂的问题,估算最少测试用例个数的原则也是同样的: ? 如果在N-S图中存在有并列的层次A1、A2,A1和A2的最少测试用例个数分别为a1、

a2,则由 A1、A2 两层所组合的 N-S图对应的最少测试用例数为a1×a2。

? 如果在N-S图中不存在有并列的层次,则对应的最少测试用例数由并列的操作数决

定,即N-S图中除谓词之外的操作框的个数。

? 例:如下图所示的两个N-S图,至少需要多

少个测试用例完成逻辑覆盖? ? 对于第一个N-S图: 由于图中并不存在并列的层次,最少测试用例数由并列的操作数决定,即为1+1+1=3。

? 对于第二个N-S图:

由于图中没有包含并列的层次,最少测试用例数仍由并列的操作数决定,即为1+1+1+1+1=5。

★例:如下图所示的N-S图,至少需要多少个测试用例完成逻辑覆盖?

? 分析该N-S图:

图中的2345和67是并列的两层。其中,2345层对应的最少测试用例数为1+1+1+1+1=5,67层对应的测试用例数为1+1+1=3,2345和67这两层组合后对应的测试用例数为5×3=15。最后,由于两层组合后的部分是不满足谓词1时所要做的操作,还要加上满足谓词1要做的操作,因此整个程序所需测试用例数为15+1=16。

思考题:1、将下图所示的流程图转换为N-S图,并估算至少需要多少个测试用例完成逻辑覆盖?

2、某程序所画出的N-S图 如右图所示的,至少需要 多少个测试用例才能对该 程序实现逻辑覆盖?

白盒测试简单归纳 1、白盒测试基本技术

词法分析与语法分析、静态错误分析、表达式分析、接口分析 白盒测试又称为逻辑驱动测试,根据软件概要设计和详细设计说明文档生成用于白盒测试的测试用例。

2、程序插桩技术

程序插桩方法:是借助往被测程序中插入操作,来实现测试目的的方法。 插桩时需要考虑哪些问题: 1)、探测哪些信息

2)、在程序的什么部位设置探测点 3)、需要设置多少个探测点 3、代码检查方式

桌面检查、代码审查、走查 4、静态结构分析

由于可能没有在所有的出口进行动态内存的释放与回收操作,困些这样的结构存在内存泄漏的可能。

5、逻辑覆盖法

白盒测试的动态测试要根据程序的控制结构设计测试用例,原则是 1)、保证一个模块中的所有独立路径至少被使用一次 2)、对所有逻辑值均需测试true和false 3)、在上下边界及可操作范围内运行所有循环 4)、检查内部数据结构以确保其有效性。 6、逻辑覆盖的标准:

? Foster的ESTCA覆盖标准

? Woodward等人的层次LCSAJ覆盖标准

? 基于LCSAJ与路径的关系,提出了层次LCSAJ覆盖准则。它是一个分层的覆盖准则,

可以概括的描述为:

? ? ? ?

第一层 — 语句覆盖。 第二层 — 分支覆盖。

第三层 — LCSAJ覆盖,即程序中的每一个LCSAJ都至少在测试中经历过一次。 第四层 — 两两LCSAJ覆盖,即程序中的每两个相连的LCSAJ组合起来在测试中都要经历一次。

? 第n+2层 — 每n个首尾相连的LCSAJ组合在测试中都要经历一次。

? 在实施测试时,若要实现上述的层次LCSAJ覆盖,需要产生被测程序的所有LCSAJ。 ? 例:找出下面DoWork函数的所有LCSAJ和LCSAJ路径。

void DoWork (int x,int y,int z) 1. {

2. int k=0,j=0;

3. if ( (x>3)&&(z<10) ) 4. { k=x*y-1; 5. j=sqrt(k);

6. } //语句块1 7. if ( (x==4)||(y>5) )

8. { j=x*y+10; } //语句块2 9. j=j%3; //语句块3 10. }

? LCSAJ(5个):

(1)int k=0,j=0; if ( (x>3)&&(z<10) )

(2)k=x*y-1; j=sqrt(k); if ( (x==4)||(y>5) ) (3)if ( (x==4)||(y>5) ) (4)j=x*y+10; j=j%3 (5)j=j%3

? LCSAJ路径(4条):

(1)-(2)-(4) (1)-(2)-(5) (1)-(3)-(4) (1)-(3)-(5)

7、为什么要进行白盒测试? 原因有三,如下:

? 逻辑错误和不正确假设与一条程序路径被运行的可能性成反比。

? 我们经常相信某逻辑路径不可能被执行,而事实上,它可能在正常的基础上被执行。 ? 印刷上的错误是随机的。

8、白盒测试用例测试方法

1、 语句(statement)覆盖:语句覆盖是最起码的结构覆盖要求,要求设计足够多的测试用例,使得程序中每条可执行语句至少被执行一次。

2、判定(branches)覆盖/分支覆盖:要求设计足够多的测试用例,使得程序中每个判定至少有一次为真值,有一次为假值,即:程序中的每个分支至少执行一次。

3、条件(condition)覆盖:要求设计足够多的测试用例,使得判定中的每个条件至少有一次为真值,有一次为假值。

4、判定/条件(branches/condition)覆盖:设计足够多的测试用例,使得判定中每个条件的所有可能结果至少出现一次,每个判定本身所有可能结果也至少出现一次。

5、组合覆盖:要求设计足够多的测试用例,使得每个判定中条件结果的所有可能组合至少出现一次。

6、路径覆盖:设计足够的测试用例,覆盖程序中所有可能的路径

下面举例说明: 语句覆盖(SC):

程序中的每条词句至少执行一次

如●针对以下程序段,对于变量 c 的取值,至少需要(61)个测试用例才能够满足语句覆盖的要求。

c = ((u8_t *)q->payload)[i]; switch (c) {

case SLIP_END:

sio_send(SLIP_ESC, netif->state); sio_send(SLIP_ESC_END, netif->state); break; case SLIP_ESC:

sio_send(SLIP_ESC, netif->state); sio_send(SLIP_ESC_ESC, netif->state); break; default:

sio_send(c, netif->state); break; }

(61)A.4 B.3 C.2 D. 1

判定覆盖(DC)

设计足够测试用例,使得程序中的每个判定至少都获得一次“真值”或“假值”,或都 说使得程序中的每一个取“真”或“假”分支至少经历一次,因些判定覆盖又称分支覆盖。 A&&(B||C),A||(B||C) A=T,B=T,C=T A=F,B=F,C=F

●针对以下 C 语言程序段,对于(MaxNum,Type)的取值,至少需要(62)个测试用例能够满足判定覆盖的要求。

while ( MaxNum-- > 0 )

{

if ( 10 == Type ) x = y * 2; else

if ( 100 == Type ) x = y + 10; else

x = y - 20; }

(62)A.5 B. 4 C. 3 D. 2

测试用例:(1,10),(1,100),(1,200) 条件覆盖(CC):

构造一组测试用例,使得每一判定语句中每个逻辑条件的可能值至少满足一次 A&&(B||C),A||(B||C) A=T,B=F,C=T A=F,B=T,C=F ●针对下列程序段,对于(A,B)的取值,以下(57)测试用例组合能够满足条件覆盖的要求。 IF ( ( A - 10 ) = 20 AND ( B + 20 ) > 10 ) THEN C = 0 IF ( ( A - 30 ) < 10 AND ( B - 30 ) < 0 ) THEN B = 30 ①A=50 B=-10 ②A=40 B=40 ③A=30 B=-10 ④A=30 B=30 (57)A.①② B.③④ C.①④ D.②④

1 2 3 4 A 50 40 30 30 B -10 40 -10 30 A - 10 = 20 F F T T B + 20 > 10 F T T T A - 30 < 10 B - 30< 0 F T F F T T T F

条件判定组合覆盖(CDC)

设计足够的测试用例,使得判定中每个条件的所有可能(真/假)至少出现一次,并且每个判定本身的判定结果(真/假)也至少出现一次。 A&&(B||C),A||(B||C) A=T,B=T,C=T A=F,B=F,C=F

多条件覆盖(MCC)

使得每个判定中条件的各种可能组合都至少出现一次。 A&&(B||C),A||(B||C) A------B--------C T------T--------T T----- T------- F T------F--------T T------F--------F F------F--------F F------F--------T

F------T--------F F------T--------T

(2006)● 多条件覆盖是一种逻辑覆盖,它的含义是设计足够的测试用例,使得每个判定中条件的各种可能组合都至少出现一次,满足多条件覆盖级别的测试用例也是满足___(26)___级别的:针对布尔表达式A&&(B||C) 执行逻辑覆盖测试,测试用例至少需要___(27)___种组合才能满足多条件覆盖的要求。

(26)A.语句覆盖、判定覆盖、条件覆盖、条件判定组合覆盖

B.判定覆盖、条件覆盖;条件判定组合覆盖、修正条件判定覆盖 C.语句覆盖、判定覆盖、条件判定组合覆盖、修正条件判定覆盖 D.路径覆盖、判定覆盖、条件覆盖、条件判定组合覆盖 (27)A.6 B.4 C.8 D.12 修正条件判定覆盖(MCDC) 两个条件:①每一个程序模块的入口和出口都要考虑至少要被调用一次,每个程序的判定到所有可能的结果值至少转换一次;②其次,程序的判定被分解为通过逻辑操作符(and、or)连接的bool条件,每个条件对于判定的结果值是独立的。 ●假设 A、B 为布尔变量,对于逻辑表达式( A && B ),至少需要(63)个测试用例才能完成 MCDC 覆盖。

(63)A.4 B.3 C.2 D.1 用例集:{(T,T),(T,F),(F,T)}

1 2 3 4 A T T F F B T F T F A&&B T F F F

(2009)● 针对程序段:IF( A||B||C )THEN W=W/X,对于(A,B,C)的取值,(57)测试用例能够满足MCDC(修正条件逻辑判定)的要求。 (57)A.(F,T,T) (T,F,T) (T,F,F) (T,T,F) B.(T,F,F) (T,T,F) (F,T,T) (F,F,F) C.(T,F,F) (T,T,F) (F,T,T) (F,F,T) D.(T,F,F) (F,T,F) (F,F,T) (F,F,F)

序号 1 2 3 4 5 6 7 8 A T T T T F F F F B T T F F T T F F C T F T F T F T F A||B||C T T T T T T T F A B 4 2 7 6 C

6、基本路径法(环路复杂度)

? 通常环路复杂性可用以下三种方法求得: 1、将环路复杂性定义为控制流图中的区域数。

2、设E为控制流图的边数,N为图的结点数,则环路复杂性为 V(G)=E-N+2。 3、若设P为控制流图中的判定结点数,则有 V(G)=P+1。

? 但即使每条路径都测试过了,仍然可能存在错误。因为:

? 穷举路径测试无法检查出程序本身是否违反了设计规范,即程序是否是一个错误的

程序。

? 穷举路径测试不可能查出程序因为遗漏路径而出错。 ? 穷举路径测试发现不了一些与数据相关的错误。

? 测试覆盖率:用于确定测试所执行到的覆盖项的百分比。其中的覆盖项是指作为测

试基础的一个入口或属性,比如语句、分支、条件等。 ? 测试覆盖率可以表示出测试的充分性,在测试分析报告中可以作为量化指标的依据,

测试覆盖率越高效果越好。但覆盖率不是目标,只是一种手段。 ? 测试覆盖率包括功能点覆盖率和结构覆盖率:

? 功能点覆盖率大致用于表示软件已经实现的功能与软件需要实现的功能之间的比例

关系。

? 结构覆盖率包括语句覆盖率、分支覆盖率、循环覆盖率、路径覆盖率等等。

白盒测试历年考试类型(实战你能做多少?): 一、选择题: 2006年

● 多条件覆盖是一种逻辑覆盖,它的含义是设计足够的测试用例,使得每个判定中条件的各种可能组合都至少出现一次,满足多条件覆盖级别的测试用例也是满足___(26)___级别的:针对布尔表达式A&&(B||C) 执行逻辑覆盖测试,测试用例至少需要___(27)___种组合才能满足多条件覆盖的要求。

(26)A.语句覆盖、判定覆盖、条件覆盖、条件判定组合覆盖

B.判定覆盖、条件覆盖;条件判定组合覆盖、修正条件判定覆盖 C.语句覆盖、判定覆盖、条件判定组合覆盖、修正条件判定覆盖 D.路径覆盖、判定覆盖、条件覆盖、条件判定组合覆盖 (27)A.6 B.4 C.8 D.12

● 逻辑路径覆盖法是白盒测试用例的重要设计方法,其中语句覆盖法是较为常用的方法,针对下面的语句段,采用语句覆盖法完成测试用例设计,测试用例见下表,对表中的空缺项(True或者False),正确的选择是___(60)___。 语句段:

if (A && (B||C)) x=l; else x=O; 用例表:

A B C 用例1 TRUE ① TRUE 用例2 FALSE FALSE ②

A &&(B||C)

③ FALSE (60)A.①TRUE ②FALSE ③TRUE B.①TRUE ②FALSE ③FALSE C.①FALSE ②FALSE ③TRUE D.①TRUE ②TRUE ③FALSE ● ___(61)___方法根据输出对输入的依赖关系设计测试用例。

(61)A.路径测试 B.等价类 C.因果图 D.边界值 ● 针对下面程序段,边界值问题可以定位在___(62)___。 1:Rem Create a 10 element integer array 2:Rem lnitialize each element to -1 3:Dim data(10) As Integer 4:Dim i As Integer 5:For i=1 TO 10 6:data(i)=-1 7:Next i 8:End

(62) A. data(1) B. data(0) C. data(9) D. data(10) ● 以下控制流图的圈复杂度V(g)和基本圈复杂度EV(g)是___(63)___

(63)A.V(g)=5 EV(g)=1 B.V(g)=6 EV(g)=6 C.V(g)=5 EV(g)=5 D.V(g)=6 EV(g)=1 2007年

●阅读下列流程图:当用判定覆盖法进行测试时,至少需要设计(44)个测试用例。

当用判定覆盖法进行测试时,至少需要设计(44) 个测试用例。 (44)A. 2 B. 4 C. 6 D. 8 ●以下控制流程图的环路复杂性 V(G)等于(54) 。

(54) A.4 B.5 C.6 D.1

●针对下列程序段,对于(A,B,C)的取值,以下(56)测试用例组合能够满足语句覆盖的要求。

IF ( ( A + 10 ) = 2 OR ( B -20 ) < 3 ) THEN C = 0 IF ( ( A+30 ) > 10 AND ( C - 30 ) < 0 ) THEN B = 30

(56)A.(2,30,1) B.(-20,0,30) C.(-30,20,30) D.(2,20,3) ●针对下列程序段,对于(A,B)的取值,以下(57)测试用例组合能够满足条件覆盖的要求。 IF ( ( A - 10 ) = 20 AND ( B + 20 ) > 10 ) THEN C = 0 IF ( ( A - 30 ) < 10 AND ( B - 30 ) < 0 ) THEN B = 30 ①A=50 B=-10 ②A=40 B=40 ③A=30 B=-10 ④A=30 B=30

(57)A.①② B.③④ C.①④ D.②④

A=50 B=-10 A=40 B=40 A=30 B=-10 A=30 B=30 (A-10)=20 B+20>10 F T F T T F T T AND

F F F T A-30<10 B-30<0 T T F F T T T F AND

T F T F

●针对逻辑覆盖有下列叙述,(58)是不正确的。

(58) A.达到 100%DC 要求就一定能够满足 100%SC 的要求 B.达到 100%CC 要求就一定能够满足 100%SC 的要求 C.达到 100%CDC 要求就一定能够满足 100%SC 的要求 D.达到 100%MCDC 要求就一定能够满足 100%SC 的要求 ●以下所示程序控制流程图中有(59)条线性无关的基本路径。

(59)A.1 B.2 C.3 D.4 ●下列叙述中,(60)是正确的。

(60) A.白盒测试又称为逻辑驱动测试

B.穷举路径测试可以查出程序中因遗漏路径而产生的错误 C.一般而言,黑盒测试对结构的覆盖比白盒测试高

D.必须根据软件需求说明文档生成用于白盒测试的测试用例

●针对以下程序段,对于变量 c 的取值,至少需要(61)个测试用例才能够满足语句覆盖的要求。

c = ((u8_t *)q->payload)[i]; switch (c) {

case SLIP_END:

sio_send(SLIP_ESC, netif->state); sio_send(SLIP_ESC_END, netif->state); break; case SLIP_ESC:

sio_send(SLIP_ESC, netif->state); sio_send(SLIP_ESC_ESC, netif->state); break; default:

sio_send(c, netif->state); break; }

(61)A.4 B.3 C.2 D. 1

●针对以下 C 语言程序段,对于(MaxNum,Type)的取值,至少需要(62)个测试用例能够满足判定覆盖的要求。

while ( MaxNum-- > 0 ) {

if ( 10 == Type ) x = y * 2; else

if ( 100 == Type ) x = y + 10;

else

x = y - 20; }

(62)A.5 B. 4 C. 3 D. 2

●假设 A、B 为布尔变量,对于逻辑表达式( A && B ),至少需要(63)个测试用例才能完成 MCDC 覆盖。

(63)A.4 B.3 C.2 D.1

A B A&&B 用例1 T F F 用例2 T T T 用例3 F T F 用例4 F F F

(2008年)

(43)● 下面为C语言程序,边界值问题可以定位在(45)。 int data(3), int i,

for (i=1,i<=3,i++) data(i)= 100

A. data(0) B. data(1) C. data(2) D. data(3) ●(46)叙述是正确的。

①测试用例应由测试设计人员来制定 ②测试点应由测试人员确立

③测试工作展开于项目立项后,而不是代码开发完成之后 ④测试对象是源代码

A.①②③ B.②③ C.①③ D.①②③④ ● 通常测试用例很难100%覆盖测试需求,因为(47)。 ①输入量太大 ②输出结果太多 ③软件实现途径多

④测试依据没有统一标准

A.①② B.①③ C.①②③ D.①②③④ ● 假定X为整数类型变量,X>=1并且X<=10,如果用边界值分析法,X在测试中应该取(48)值。

A.1,10 B.0,1,10,11 C.1,11 D.1,5,10,11

● 针对下列程序段,需要(52)个测试用例可以满足语句覆盖的要求。 switch ( value ) {

case 0: other = 30; break; case 1: other = 50; break;

case 2:

other = 300; case 3:

other = other / value; break; default:

other = other * value; }

A.2 B.3 C.4 D. 5

● 针对逻辑覆盖(53)叙述是不正确的。

A.达到100%CC要求就一定能够满足100%DC的要求 B.达到100%CDC要求就一定能够满足100%DC的要求 C.达到100%MCDC要求就一定能够满足100%DC的要求 D.达到100%路径覆盖要求就一定能够满足100%DC的要求 ● 以下控制流程图的环路复杂性V(G)等于(54)。

A. 5 B. 6 C. 9 D 12

● 在程序控制流图中,有8条边,6个节点,则控制流程图的环路复杂性V(G)等于(55)。 A. 2 B. 4 C. 6 D. 8

● 针对程序段: IF(X>10)AND(Y<20)THEN W=W/A,对于(X,Y)的取值,以下(56)组测试用例能够满足判定覆盖的要求。

A. (30,15) (40,10) B. (3,0) (30,30) C. (5,25) (10,20) D. (20,10) (1,100)

X>10 Y<20 (30,15) T T (40,10)

T T

(3,0) F T (30,30)

T F

(5,25) F F (10,20)

F F

AND

T T F F F F

(20,10) T (1,100)

F

T F

T F

(2009年)

● 关于白盒测试的测试用例设计方法叙述,正确的是(55) 。

(55)A.完成SC(语句判定)所需的测试用例数目一定多于完成DC(逻辑判定)所需的测试用例数目

B.达到100%CC(条件判定)要求就一定能够满足100%SC的要求

C.达到 100%CDC(条件判定组合覆盖)要求就一定能够满足 100%CC的要求 D.任何情况下,都可以达到100%路径覆盖的要求 ● 以下控制流图的圈复杂度V(g)为(56) 。

(56)A.4 B.6 C.8 D.10

● 针对程序段:IF( A||B||C )THEN W=W/X,对于(A,B,C)的取值,(57)测试用例能够满足MCDC(修正条件逻辑判定)的要求。

(57)A.(F,T,T) (T,F,T) (T,F,F) (T,T,F) B.(T,F,F) (T,T,F) (F,T,T) (F,F,F) C.(T,F,F) (T,T,F) (F,T,T) (F,F,T) D.(T,F,F) (F,T,F) (F,F,T) (F,F,F)

序号 1 2 3 4 5 6 7 8 A T T T T F F F F B T T F F T T F F C T F T F T F T F A||B||C T T T T T T T F A B 4 2 7 6 C

● 针对下列程序段,需要(58)个测试用例可以满足分支覆盖的要求。 int IsLeap(int year) {

if ( year % 4 == 0 ) {

if ( ( year % 100 == 0 )

{

if ( year % 400 == 0 ) leap = 1; else

leap = 0; } else

leap = 1; } else

leap = 0; return leap; }

(58)A.3 B.4 C.6 D.7

● RUP 在每个阶段都有主要目标,并在结束时产生一些制品。在 (30) 结束时产生“在适当的平台上集成的软件产品” 。

(30)A. 初期阶段 B. 精化阶段 C. 构建阶段 D. 移交阶段

● 根据ISO/IEC 9126软件质量度量模型定义,一个软件的时间和资源质量子特性属于 (31) 质量特性。

(31)A. 功能性 B. 效率 C. 可靠性 D. 易使用性

● McCabe度量法是通过定义环路复杂度,建立程序复杂性的度量,它基于一个程序模块的程序图中环路的个数。计算有向图 G 的环路复杂性的公式为:V(G)=m-n+2,其中 V(G)是有向图 G 中的环路个数,m是 G 中的有向弧数,n 是 G 中的节点数。下图所示程序图的程序复杂度是 (32) 。

(32)A. 2 B. 3 C. 4 D. 5

● 在开发信息系统时,用于系统开发人员与项目管理人员沟通的主要文档是 (33) 。 (33)A. 系统开发合同 B. 系统设计说明书 C. 系统开发计划 D. 系统测试报告

● 软件工程每一个阶段结束前,应该着重对可维护性进行复审。在系统设计阶段复审期间,应该从 (34) 出发,评价软件的结构和过程。

(34) A. 指出可移植性问题以及可能影响软件维护的系统界面 B. 容易修改、模块化和功能独立的目的 C. 强调编码风格和内部说明文档 D. 可测试性

● 当用分支覆盖法对以下流程图进行测试时,至少需要设计 (35) 个测试用例。

(35)A. 4 B. 5 C. 6 D. 8

● 某银行为了使其网上银行系统能够支持信用卡多币种付款功能而进行扩充升级,这需要对数据类型稍微进行一些改变,这一状况需要对网上银行系统进行 (36) 维护。 (36)A. 正确性 B. 适应性 C. 完善性 D. 预防性 二、白盒测试技术应用题

试题1、(15 分)(2005年评测师)

阅读下列说明,回答问题1 至问题3,将解答填入大体纸的对应栏内。 【说明】

使用基本路径法设计出的测试用例能够保证程序的每一条可执行语句在测试过程中至少执行一次。以下代码由C 语言书写,请按要求回答问题。 Int IsLeap(int year) {

if (year % 4 == 0) {

if (year % 100 == 0) {

if ( year % 400 == 0) leap = 1; else

leap = 0; } else

leap = 1; } else

leap = 0; return leap; }

【问题1】(3 分)

请画出以上代码的控制流图 【问题2】(4 分)

请计算上述控制流图的圈复杂度V(G)(独立线性路径数) 【问题3】(8 分)

假设输入的取值范围是1000 < year < 2001,请使用基本路径测试法为变量year 设计测试用例,使其满足基本路径覆盖的要求。 试题2 (15分) 2006年上半年软件评测师下午试卷

阅读下列说明,回答问题1至问题3,将解答填入答题纸的对应栏内。 [说明]

基本路径法设计出的测试用例能够保证在测试中程序的每一条可执行语句至少执行一次。以下代码由C什语言书写,请按要求回答问题。 void ReadPara( CString temp) {

if ( temp == \

m_oper.SetCurSel(0); else {

if (temp == \

m_oper.SetCurSel(1); else {

if ( temp == \ m_oper.SetCurSel(2); else {

if( temp == \

m_oper.SetCurSel(3); else

{

if ( temp == \

m_oper.SetCurSel(4); else

m_oper.SetCurSel(5); } } } } return; }

[问题1] (6分)

请画出以上代码的控制流图。

[问题2] (3分)

请计算上述控制流图的环路复杂度V(G)。

[问题3] (6分)

请使用基本路径测试法为变量temp设计测试用例,使之满足基本路径覆盖要求。

试题3(15 分)2007 年上半年 软件评测师 下午试

阅读下列说明,回答问题 1 至问题 3,将解答填入答题纸的对应栏内。 [说明]

以下代码由 C 语言书写,能根据指定的年、月计算当月所含天数。 int GetMaxDay( int year, int month ) {

int maxday = 0;

if ( month >= 1 && month <= 12 ) {

if ( month == 2 ) {

if ( year % 4 == 0 ) {

if ( year % 100 == 0 ) {

if ( year % 400 == 0 )

maxday = 29; else

maxday = 28; } else

maxday = 29; } else

maxday = 28; } else {

if ( month == 4 || month == 6 || month == 9 || month == 11 )

maxday = 30; else

maxday = 31;

} }

return maxday;

}

[问题 1](4 分)

请画出以上代码的控制流图。 [问题 2](3 分)

请计算上述控制流图的环路复杂度V(G)。 [问题 3](8 分)

假设 year 的取值范围是 1000 < year < 2001,请使用基本路径测试法为变量 year、 month 设计测试用例(写出 year 取值、month 取值、maxday 预期结果),使之满足基本 路径覆盖要求。 试题4(10 分)(2008年)

阅读下列说明,回答问题 1 至问题 3,将解答填入答题纸的对应栏内。 [说明]

以下代码由 C 语言书写,在输入三个整数后,能够输出最大数和最小数。 int main( void ) {

int a, b, c, max, min;

printf( \\scanf( \if( a > b ) /*判断 1*/ {

max = a; min = b; } else {

max = b; min = a; }

if( max < c ) /*判断 2*/ max = c;

else if( min > c ) /*判断 3*/ min = c;

printf( \return 0; }

[问题 1](3 分)

请画出该程序段的控制流图,并分析该控制流图中有多少条线性独立路径(V(G)的值)。

V(G)=4,即有4条线性独立路径。

[问题 2](2 分)

为了用分支(判定)覆盖方法测试该程序,需要设计测试用例,使其能对该程序中的每个判断语句的各种分支情况全部进行过测试。 对两组输入数据(1)a=3,b=5,c=7;(2)a=4,b=6,c=5,请分别写出程序中各个判断语句的执行结果(以 T 表示真,以 F 表示假),填入答题纸的相应栏中。

用例序号 判断1 1(a=3,b=5,c=7) F 2(a=4,b=6,c=5) F 判断2

T

F 判断3 (没有运行到)

F

[问题 3](5 分)

上述两组测试数据是否能实现该程序的分支(判定)覆盖?如果能,请说明理由。如果不能,请再增设一组输入数据,使其能实现分支(判定)覆盖。

不能。a>b>c如a=7,b=6,c=5

用例序号 判断1 1(a=3,b=5,c=7) F 2(a=4,b=6,c=5) F 3(a=7,b=6,c=5) T 判断2

T

F F 判断3 (没有运行到)

F T

试题 5(10 分 )(2009年)

阅读下列说明,回答问题1至问题3,将解答填入答题纸的对应栏内。 [说明]

逻辑覆盖是通过对程序逻辑结构的遍历实现程序的覆盖,是设计白盒测试用例的主要方法之一。以下代码由C 语言书写,请按要求回答问题。 void cal( int n ) {

int g, s, b, q;

if ( ( n > 1000 ) && ( n < 2000 ) ) {

g = n % 10;

s = n % 100 / 10; b = n / 100 % 10; q = n / 1000;

if( ( q + g ) == ( s + b ) ) {

printf(\ } }

printf(\ return; }

[ 问题1](3 分 )

请找出程序中所有的逻辑判断语句。

if ( ( n > 1000 ) && ( n < 2000 ) ) if( ( q + g ) == ( s + b ) )

[问题 2](4 分)

请分析并给出分别满足100%DC(判定覆盖)和100%CC(条件覆盖)时所需的逻辑条件。

n n > 1000 ) && ( n < 2000 ( q + g ) == ( s + b ) 100%DC(判定覆盖) N=1010 T T N=900 100%CC(条件覆盖) N=1001

N=1010

F

T T T T

F T

[问题3](3 分 )

假设n的取值范围是0 < n < 3000,请用逻辑覆盖法为n的取值设计测试用例,使用例集满足基本路径覆盖标准。

用例1:n的取值范围是0 < n < 3000内任一整数,如 n=1010,2010,3010等; 用例2:n的取值范围是0 < n < 3000内任一整数,如 n=1,1001等

用例3:n的取值范围不在0 < n < 3000内任一整数,如 -1,3000等,n=3000

试题6:

使用逻辑覆盖测试方法测试以下程序段: Void DoWork(int x,int y,int z) {

1 int k=0,j=0;

2 if ((x>3)&&(z<10) 3 {

4 K=x*y-1; 5 j=sqrt(k); 6 }

7 if ((x==4)||(y>5)) 8 j=x*y+10; 9 j=j%3; 10 }

说明:程序段中每行开头的数字(1~10)是对每条语句的编号。 (1) 画出程序的控制流图(用题中给出的语句编号表示)。

(2) 简述什么是测试用例。白盒测试的动态测试要根据程序的控制结构设计测试用例简

述其原则。

(3) 分别以语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖、路径覆

盖方法设计测试用例,并写出每个测试用例的执行路径(用题中给出的语句编号表示)。

参考答案:

(1) 程序控制流图

(2) 测试用例:

就是将软件测试的行为活动作一个科学化的组织归纳。测试用例是为特定的目的而设计的一组测试输入、执行条件和预期的结果。执行的最小实体。

测试用例应包括:测试目标和被测功能、测试环境和其他条件、测试数据和测试步骤。 白盒测试的动态测试要根据程序的控制结构设计测试用例,原则是

1)、保证一个模块中的所有独立路径至少被使用一次 2)、对所有逻辑值均需测试true和false 3)、在上下边界及可操作范围内运行所有循环 4)、检查内部数据结构以确保其有效性。

(3) 设计的测试用例如下:

覆盖策略

测试用例

语句覆盖(SC) X=4 y=5 z=5 判定覆盖(DC) X=4 y=5 z=5 X=2 y=5 z=5 条件覆盖(CC)

X=2 y=6 z=5 X=4 y=5 z=15 判定/条件覆盖(CDC)

X=4 y=6 z=5 X=2 y=5 z=15 条件组合覆盖(MCC)

X=4 y=6 z=5 X=4 y=5 z=15 X=2 y=6 z=5 X=2 y=5 z=15 路径覆盖

X=4 y=6 z=5 X=4 y=5 z=15 X=5 y=5 z=5 X=2 y=5 z=15

(x>3)&&(z<10) x>3 z<10 (x==4)||(y>5) x==4T X=4 Z=5 T T T X=4 Z=5 T T F

X=2 Z=5 T

F F(T F) X=4 Z=15 T(T F) T F(F T) X=2 Z=5 T(F T) F F(F T) X=2 Z=5 T(F T) F F(T F)

X=4 Z=15 T(T F)

T

执行路径

2→45→7→8→9 2→45→7→8→9 2→7→9 2→7→8→9 2→7→8→9

2→45→7→8→9 2→7→9

2→45→7→8→9 2→7→8→9 2→7→8→9 2→7→9

2→45→7→8→9 2→7→8→9 2→45→7→9 2→7→9

y>5

F(Y=5) SC T F(Y=5) DC T F

F(Y=5) F(Y=5) CC A&&(B||C),A||(B||C) T(Y=6) A=T,B=F,C=T T(Y=6) A=F,B=T,C=F

F(Y=5)

T(TT) F(FF)

X=4 Z=5 T(T T) X=2 Z=15 F(F F)

T F

T(Y=6) CDC A&&(B||C),A||(B||C) F(Y=5)

A=T,B=T,C=T A=F,B=F,C=F

T(Y=6) MCC A&&(B||C),A||(B||C) F(Y=5) T(Y=6) F(Y=5)

A------B--------C T------T--------T T----- T------- F T------F--------T T------F--------F F------F--------F F------F--------T F------T--------F F------T--------T

2→45→7→8→9 2→7→8→9 2→45→7→9 2→7→9

T(TT) F(TF) F(FT) F(FF)

X=4 Z=5 T(TT) X=4 Z=15 F(TF) X=2 Z=5 T(TF) X=2 Z=15 F(FF)

T T F F

T(TT) F(TF) T(TT) F(FF)

X=4 z=5 T(TT)

z=15 X=4 z=5 T(TF)

z=15 X=5 F(FF) X=2

F(FF)

T T F F

T(y=6 ) DD

F(y=5) 径

F(y=5) 盖 F(y=5)

案例7、2007年嵌入式设计师试题1(共15分) 阅读以下关于嵌入式软件测试的叙述,回答问题1 至问题3,将解答填入答题纸的对应栏内。 【说明】

某嵌入式软件主要用于控制飞机起落架。飞机起落架的可靠性直接关系着机载人员的人身安全。根据载机设备对软件可行性要求,一般将软件分为3级:关键级软件、主要级软件和一般级软件。由于该嵌入式软件被定义为关键软件,要求按关键软件进行测试。 [问题1](5分)

请根据测试要求,简要说明语句覆盖 SC(Statement Coverage)、判定覆盖 DC(Decision coverage)、条件覆盖 CC(Condition Coverage)、条件/判定组合覆盖 CDC(Condition/ Decision Coverage)的含义。

[问题2](7分)

根据本题所示的软件关键级别,回答该软件需要做哪几项覆盖测试?要求的覆盖率是多少?如果是一般级软件,应做哪几项覆盖测试?

[问题3](3分)

在软件单元测试中,主要测试对象是软件模块,如果被测程序中多处调用了其它过程代码,测试中奕如何处理这些功能的引用?软件的性能测试在测试工作的哪个阶段进行?

参考答案: [问题1]

逻辑覆盖测试分类 语句覆盖(SC)

含义

选择足够多的测试数据,使被测程序中每条语句至少执行一次

判定覆盖(DC) 设计足够多的测试用例,使得程序中的每一个判定

至少获得一次‘真’值和‘假’值,或者使得程序中的每一个取‘真’分支或取‘假’分支至少经历一次,因此又称分支覆盖

条件覆盖(CC) 设计足够多的测试用例,使得每一判定语句中每个

逻辑条件的可能值至少满足一次

条件判/定组合覆盖(CDC) 设计足够多的测试用例,使得判定中的每个条件的

所有可能(真/假)至少出现一次,并且每个判定本身的判定结果也至少出现一次

条件组合覆盖(MCDC) 也称条件组合覆盖,设计足够多的测试用例,使得

每个判定中条件的各种可能组合都至少出现一次(以数轴形式划分区域,提取交集,建立最少的测试用例)

[问题2]

(1)本软件是关键级软件,应进行语句覆盖 SC、判定覆盖 DC、条件覆盖 CC、条件/判定组合覆盖 CDC、条件组合覆盖(MCDC)共5项,要求覆盖率指标达到100%覆盖。 (2)如果是一般软件,仅做语句覆盖和判定覆盖。 [问题3]

(1) 用打桩技术处理这些功能的引用。 (2) 性能测试在系统测试阶段进行。

案例8、(2009年嵌入式工程师)试题三(共15分)

下面是关于嵌入式软件测试方面的叙述,回答问题1和问题2,将解答填入答题纸的对应栏内。 【说明】

甲公司是一个专业的软件测评中心,承担了某机载软件测试任务。王工是该测试任的负责人。用户指出,被测软件是控制飞机飞行的关键软件,其安全性要求很高,必须按有关规定展开测评工作。

【问题1】(8分)

王工与被测方讨论被测件的测试计划时,在测试环境方面产生了分歧。王工认为:

由于当前被被测件的实验平台要用于系统联试,没有时间提供给测评工作,测评工作可在仿真环境下进行,没有必要非得在目标机环境下测试;而被测方认为:软件测评工作仅仅用仿真环境下是不够的,不能真实反映软件特性,可根据需要安排在实验平台上进行。

请对双方的意见进行分析,回答①~④问题: 王工和被测方的意见 ①

①A.都对 B.王工正确而被测方不正确 C.都不正确 D.被测方正确而王工不完全正确

你对有关测试环境的建议如下(请将建议填入答题纸的对应栏内): 1、 ② ; 2、 ③ ; 3、 ④ 。

[问题2](7分)

仔细阅读以下有关修正的条件判定覆盖(MC/DC)和条件判定覆盖(C/DC)的叙述,回答①~④问题,并将其填入答题纸的对应栏内。

由于被测件是关键级软件,按有关规定,被测件的测试必须达到MC/DC。MC/DC要求测试集满足 ① 条件;C/DC要求测试集满足 ② 条件。图3-1的例子中给出了两个判定条件的例子,则满足MC/DC要求的测试集是{ ③ },满足C/DC要求的测试集是{ ④ }。

IF A OR B THEN 。。。 。。。 ELSE 。。。 。。。 ENDIF

图 3-1两个判定条件的例子

MC/DC A T B T A||B T

T F F T F

F T F T F

T T F T F

C/DC

案例9、

①某程序流程图如图3-1所示。其中A、B、C均为二进制数,X,Y,Z的初值均为0,如果对此流程程序进行多重覆盖测试,预期的结果为 X=1、Y=0、Z=1,正确的测试用例是 (7) ,请从以下备选项中选择正确的测试用例填在答题纸对应的位置。 A.A=1 B=0 C=0 和 A=1 B=1 C=0 B.A=0 B=0 C=0 和 A=1 B=1 C=1 C.A=0 B=0 C=1 和 A=0 B=1 C=0 D.A=1 B=0 C=1 和 A=0 B=1 C=0

②某段网站后台程序的流程图如下图所示。其中A、B、C均为二进制数,X,Y,Z的初值均为0,如果预期的结果为 X=0、Y=1、Z=1,正确的测试用例是(10) ,请从以下备选项中选择正确的测试用例填在答题纸对应的位置。

A.A=1 B=0 C=0 和 A=1 B=1 C=0 B.A=0 B=0 C=0 和 A=1 B=1 C=1 C.A=0 B=0 C=1 和 A=0 B=1 C=1 D.A=1 B=0 C=1 和 A=0 B=1 C=0

③系统中一个程序的结构如图14-7所示

该程序有4条不同路径,分别为L1:a→c→e;L2:a→b→d;L3:a→b→e;L4:a→c→d.小王设计了4组测试用例: ①[(1,0,3),(1,0,4)]覆盖ace;[(2,1,1),(2,1,2)]覆盖ace; ②[(2,1,1),(2,1,2)]覆盖abe;[(3,0,3),(3,0,1)]覆盖acd; ③[(2,0,4),(2,0,3)]覆盖ace;[(1,0,3),(1,0,4)]覆盖abe; [(2,1,1),(2,1,2)]覆盖abe;[(1,1,1),(1,1,1)]覆盖abd; ④[(2,0,4),(2,0,3)]覆盖ace;[(1,1,1),(1,1,1)]覆盖abd; [(1,1,2),(1,1,3)]覆盖abe;[(3,0,3),(3,0,1)]覆盖acd; 这4组测试用例中(5)属于判定覆盖;(6)属于条件覆盖;(7)属于路径覆盖;(8)属于条件组合覆盖。(注意:该题测试用例格式为[(A,B,X)输入,(A,B,X)输出])。 (5) ②(6) ①(7) ④(8) ③

④从供选择的答案中,选出应填入__n__内的正确答案,把编号写在答卷的对应栏内。

在用白盒法设计测试用例时,常用的五种覆盖标准是:语句覆盖,判别覆盖,条件覆盖,判别/条件覆盖,多重条件组合覆盖。

假设 A 和 B 是两种覆盖标准,我们用 AB 表示A包含B,用 AB 表示 B 包含 A ,用 A≡B 表示 A 与 B 相同,用 A≠B 表示 A 和 B 互不包含。于是上述五种覆盖标准之间的某些关系可表示为;

语句覆盖 __A__ 判别覆盖 判别覆盖 __C__ 条件覆盖

语句覆盖 __B__ 条件覆盖 判别覆盖 __D__ 判别/条件覆盖

判别/条件覆盖 __E__ 多重条

件组合覆盖

供选择的答案

A~E:

③ ≡

④ ≠

参考答案:

案例十、白盒测试方法-静态测试

下面给出的C++程序类CoinBox用于实现一个简单的饮料自动售货机,该售货机只接受5角的人民币硬币,一个饮料的售价是2元人民币。

(1) 当5角硬币投入机器时调用函数addHalf

(2) 当按下退回硬币按钮时调用函数returnHalfs (3) 当按下按钮给出饮料时调用函数vend

(4) 当可以给出饮料时变量allowVend置为1,否则置为0

要求:对下面的程序执行代码走查(其中行号仅用于标识,不是代码的一部分),直接在代码上指出错误所在之处(不包括注释问题),简要说明理由并改正错误。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Class CoinBox { unsigned total; unsigned curHalfs; unsigned allowVend; Public: CoinBox() { total = 0; allowVend = 0; curHalfs = 0; } void returnHalfs() { curHalfs = 0; } void addHalf() { curHalfs = curHalfs + 1 if ( curHalfs > 3 ) allowVend = 1; } void Vend() { if ( allowVend ) { total = total + curHalfs; 22 23 24 25 26 curHalfs = 0; allowVend = 0; } } };

参考答案:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 Class CoinBox { unsigned total; total命名不规范,应改为unsigned curHalfs; totalHalfs unsigned allowVend; Public: CoinBox() { total = 0; 此函数应该将totalHalfs和allowVend = 0; allowVend均置为0 curHalfs = 0; } void returnHalfs() { curHalfs = 0; 语句末尾缺少; } void addHalf() { curHalfs = curHalfs + 1 饮料价格应用常量代表,应改为curHalfs >= DRINK_PRICE if ( curHalfs > 3 ) allowVend = 1; } void vend() { if ( allowVend ) { total = total + curHalfs; curHalfs = 0; 逻辑错误:当用户投入多于2元硬币时,该函数侵吞了多出的硬币。应改为: curHalfs -= DRINKPRICE; allowVend = ( curHalfs >= DRINK_PRICE ? 1 : 0 ) ; 23 24 25 26 allowVend = 0; } } };

案例十一、如下程序请用基本路径测试法,设计其测试用例。 void Sort ( int iRecordNum, int iType ) 1 {

2 int x=0; 3 int y=0;

4 while ( iRecordNum-- > 0 ) 5 {

6 If ( iType==0 ) 7 x=y+2; 8 else

9 If ( iType==1 ) 10 x=y+10; 11 else

12 x=y+20; 13 } 14 }

? 画出控制流图:

如右图所示 ? 计算环形复杂度:

10(条边)- 8(个节点)+ 2 = 4

? 导出独立路径(用语句编号表示) 路径1:4→14

路径2:4→6→7→14

路径3:4→6→9→10→13→4→14 路径4:4→6→9→12→13→4→14

? 设计测试用例: 测试用例1 输入数据 irecordnum = 0 itype = 0 irecordnum = 1 itype = 0 irecordnum = 1 itype = 1 irecordnum = 1 itype = 2 预期输出 x = 0 y = 0 x = 0 y = 0 x = 10 y = 0 x = 0 y = 20 测试用例2 测试用例3 测试用例4

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

Top