西华师范大学计算机学院2013年度期末测试
软件测试 A 卷
一、单项选择
1、 执行函数测试时,当多次调用底层函数,底层模拟器的" 模拟值" 输入栏可设定多个模拟值,一次最多可设置( C ) 个模拟值。 A 、1 B 、3 C 、6 D 、11
2、 当函数测试存在失败断言时,在白盒覆盖率信息窗口中VU 会显示一个(B ) 的条块来提示,没有失败断言时,会显示一个( A ) 的条块来显示;在逻辑结构窗口中,未覆盖的路径用( D ) 画出,已覆盖的路径用(A ) 画出,未覆盖的分支是(D )的条块。
A 、深绿色 B 、深红色 C 、浅蓝色 D 、粉红色 E 、浅绿色 3、 VU 导出的测试报告文件格式为:(C ),表格化测试用例数据导出的文件格式为:(E ) A 、*.pdf B 、*.txt C 、*.htm D 、*.csv E 、*.xls F 、*.doc
4、 在软件生命周期中的任何一个阶段,只要软件发生了改变,就可能给该软件带来新的问题。软件的改变可能是源于发现错误并做好了修改,可能是因为在集成或维护阶段加入了新的模块,为了验证软件修改后的正确性需要进行(E )。
A 、白盒测试 B 、黑盒测试 C 、单元测试 D 、性能测试 E 、回归测试 F 、验收测试
5、 当用底层模拟器去模拟被测单元调用的底层函数的输出函数,并且此输出参数为指针数据类型,应该设置此参数的模拟值为(C )。 A 、指针值 B 、引用的地址 C 、指针指向的数据类型的值 D 、NULL 6、 当用底层模拟器去模拟被测单元调用的底层函数的返回值,并且此输出参数为指针数据类型,应该设置此参数的模拟值为(B )。 A 、指针值 B 、引用的地址 C 、指针指向的数据类型的值 D 、NULL 二、多项选择
1、 底层模拟能很好的解决(BCEF )。
A 、集成测试问题 B 、装代码和数据失真 C 、测试不可控
D 、性能测试问题 E 、内部输出的模拟
F 、模拟参数为复杂数据类型,单元测试时难以初始化 2、底层模拟器能够模拟( ABCEH ) 。 A 、底层函数的参数 B 、底层函数的返回值 C 、全局变量
D 、函数改写文件中的数据 E 、成员变量 F 、函数改写数据库中的数据 G 、内部输出 H 、调用次数
3、执行函数测试后,源代码窗口能够标识出未覆盖的(BCD )。逻辑结构图窗口能够标识出未覆盖的(AF )。
A 、路径 B 、条件 C 、MC/DC D 、语句 E 、C/DC F 、分支 4、VU 与按自动的边界测试,用于边界测试的边界值是由菜单项" 数据" →定义边界值来维护的。VU 提供的int 类型的默认值有(ACHMP ),bool 类型的默认边界值有(IL ),double 类型的默认类型边界值有(DFGKN )。 A 、0 B 、99999.9 C 、0x80000000 D 、0.0 E 、-99999.9
F 、1.0 G 、9999.99 H 、1 I 、true J 、0x7FFFFFFF K 、-9999.99 L 、false M 、-1 N 、-1.0 O 、0x80000000 P 、0x7FFFFFFF 5、在利用VU 进行单元测试的过程中,针对同一个测试用例集合,以下(ABDE )类的白盒覆盖情况是可能会出现的。
A 、语句覆盖:100% 分支覆盖:100% 路径覆盖:100% B 、语句覆盖:32% 分支覆盖:100% 路径覆盖:98% C 、语句覆盖:100% 分支覆盖:18% 路径覆盖:100% D 、语句覆盖:30% 分支覆盖:50% 路径覆盖:47% E 、语句覆盖:100% 分支覆盖:95% 路径覆盖:15%
6、在利用VU 单元测试(A )的过程中,可能会出现" 语句:95%,分支:100%,路径:15%"的情况。 A 、_01_pow() B 、_11_Mcdc1() C 、_12_Mcdc2() 三、判断题
注:正确的打钩,错误的打叉,并说明错误原因
1、一个测试用例只允许有一个底层模拟,而一个函数可以有多个底层模拟。( false)
错误原因:一个用例中,可以对多个子函数进行底层模拟。 2、底层模拟器可用于控制测试。(true ) 错误原因:
3、底层模拟器模拟的内部输入能够实现用例数据的表格化。(true ) 错误原因:
4、包含有空指针的测试用例能够实现用例数据的表格化。(false ) 错误原因:则难于放到表格中
5、VU 在单元测试时,设计的每个测试用例都必须设置其预期输出。(false ) 错误原因:只有返回值及其他被改写的数据,有必要判断结果的才填输出,复杂数据只填被修改且需判断的域。
6、在测试用例集中,测试用例的数量等于断言的数量(false)。 错误原因:断言数就是TEST_ASSERT()的数量 四、简述题
1、简述在VU 的单元测试中,提高路径覆盖率的3种方法。
1、删除不可能到达的路径 2、删除不合理的分支
3、利用用例设计器创建新测试用例以覆盖未被覆盖的路径
2、简述在VU 的源代码窗口中,当前测试用例未覆盖的语句,VU 如何标识测试用例集未覆盖的语句。VU 如何标识测试用例集未覆盖的条件和Mc/Dc,VU 如何标识。
答:红色文字、红色并加淡红底色、红色并加淡红底色的【TFM 】 3、简述C/Dc和Mc/Dc的定义。
答:C/DC即判定条件覆盖。设计足够的测试用例,使得判断中的每个条件的所有可能取值至少执行一次,同时每个判断的所有可能判断结果至少执行,即要求各个判断的所有可能的条件取值组合至少执行一次
MC/DC即修正判定条件覆盖。是一种实用的软件结构覆盖率测试准则,在每个判定中的每个条件都曾独立的影响判定的结果至少一次。
4、分别设计出最少数量的测试用例,构成两套测试用例集,使CMyClass2的成员函数_11_Mcdc1(BOOL,BOOL,BOOL)被100% C/DC和Mc/Dc,使
_12_Mcdc2(BOOL,BOOL,BOOL,BOOL,BOOL,BOOL,BOOL,BOOL,BOOL,BOOL,BOOL) 被100% C/DC,并为每个测试用例列出它在函数执行时所覆盖的条件的判定。
int CMyClass2::_11_Mcdc1(BOOL A,BOOL B,BOOL C){ if(A && (B || C)) return 1; return 0; }
int CMyClass2::_12_Mcdc2(BOOL A,BOOL B,BOOL C,BOOL D,BOOL E,BOOL F,BOOL G,BOOL H,BOOL I,BOOL J,BOOL K){
if(A && ( (B||C) && (D&&E) ) && ((F||G) && (H||I||J)||K) ) return 1; return 0; }
5、为成员函数_01_Pow()设计测试用例,使其被100%语句,条件和C/DC覆盖,统计出失败断言数,如果存在失败断言,列出失败断言(即测试用例的输入,预
期输出和实际输出) ,指出软件出错位置,并修复缺陷,保证测试结束,失败断言为0。
unsigned int CMyClass::_01_Pow(unsigned int g,unsigned int e){ unsigned int result = 0; if(g==0&&e!=0) result = 0; else if(g==1) result = 1; else if(e==0) result = 1; else if(e==1) result = g; else{ for(unsigned int i=0; i
return result; }
软件出错位置:unsigned int result = 0;
result 的初始值应设置为1。if(g==0 &&e!=0)
五、程序测试题
1、单元测试CMyClass2的成员函数_07_DeleteComment(char *,char *),补充给定的测试用例集的预期输出和实际输出,统计失败断言的数量,如果失败断言数大于0,则说明软件存在缺陷,找到缺陷的具体位置,并修复它。/*函数说明: 名称:CMyClass2::_07_DeleteComment 功能:删除C++代码中的注释 参数:pSrc:源代码 pDes:保存删除注释后的代码 返回:无*/
void CMyClass2::_07_DeleteComment(char * pSrc,char * pDes){ if(pSrc==0||pDes==0){
return; }
int len = strlen(pStr); if(len == 0) return;
bool cmmSin = false;//由//开始\n结束的单行注释 bool cmmMul = false;//由/*开始*/结束的多行注释 char ch = *pSrc++; char next = 0; while(ch){ if(!cmmSin && (cmmMul)){//非注释 if(ch=='/'){//注释开始的第一个字符 next = *pSrc; if(next =='\0')//结束 break; else if(next=='/') cmmSin = true; if(cmmMUl || cmmSin){ pSrc++;//忽略/后的一个字符 ch = *pStr++; continue; } } *pDes++ = ch; ch = *pSrc++; }else if(cmmSin){//单行注释 if(ch=='\n'){//单行注释结束 cmmSin = false; *pDes++ = ch;//\n是不能丢的 } ch = *pSrc++; }else if(cmmMul){//多行注释 if(ch=='*'){//开始多行注释 next = *pSrc; if(next=='/'){ cmmMul = false; *pSrc++;//忽略后面的/ } } ch = *pSrc++; } }
失败断言数:2个(Case4、Case9)。 处理:将其改为if(next == '\0'){ //结束 *pDes++=ch; ch=*pSrc++; }
并且第一行前添加: if(pSrc==0||pDes==0){ return; }
2、 单元测试triml()C函数,设计测试用例集(包括能表格化的普通测试用例和不能表格化的特殊测试用例(空指针用例,上面一题的Case9就是这样的)) ,使语句、分支、条件、C/DC、MC/DC和路径的覆盖率达到100%,统计出失败断言的数量,列出包含失败断言的测试用例的实际输出,找出软件缺陷的位置,并修复它,使失败断言数为0。 /*
体验可视化编程:删除字符串左边的空格 参数:str ,源字符串
返回:返回结果字符串指针 */
char *triml(char *str){
char *i,*j; i=str; j=str;
if(str==0){ return; }
while(*i==32) ++i;
while(*i!='\0'){ *j=*i; ++i; ++j; }
*j='\0'; return str; }
Case5:输入(char *str=0;) ( Case5不能表格化)
失败断言数:1个(Case5),Case5的实际输出是空指针错误信息。
修改方法:在第3行添加代码:
if(str==0){ return; }
3、 单元测试findr()C函数,设计出测试用例集(包括能表格化的普通测试用例和不能表格化的特殊测试用例) ,使语句覆盖、C/DC覆盖和路径覆盖的覆盖率达到100%。统计失败断言的数量,列出包含失败断言的测试用例的实际输出,找出软件缺陷的位置,并修复它,使失败断言数为0。 /*
体验可视化编程:在一个字符串中反向查找子串 参数:str ,源字符串 stub ,需查找的子串
返回:如果找到返回子串的位置,否则返回-1 */
int findr(char *str,char *sub){ char *i,*j,*k,*n; int l,m;
if(str = =0 || sub = =0){
return; }
int len_str,len_sub;
len_str = 0; len_sub = 0; i = str; j = sub;
while(*i!='\0'){ i++; len_str++; } i--;
while(*j!='\0'){ j++; len_sub++; } j--; n = j;
for(l=len_str;l>len_str - len_sub+1; l--){ k = i; for(m=l;mlen_sub) break; i--; j = n; }
if(l
return (l-len_sub+1); }
Case5:输入(char *str = 0;char *sub = 0;) ( Case5不能表格化)
失败断言数:1个(Case5),同上题一样,出现空指针错误。
在开头第三行加如下代码:
if(str = =0 || sub = =0){
return ; }
西华师范大学计算机学院2013年度期末测试
软件测试 A 卷
一、单项选择
1、 执行函数测试时,当多次调用底层函数,底层模拟器的" 模拟值" 输入栏可设定多个模拟值,一次最多可设置( C ) 个模拟值。 A 、1 B 、3 C 、6 D 、11
2、 当函数测试存在失败断言时,在白盒覆盖率信息窗口中VU 会显示一个(B ) 的条块来提示,没有失败断言时,会显示一个( A ) 的条块来显示;在逻辑结构窗口中,未覆盖的路径用( D ) 画出,已覆盖的路径用(A ) 画出,未覆盖的分支是(D )的条块。
A 、深绿色 B 、深红色 C 、浅蓝色 D 、粉红色 E 、浅绿色 3、 VU 导出的测试报告文件格式为:(C ),表格化测试用例数据导出的文件格式为:(E ) A 、*.pdf B 、*.txt C 、*.htm D 、*.csv E 、*.xls F 、*.doc
4、 在软件生命周期中的任何一个阶段,只要软件发生了改变,就可能给该软件带来新的问题。软件的改变可能是源于发现错误并做好了修改,可能是因为在集成或维护阶段加入了新的模块,为了验证软件修改后的正确性需要进行(E )。
A 、白盒测试 B 、黑盒测试 C 、单元测试 D 、性能测试 E 、回归测试 F 、验收测试
5、 当用底层模拟器去模拟被测单元调用的底层函数的输出函数,并且此输出参数为指针数据类型,应该设置此参数的模拟值为(C )。 A 、指针值 B 、引用的地址 C 、指针指向的数据类型的值 D 、NULL 6、 当用底层模拟器去模拟被测单元调用的底层函数的返回值,并且此输出参数为指针数据类型,应该设置此参数的模拟值为(B )。 A 、指针值 B 、引用的地址 C 、指针指向的数据类型的值 D 、NULL 二、多项选择
1、 底层模拟能很好的解决(BCEF )。
A 、集成测试问题 B 、装代码和数据失真 C 、测试不可控
D 、性能测试问题 E 、内部输出的模拟
F 、模拟参数为复杂数据类型,单元测试时难以初始化 2、底层模拟器能够模拟( ABCEH ) 。 A 、底层函数的参数 B 、底层函数的返回值 C 、全局变量
D 、函数改写文件中的数据 E 、成员变量 F 、函数改写数据库中的数据 G 、内部输出 H 、调用次数
3、执行函数测试后,源代码窗口能够标识出未覆盖的(BCD )。逻辑结构图窗口能够标识出未覆盖的(AF )。
A 、路径 B 、条件 C 、MC/DC D 、语句 E 、C/DC F 、分支 4、VU 与按自动的边界测试,用于边界测试的边界值是由菜单项" 数据" →定义边界值来维护的。VU 提供的int 类型的默认值有(ACHMP ),bool 类型的默认边界值有(IL ),double 类型的默认类型边界值有(DFGKN )。 A 、0 B 、99999.9 C 、0x80000000 D 、0.0 E 、-99999.9
F 、1.0 G 、9999.99 H 、1 I 、true J 、0x7FFFFFFF K 、-9999.99 L 、false M 、-1 N 、-1.0 O 、0x80000000 P 、0x7FFFFFFF 5、在利用VU 进行单元测试的过程中,针对同一个测试用例集合,以下(ABDE )类的白盒覆盖情况是可能会出现的。
A 、语句覆盖:100% 分支覆盖:100% 路径覆盖:100% B 、语句覆盖:32% 分支覆盖:100% 路径覆盖:98% C 、语句覆盖:100% 分支覆盖:18% 路径覆盖:100% D 、语句覆盖:30% 分支覆盖:50% 路径覆盖:47% E 、语句覆盖:100% 分支覆盖:95% 路径覆盖:15%
6、在利用VU 单元测试(A )的过程中,可能会出现" 语句:95%,分支:100%,路径:15%"的情况。 A 、_01_pow() B 、_11_Mcdc1() C 、_12_Mcdc2() 三、判断题
注:正确的打钩,错误的打叉,并说明错误原因
1、一个测试用例只允许有一个底层模拟,而一个函数可以有多个底层模拟。( false)
错误原因:一个用例中,可以对多个子函数进行底层模拟。 2、底层模拟器可用于控制测试。(true ) 错误原因:
3、底层模拟器模拟的内部输入能够实现用例数据的表格化。(true ) 错误原因:
4、包含有空指针的测试用例能够实现用例数据的表格化。(false ) 错误原因:则难于放到表格中
5、VU 在单元测试时,设计的每个测试用例都必须设置其预期输出。(false ) 错误原因:只有返回值及其他被改写的数据,有必要判断结果的才填输出,复杂数据只填被修改且需判断的域。
6、在测试用例集中,测试用例的数量等于断言的数量(false)。 错误原因:断言数就是TEST_ASSERT()的数量 四、简述题
1、简述在VU 的单元测试中,提高路径覆盖率的3种方法。
1、删除不可能到达的路径 2、删除不合理的分支
3、利用用例设计器创建新测试用例以覆盖未被覆盖的路径
2、简述在VU 的源代码窗口中,当前测试用例未覆盖的语句,VU 如何标识测试用例集未覆盖的语句。VU 如何标识测试用例集未覆盖的条件和Mc/Dc,VU 如何标识。
答:红色文字、红色并加淡红底色、红色并加淡红底色的【TFM 】 3、简述C/Dc和Mc/Dc的定义。
答:C/DC即判定条件覆盖。设计足够的测试用例,使得判断中的每个条件的所有可能取值至少执行一次,同时每个判断的所有可能判断结果至少执行,即要求各个判断的所有可能的条件取值组合至少执行一次
MC/DC即修正判定条件覆盖。是一种实用的软件结构覆盖率测试准则,在每个判定中的每个条件都曾独立的影响判定的结果至少一次。
4、分别设计出最少数量的测试用例,构成两套测试用例集,使CMyClass2的成员函数_11_Mcdc1(BOOL,BOOL,BOOL)被100% C/DC和Mc/Dc,使
_12_Mcdc2(BOOL,BOOL,BOOL,BOOL,BOOL,BOOL,BOOL,BOOL,BOOL,BOOL,BOOL) 被100% C/DC,并为每个测试用例列出它在函数执行时所覆盖的条件的判定。
int CMyClass2::_11_Mcdc1(BOOL A,BOOL B,BOOL C){ if(A && (B || C)) return 1; return 0; }
int CMyClass2::_12_Mcdc2(BOOL A,BOOL B,BOOL C,BOOL D,BOOL E,BOOL F,BOOL G,BOOL H,BOOL I,BOOL J,BOOL K){
if(A && ( (B||C) && (D&&E) ) && ((F||G) && (H||I||J)||K) ) return 1; return 0; }
5、为成员函数_01_Pow()设计测试用例,使其被100%语句,条件和C/DC覆盖,统计出失败断言数,如果存在失败断言,列出失败断言(即测试用例的输入,预
期输出和实际输出) ,指出软件出错位置,并修复缺陷,保证测试结束,失败断言为0。
unsigned int CMyClass::_01_Pow(unsigned int g,unsigned int e){ unsigned int result = 0; if(g==0&&e!=0) result = 0; else if(g==1) result = 1; else if(e==0) result = 1; else if(e==1) result = g; else{ for(unsigned int i=0; i
return result; }
软件出错位置:unsigned int result = 0;
result 的初始值应设置为1。if(g==0 &&e!=0)
五、程序测试题
1、单元测试CMyClass2的成员函数_07_DeleteComment(char *,char *),补充给定的测试用例集的预期输出和实际输出,统计失败断言的数量,如果失败断言数大于0,则说明软件存在缺陷,找到缺陷的具体位置,并修复它。/*函数说明: 名称:CMyClass2::_07_DeleteComment 功能:删除C++代码中的注释 参数:pSrc:源代码 pDes:保存删除注释后的代码 返回:无*/
void CMyClass2::_07_DeleteComment(char * pSrc,char * pDes){ if(pSrc==0||pDes==0){
return; }
int len = strlen(pStr); if(len == 0) return;
bool cmmSin = false;//由//开始\n结束的单行注释 bool cmmMul = false;//由/*开始*/结束的多行注释 char ch = *pSrc++; char next = 0; while(ch){ if(!cmmSin && (cmmMul)){//非注释 if(ch=='/'){//注释开始的第一个字符 next = *pSrc; if(next =='\0')//结束 break; else if(next=='/') cmmSin = true; if(cmmMUl || cmmSin){ pSrc++;//忽略/后的一个字符 ch = *pStr++; continue; } } *pDes++ = ch; ch = *pSrc++; }else if(cmmSin){//单行注释 if(ch=='\n'){//单行注释结束 cmmSin = false; *pDes++ = ch;//\n是不能丢的 } ch = *pSrc++; }else if(cmmMul){//多行注释 if(ch=='*'){//开始多行注释 next = *pSrc; if(next=='/'){ cmmMul = false; *pSrc++;//忽略后面的/ } } ch = *pSrc++; } }
失败断言数:2个(Case4、Case9)。 处理:将其改为if(next == '\0'){ //结束 *pDes++=ch; ch=*pSrc++; }
并且第一行前添加: if(pSrc==0||pDes==0){ return; }
2、 单元测试triml()C函数,设计测试用例集(包括能表格化的普通测试用例和不能表格化的特殊测试用例(空指针用例,上面一题的Case9就是这样的)) ,使语句、分支、条件、C/DC、MC/DC和路径的覆盖率达到100%,统计出失败断言的数量,列出包含失败断言的测试用例的实际输出,找出软件缺陷的位置,并修复它,使失败断言数为0。 /*
体验可视化编程:删除字符串左边的空格 参数:str ,源字符串
返回:返回结果字符串指针 */
char *triml(char *str){
char *i,*j; i=str; j=str;
if(str==0){ return; }
while(*i==32) ++i;
while(*i!='\0'){ *j=*i; ++i; ++j; }
*j='\0'; return str; }
Case5:输入(char *str=0;) ( Case5不能表格化)
失败断言数:1个(Case5),Case5的实际输出是空指针错误信息。
修改方法:在第3行添加代码:
if(str==0){ return; }
3、 单元测试findr()C函数,设计出测试用例集(包括能表格化的普通测试用例和不能表格化的特殊测试用例) ,使语句覆盖、C/DC覆盖和路径覆盖的覆盖率达到100%。统计失败断言的数量,列出包含失败断言的测试用例的实际输出,找出软件缺陷的位置,并修复它,使失败断言数为0。 /*
体验可视化编程:在一个字符串中反向查找子串 参数:str ,源字符串 stub ,需查找的子串
返回:如果找到返回子串的位置,否则返回-1 */
int findr(char *str,char *sub){ char *i,*j,*k,*n; int l,m;
if(str = =0 || sub = =0){
return; }
int len_str,len_sub;
len_str = 0; len_sub = 0; i = str; j = sub;
while(*i!='\0'){ i++; len_str++; } i--;
while(*j!='\0'){ j++; len_sub++; } j--; n = j;
for(l=len_str;l>len_str - len_sub+1; l--){ k = i; for(m=l;mlen_sub) break; i--; j = n; }
if(l
return (l-len_sub+1); }
Case5:输入(char *str = 0;char *sub = 0;) ( Case5不能表格化)
失败断言数:1个(Case5),同上题一样,出现空指针错误。
在开头第三行加如下代码:
if(str = =0 || sub = =0){
return ; }