1、覆盖率(白盒)测试(三)及答案解析(总分:94.50,做题时间:90 分钟)一、B选择题/B(总题数:21,分数:42.00)1.如果程序通过了 100%的代码覆盖率测试,则说明程序满足了_。 A.语句覆盖 B.编程规范 C.设计规格 D.功能需求(分数:2.00)A.B.C.D.2.下面有关逻辑覆盖的说法中错误的是_。 A.DDP 覆盖是判定覆盖的一个变体 B.满足条件覆盖一定也满足判定覆盖 C.指令块覆盖属于语句覆盖 D.若判定覆盖率达到 100%,则语句覆盖率一定也达到 100%(分数:2.00)A.B.C.D.3.设有一段程序如下:if(a=b)and(c=d)or(e=f)do S1
2、else if(p=q)or(s=t)do S2else do S3满足判定/条件覆盖的要求下,最少的测试用例数目是_。 A.6 B.8 C.3 D.4(分数:2.00)A.B.C.D.4.下列关于逻辑覆盖的说法中,错误的是_。 A.满足条件覆盖的测试不一定满足判定覆盖 B.满足条件组合覆盖的测试一定满足判定覆盖、条件覆盖和判定/条件覆盖 C.满足路径覆盖的测试也一定满足条件组合覆盖 D.满足判定/条件覆盖的测试也一定满足判定覆盖和条件覆盖(分数:2.00)A.B.C.D.5.有一个判断语句:if(!(ch=0else printf(“This is a digit!/n“);为实现判定一条件
3、覆盖,需要设计的测试用例个数至少应为_。 A.1 B.2 C.3 D.4(分数:2.00)A.B.C.D.6.下图是一个判定路径覆盖图,其中用“ ”表示判定语句,用“ ”表示处理语句,用“”表示判定汇合点,用“ ”表示判定路径,若有一个测试用例覆盖了判定路径 A、B、E、H,则判定路径覆盖率为_。(分数:2.00)A.B.C.D.7.下面有关路径测试的叙述中,错误的是_。 A.路径覆盖是最强的覆盖测试,它不但能发现其他覆盖测试能发现的问题,还能发现其他覆盖测试不能发现的问题 B.测试员不可能对任何一个程序都完成 100%的路径测试 C.不提倡用不同的数据重复测试同一条路径 D.即使每条路径都执
4、行了一次,程序还是可能存在缺陷(分数:2.00)A.B.C.D.8.对于如下给出的程序段:if(AB)and(C=5)then d P1;若考虑满足条件/判定覆盖原则以及内部边界条件,需要设计的最小测试输入数据集可能是_。 A.(A=2,B=1,C=5),(A=2,B=1,C=4),(A=1,B=2,C=5),(A=1,B=1,C=5) B.(A=2,B=1,C=5),(A=2,B=1,C=4),(A=1,B=2,C=5),(A=1,B=2,C=4) C.(A=2,B=1,C=5),(A=2,B=1,C=4),(A=1,B=2,C=5) D.(A=2,B=1,C=5),(A=1,B=2,C=4
5、)(分数:2.00)A.B.C.D.9.条件覆盖的基本思想是设计若干测试用例,执行被测程序,使得每个判断的每个条件的可能取值至少满足一次。那么对于如下 C 语言程序段:if(a0if(a1|c1)c=c+1;如果采用适用于条件覆盖的两个测试用例,其输入值分别为 a=2,b=-1,c=-2 和 a=-1,b=2,c=3,则以下叙述中正确的是_。 A.执行测试后,4 个条件 a0,b0,a1,c1 的所有取值都至少执行一次 B.执行测试后,除 b0 取真和 c1 取假外其他条件取值都至少执行一次 C.执行测试后,除 b0 取假和 c1 取真外其他条件取值都至少执行一次 D.执行测试后,出 b0 取
6、真和 c1 取真外其他条件取值都至少执行一次(分数:2.00)A.B.C.D.10.如果程序中有两个判定条件,其复合条件表达式分别为(a=3)and(b=6)和(a0)or(c2),则为了达到 100%的判定覆盖率,至少需要设计的测试用例个数为_。 A.1 B.2 C.3 D.4(分数:2.00)A.B.C.D.11.如果执行下面的 C 程序,并做了成功的存储分配:char * pBuf=NULL;pBuf=(char *)malloc(100);if(pBuf=NULL) printf (“Not Enough Memory/n“);return 1;则此段程序测试的指令块(即顺序执行的一段
7、指令)覆盖率是_。 A.100% B.60% C.50% D.40%(分数:2.00)A.B.C.D.12.对于如下 C 语言程序段:if(a0if(a1|c1)c=c+1;执行条件组合覆盖,为使得每一条件取值组合至少执行一次,需要的测试用例数至少是_。 A.2 B.3 C.4 D.5(分数:2.00)A.B.C.D.13.对于具有串联型分支结构的程序,如果有七个判断语句串联,则使用正交实验设计法,至少需要的测试用例数应为_。 A.23 B.24 C.26 D.27(分数:2.00)A.B.C.D.14.对于一个嵌套型分支结构的程序,若有 4 个判定语句,则要覆盖它的每一条路径至少需要的测试用
8、例数为_。 A.4 个 B.3 个 C.5 个 D.6 个(分数:2.00)A.B.C.D.15.如果一个小程序中有一个由 8 个两分支判断组成的连锁分支结构,如下图所示:(分数:2.00)A.B.C.D.16.对于具有串联型分支结构的程序,若有 4 个判定语句,则采用正交实验设计法,至少需要的测试用例数应为_。 A.4 个 B.16 个 C.8 个 D.5 个(分数:2.00)A.B.C.D.17.下列属于变量异常的是_。 A.变量被定义,但没有被使用 B.所使用的变量未被定义 C.变量在使用前被重复定义 D.以上全部(分数:2.00)A.B.C.D.18.关于数据流测试,说法正确的是_。
9、A.数据流测试是一种路径测试 B.执行定义结点不会改变变量在存储单元中的内容 C.执行使用结点会改变变量在存储单元中的内容 D.定义/使用路径往往不是存在潜在错误的地方(分数:2.00)A.B.C.D.19.下列语句通常不是作为定义结点的是_。 A.输入语句 B.输出语句 C.赋值语句 D.过程调用语句(分数:2.00)A.B.C.D.20.下列指导选择和使用测试覆盖率的原则中错误的是_。 A.覆盖率不是目的,仅是一种手段 B.不要追求绝对 100%的覆盖率 C.不可能针对所有的覆盖率指标来选择测试用例 D.只根据测试覆盖率指标来指导测试用例的设计(分数:2.00)A.B.C.D.21.程序的
10、流程图如下图所示,采用路径覆盖法进行测试,则至少需要几个测试用例可以覆盖所有可能的路径_。(分数:2.00)A.B.C.D.二、B论述题/B(总题数:7,分数:52.50)已知检查括号匹配及注释、字符串处理的 C 源程序如下:#include stdio.hint brace, brack, paren;void in_quote(int c);void in_comment(void)void search(int c)/* rudimentary syntax checker for C program */int main()Int c;extern int brace, brack,
11、paren;while(c=getchar()!=EOF)if(c=/)if(c=getchar()=*)in_comment(); /* inside comment */elsesearch(c);else if(c=“|c=“ “)in_quote(c); /* inside quote */elsesearch(c);if(brace0) /* output errors */printf(“Unbalanced braces/n“);brace=0;else if(brack0)printf(“Unbalanced brackets/n“);brack=0;else if (pare
12、n0)printf(“Unbalanced parentheses/n“);paren=0;if(brace0) /* output errors */printf(“Unbalanced braees/n“);if(brack0)printf(“Unbalanced brackets/n“);if(paren0)printf(“Unbalanced parentheses/n“);return 0;/* search: search for rudimentary syntax errors */void seareh(int c)extern int brace, brack, paren
13、; if(c=)+brace;else if(c=)-brace;else if(c=)+brack;else if(c=)-brack;else if(c=()+paren;else if(c=)-paren;/* in_comment: inside of a valid comment */Void in_comment(void)int c, d;c=getchar();d=getchar(); /* curr character */while(c!=*|d!=/) /* search for end */c=dd=getchar();/* in_quote; inside quot
14、e */void in_quote(int c)int d;while(d=getchar()!=c) /* search end quote */if(d=/)getchar(); /* ignore escape seq */(分数:7.00)(1).画出程序中 main 函数的控制流程图;(分数:3.50)_(2).设计一组测试用例,使该程序所有函数的语句覆盖率和分支覆盖率均能达到 100%。如果认为该程序的语句覆盖率或分支覆盖率无法达到 100%,需说明为什么。(分数:3.50)_已知 C 源程序如下:/* A simple mailing list example using an
15、array of structures. */include stdion.hinclude stdlib.hdefine MAX 4struct addr char name30;char street40;char city20;unsigned long int zip; addr_listMAX;void init_list(void), enter(void);void deleteAddr(void), list(void)int menu_select(void), find free(void);int main(void)char choice;init_list();/*
16、initialize the structure array */for(;) choice=menu_select();switch(choice) case 1; enter();break;case 2:deleteAddr();breakcase 3: list();break;case 4: exit(0);return 0;/* Initialize the list. */void init_list(void)register int t;for(t=0; tMAX; +t)addr_listt.name0=/0;/* Get a menu selection. */int m
17、enu_select(void)char s80;int c;printf(“1. Enter a name/n“);printf(“2. Delete a name/n“);printf(“3. List the file/n“);printf(“4. Quit/n“);do printf(“/nEnter your choice:“);gets(s);c=atoi(s);while(c1|c4);return c;/* Input addresses into the list. */void enter(void)int slot;char s80;slot=find_free();if
18、(slot=-1)printf(“/nList Full“);return;printf(“Enter name:“);gets(addr_listslot.name);printf(“Enter street:“);gets(addr_listslot.street);printf(“Enter city:“);gets(addr_listslot.city);printf(“Enter zip:“);gets(s);addr_listslot.zip=strtoul(s, /0,10);/* Find anunused structure. */int find_free(void)reg
19、ister int t;for(t=0; addr_listt, name0 +t);if(t=MAX) return-1; /* no slots free */return t;/* Delete an address. */void deleteAddr(void)register int slot;char s80;printf(“enter record #:“);gets(s);slot=atoi(s);if(slot=0 /* Display the list on the screen. */void list(void)register int t;for(t=0; tMAX
20、; +t)if(addr_listt.name0) printf(“% s/n“, addr_listt.name);printf(“% s/n“, addr_listt.street);printf(“% s/n“, addr_listt.city);printf(“% lu/n/n“, addr_listt, zip); printf(“/n/ n“);(分数:7.00)(1).画出 main 函数的控制流程图;(分数:3.50)_(2).设计一组测试用例,使该程序所有函数的语句覆盖率尽量达到 100%。如果认为该程序的语句覆盖率无法达到 100%,需说明原因。(分数:3.50)_已知 C
21、 源程序如下:/* longIntAdd */#include stdio.h#include string.h#define LENGTH81void addLInt(char s1, char s2);void reverse(char s);int main()char intstr1LENGTH, intstr2LENGTH;printf(“请输入超长整数的被加数和加数:/n“);scanf(“% s % s“, intstr1, intstr2);addLInt(intstr1, intstr2);printf(“超长整数和为:% s“, intstr1);return 0;void
22、 addLInt(char s1, char s2)int i=0, tmp, c=0;char sLENGTH;if(strlen(s1)strlen(s2) strcpy(s, s1);strcpy(s1, s2);strcpy(s2, s);reverse(s1); reverse(s2);while(s2i!=“/0“) tmp=s1i-0+s2i-0+c;s1i=tmp % 10+0;c=tmp/10;i+;while(s1i!=/0s1i=tmp % 10+0;c=tmp/10;i+;if(c)s1i+=c+0;s1i=/0;reverse(s1);void reverse(cha
23、r s)int i, j, c;for(i=0, j=strlen(s)-1, ij; i+, j-)c=si;si=sj;sj=c;(分数:7.00)(1).画出程序中函数 addLInt 的控制流程图;(分数:3.50)_(2).设计一组测试用例,使该程序 addLInt 函数的语句覆盖率和分支覆盖率均能达到 100%。如果认为该函数的语句覆盖率或分支覆盖率无法达到 100%,需说明为什么。(分数:3.50)_已知 C 源程序如下:/ * /* 功能:检查输入的标识符是否符合 C 语言规则 */ * /#includestdio.h#includestring.h#includectype
24、.h#includecondo.h#includemalloc.hchar * IsLegal(char * CheckWor D.;const int MaxWordLen=32;char * ErrorMessages=/* 错误信息列表 */“合法!“,“首字符只能是字母或下划线!“,“常、变量只能由字母、下划线和数字构成!“,“常、变量标识不能用 C 语言关键字!“,“常、变量标识不能用 C 语言预定义函数名!“,“内存不够!“;int main()char * Prompt=“C 语言标识符的命名要遵守以下原则.“;char * TestWordinti;TestWord=(char
25、 *)malloc(sizeof(char) * MaxWordLen);/* TestWord 存放用户输入 */if(!TestWor D.return 1;/* 显示部分提示信息 */puts(Prompt);for(i=1; i=4; i+)puts(ErrorMessages i);while(1) printf(“/n/n 请输入一个标识符(大写的 Q 退出).“); /* 提示 */scanf(“% s“, TestWorD.; /* 得到用户输入 */if(toupper)(TestWord0)=0)breaks/* 循环出口 */printf(“/n % s % s“, Te
26、stWord, IsLegal(TestWorD.); /* 判定标识符的合法性 */free(TestWorD.;return 0;/* 此函数检验标识符命名的合法性 */char * IsLegal(char * CheckWorD.char * KeyWords =“auto“, “break“, “case“, “char“, “continue“, “const“, “default“,“do“, “double“, “else“, “ehum“, extern“, “float“, “for“, “goto“,“if, “int“, “long“, “noalias“, “regi
27、ster“, “return“, “short“,“signed“, “sizeof“, “static“, “struct“, “switch“, “typedef“,“union“, “unsigned, “void“, “volatile“, “while“, “defined“,“define“, “undef“, “include“, “ifdef“, “ifndef“, “endif“, “line“,“error“, “elif“, “pragma“; /*C 关键字列表* /char * Functions =“close“, “creat“, “eof“, “fclose“,
28、 “fcloseall“, “feof“, “fopen“,“ferror“, “fgetchar“, “fgets“, “fprintf“, “fputc“, “fputchar“,“fseek“, “get“, “putch“, “putc“, “printf“, “open“, “putchar“,“puts“, “read“, “scanf“, “abs“, “acos“, “asin“, “math“, “atan“,“atan2“, “atof“, “atoi“, “ato1“ ,“ceil“, “dos“, “cosh“, ecvt“,“exp“, “fabs“, “floor“
29、, “fmod“, “frexp“, “itoa“, “labs“, “idexp“,“log“, “log10“, “modf“, “pow“, “rand“, “sin“, “sqrt“, “srand“,“strtod“, “strlol“, “tan“, “tanh“, “ultoa“, “memset“, “strcpy“,“strcat“, “strchr“, “strcmp“, “calloc“, “isalnum“, “isalpha“,“toascii“, “tolower“, “tollpper“, “exit“; /* C 主要预定义函数列表* /char * Other
30、s=“_; /* “_“也可以用于关键字,但我们不推荐您使用! */int WordLength, i;char * WordTemp;WordLength=strlen(CheckWorD.;/* 检查标识符命名原则 1 */if(isalpha(CheckWord0)=0) /* 检查标识符命名原则 2 */for(i=0; iWordLength; i+)if(isalnum(CheckWordi=0) /* 检查标识符命名原则 3 */for(i=0; i44; i+)if(!strcmp(CheckWord, KeyWordsi)return ErrorMessages3;/* 检查
31、标识符命名原则 4 */for(i=0; i69; i+)if (!strcmp(CheckWord, Functionsi)return ErrorMessages4;return ErrorMessages0;(分数:7.00)(1).参照 QESAT/C 软件分析与测试工具的规定,画出程序中所有函数的控制流程图;(分数:3.50)_(2).设计一组测试用例,使该程序所有函数的语句覆盖率和分支覆盖率尽量达到最大。如果认为该程序的语句覆盖率或分支覆盖率无法达到 100%,需说明为什么。(分数:3.50)_考虑一个根据以下简单规格确认输入数有效性的应用程序:(1)输入数由数字、符号“+”或“-
32、”开始。(2)该数字或符号后面可接任意位数的数字。(3)这些数字可以有选择地后接用英文句号表示的小数点。(4)任何输入数,不管是否有小数点,都应该以空格结束。请根据以上处理规则:(分数:10.50)(1).画出相应的状态转换图。(分数:3.50)_(2).根据状态转换图,列出相应的状态转换表,给出“当前状态”、当前状态允许的“输入”和对应每一个输入下的“下一个状态”。(分数:3.50)_(3).根据状态转换图和状态转换表,导出基本路径测试的测试用例及其覆盖的测试路径。(分数:3.50)_下图为对 4 个已知数字进行排序的程序流程图。(分数:12.00)(1).计算它的环路复杂度。(分数:3.0
33、0)_(2).为完成基本路径测试,求它的一组独立路径。(分数:3.00)_(3).用基本路径测试法为下列程序设计测试用例。 1 Void sort(int iRecordNum, int itype) 2 3 int x=0; y=0; 4 while(iRecordNum0) 5 6 if(itype=0) 7 x=y+2; break; 8 else 9 if(itype=1) 10 x=y+10; 11 else 12 x=y+20; 13 14 15 (分数:3.00)_(4).用基本路径测试法说明以下 C 程序的用例设计过程。 void selectSort(int V, int n
34、) for(int i=0; in-1; i+) int k=i; for(int j=i+1; jn; j+) if(VjVk) k=j; if(k!=i) int work=Vi; Vi=Vk; Vk=work; (分数:3.00)_已知 C 源程序如下:#include stdio.h#include string.hvoid reverse(char s) int c, i, j;for(i=0, j=strlen(s)-1; ij; i+, j+) c=si;si=sj;sj=c;void getHex(int number, char s) int i;i=0;while(numb
35、er0) if(number % 1610)si+=number % 16+0;elseswitch(number % 6) case 10: si+=A; break;case 11: si+=B; break;case 12: si+=C; break;case 13: si+=D; break;case 14:si+ =E; break;case 15: si+=F; break;default: printf(“Error“); break;number/=16;si=/0;reverse(s);int main() unsigned int number;int i=0;char s
36、50;printf(“% s“,“please input number:/n“);scanf(“% d“, getHex(number, s);i=0;while(si)printf(“% c“, si+);return 0;(分数:2.00)(1).画出程序中所有函数的控制流程图;(分数:1.00)_(2).设计一组测试用例,使该程序所有函数的语句覆盖率和分支覆盖率均能达到 100%。如果认为该程序的语句覆盖率或分支率无法达到 100%,需说明为什么。(分数:1.00)_覆盖率(白盒)测试(三)答案解析(总分:94.50,做题时间:90 分钟)一、B选择题/B(总题数:21,分数:42.0
37、0)1.如果程序通过了 100%的代码覆盖率测试,则说明程序满足了_。 A.语句覆盖 B.编程规范 C.设计规格 D.功能需求(分数:2.00)A. B.C.D.解析:解析 语句覆盖就是设计若干测试用例,运行被测程序,使得每一可执行语句至少执行一次。2.下面有关逻辑覆盖的说法中错误的是_。 A.DDP 覆盖是判定覆盖的一个变体 B.满足条件覆盖一定也满足判定覆盖 C.指令块覆盖属于语句覆盖 D.若判定覆盖率达到 100%,则语句覆盖率一定也达到 100%(分数:2.00)A.B. C.D.解析:解析 条件覆盖是指设计若干个测试用例,运行被测程序,使得程序中每个判定的每个条件的可能取值至少评价一
38、次。而判定覆盖是设计测试用例,使得程序中每个判定的取真分支和取假分支至少评价一次。两者没有必然的联系,故满足条件覆盖的未必会满足判定覆盖,选项 B 错误。而满足判定覆盖一定会满足语句覆盖是容易理解的,因为每个判定的取真分支和取假分支都至少评价一次,必然预示着每个可执行语句至少评价了一次,即满足了语句覆盖。另外指令块覆盖是语句覆盖的一个变体,而 DDP 覆盖(判定路径覆盖)是判定覆盖的一个变体。3.设有一段程序如下:if(a=b)and(c=d)or(e=f)do S1else if(p=q)or(s=t)do S2else do S3满足判定/条件覆盖的要求下,最少的测试用例数目是_。 A.6
39、 B.8 C.3 D.4(分数:2.00)A.B.C. D.解析:解析 判定/条件覆盖,就是设计足够的测试用例,使得判定语句中每个条件的所有可能取值至少评价一次,同时每个判定语句本身所有可能分支也至少评价一次。 本程序一共有两个判定语句,三条路径。 若以 1 代表某一个条件为真,0 代表为假,则对于(a=b)、(c=d)、(e=f)、(p=q)、(s=t)这 5个条件,取不同的真值组合,即可设计出相应的测试用例,达到判定/条件覆盖的要求。在这里,先取(a=b)、(c=d)、(e=f)为 101,(p=q)、(s=t)为任意值,然后取全部 5 个条件为 010 11 和 010 00,即能达到判
40、定/条件覆盖的要求。4.下列关于逻辑覆盖的说法中,错误的是_。 A.满足条件覆盖的测试不一定满足判定覆盖 B.满足条件组合覆盖的测试一定满足判定覆盖、条件覆盖和判定/条件覆盖 C.满足路径覆盖的测试也一定满足条件组合覆盖 D.满足判定/条件覆盖的测试也一定满足判定覆盖和条件覆盖(分数:2.00)A.B.C. D.解析:解析 路径覆盖是设计足够的测试用例,执行程序中所有可能的路径,而条件组合覆盖是设计足够的测试用例,使得每个判定的所有可能的条件取值组合至少执行一次。两者无关系。5.有一个判断语句:if(!(ch=0else printf(“This is a digit!/n“);为实现判定一条
41、件覆盖,需要设计的测试用例个数至少应为_。 A.1 B.2 C.3 D.4(分数:2.00)A.B.C. D.解析:解析 因为每个判断有三条可执行路径,这样至少需要 3 个测试用例。6.下图是一个判定路径覆盖图,其中用“ ”表示判定语句,用“ ”表示处理语句,用“”表示判定汇合点,用“ ”表示判定路径,若有一个测试用例覆盖了判定路径 A、B、E、H,则判定路径覆盖率为_。(分数:2.00)A. B.C.D.解析:解析 覆盖率公式:DDP 覆盖率一被评价到的判定路径数量/程序中判定路径总数100%=4/7100%=57.1%。7.下面有关路径测试的叙述中,错误的是_。 A.路径覆盖是最强的覆盖测试,它不但能发现其他覆盖测试能发现的问题,还能发现其他覆盖测试不能发现的问题 B.测试员不可能对任何一个程序都完成 100%的路径测试 C.不提倡用不同的数据重复测试同一条路径 D.即使每条路径都执行了一次,程序还是可能存在缺陷(分数:2.00)A. B.C.D.解析:解析 路径覆盖就是设计足够的测试用例,执行程序中所有可能的路径,尽管路径覆盖比判定/条件覆盖更强,但路径覆盖并不一定包含判定/