电子科大软件测试~第二次作业

第二次作业及参考答案

第一题

在一个客户信息查询界面中,输入条件有“姓名”、“身份证号”、“手机”,采用正交表方式设计该界面查询功能的测试用例。

答:

针对本测试有3个输入条件,每个输入有2种取值情况,可以选择L₄(2³)正交表,其正交表值如下表所示:

实验数\列号姓名身份证号手机
1111
2100
3010
4001

测试用例:

测试用例/查询条件姓名身份证号手机
测试用例1填写填写填写
测试用例2填写
测试用例3填写
测试用例4填写

第二题

根据如下图所示的程序流程图,分别使用语句覆盖测试、判定覆盖测试、条件覆盖测试和路径覆盖测试进行测试用例设计。

答:

1)语句覆盖

设计测试用例,使得被测试程序中的每条可执行语句至少被执行一次。其测试用例表如下所示。

用例序号输入数据预期输出覆盖语句
1(X,Y)=(1,11)(X,Y)=(1,11)X>0 AND Y>10;Y=Y/X;X<-10 OR Y<0
2(X,Y)=(0,-1)(X,Y)=(0,1)X>0 AND Y>10;X<-10 OR Y<0;Y=-(Y+X)

2)判定覆盖

设计测试用例,使得被测试程序中的每个判断的"真"、"假"分支至少被执行一次。设X>0 AND Y>10为判定条件M,X<-10 OR Y<0为判定条件N。
设计的判定覆盖测试用例如下表所示。

用例序号输入数据预期输出覆盖判定条件
1(X,Y)=(1,11)(X,Y)=(1,11)M为真,N为假
2(X,Y)=(0,-1)(X,Y)=(0,1)M为假,N为真

3)条件覆盖

设计测试用例,使得被测试程序中分支判断语句中每个条件的可能值至少被满足一次。

条件X>0:
取真时为T1,取假时为F1
条件Y>10:
取真时为T2,取假时为F2
条件x<-10:
取真时为T3,取假时为F3
条件Y<0:
取真时为T4,取假时为 F4

设计的条件覆盖测试用例如下表所示。

用例序号输入数据预期输出覆盖条件
1(X,Y)=(1,-1)(X,Y)=(1,0)T1,F2,F3,T4
2(X,Y)=(-11,11)(X,Y)=(-11,0)F1,T2,T3,F4

4)基本路径覆盖

设计测试用例,使得被测试程序中的基本路径至少被覆盖一次。依据该程序控制流图计算环路复杂度=3(判断节点数目+1),因此,该程序的基本路径有3条。

设计的基本路径覆盖测试用例如下表所示

用例序号输入数据预期输出覆盖路径
1(X,Y)=(0,0)(X,Y)=(0,0)ace
2(X,Y)=(1,11)(X,Y)=(1,11)abce
3(X,Y)=(-11,1)(X,Y)=(-11,10)acde
4不存在不存在abcde

但是看这篇文章 软件测试——程序控制流图,McCabe环形复杂度_根据程序画出控制流图_Dic0k的博客-CSDN博客,按照它的逻辑,环形复杂度应该有5条。(很奇怪)

第三题

针对如下样本程序,分析该程序逻辑覆盖测试方法中的语句覆盖、判定覆盖、条件覆盖和基本路径覆盖,并说明哪种方法覆盖率高?为什么?

被测样本程序

import java.util.Scanner;
public class Coverage {
public static void main(String[] args){
  System.out.println("start main function:path a...");
  int A=0,B=0,X=0;
  Scanner s = new Scanner(System.in);
  System.out.println("输入A:");  A = s.nextInt();
  System.out.println("输入B=");  B = s.nextInt();
  System.out.println("输入X=");  X = s.nextInt();
  s.close();  
  if (A>1 && B==0) {
	X=X/A;
	System.out.println("path c");
  } else {
	System.out.println("path b");  }
  if (A==2 || X>1) {
	X=X+1;
	System.out.println("path e");
  } else {
	System.out.println("path d");  }
  System.out.println("end main function.");
  }
}

​ 答:

在这里插入图片描述

  1. 语句覆盖测试

    用例序号输入数据预期输出覆盖路径
    1(A,B,X)=(2,0,2)start main function:path a…,输入A:,输入B=,输入X=,path c,path e,end main function.ace
    2(A,B,X)=(0,1,1)start main function:path a…,输入A:,输入B=,输入X=,path b,path d,end main function.abd
  2. 判定覆盖测试

    用例序号输入数据预期输出覆盖路径
    1(A,B,X)=(2,0,2)start main function:path a…,输入A:,输入B=,输入X=,path c,path e,end main function.ace
    2(A,B,X)=(0,1,1)start main function:path a…,输入A:,输入B=,输入X=,path b,path d,end main function.abd
  3. 条件覆盖测试

    用例序号输入数据预期输出覆盖路径
    1(A,B,X)=(2,0,2)start main function:path a…,输入A:,输入B=,输入X=,path c,path e,end main function.ace
    2(A,B,X)=(0,1,1)start main function:path a…,输入A:,输入B=,输入X=,path b,path d,end main function.abd
  4. 基本路径覆盖测试

    用例序号输入数据预期输出覆盖路径
    1(A,B,X)=(2,0,2)start main function:path a…,输入A:,输入B=,输入X=,path c,path e,end main function.ace
    2(A,B,X)=(0,1,1)start main function:path a…,输入A:,输入B=,输入X=,path b,path d,end main function.abd
    3(A,B,X)=(0,1,2)start main function:path a…,输入A:,输入B=,输入X=,path b,path e,end main function.abe

综上所述,基本路径覆盖测试用的测试用例最多,覆盖的路径也最多,故基本路径覆盖的覆盖率最高。

注:环形复杂度必定是基本路径个数的上限。

Snipaste_2023-05-31_21-48-19.png

第四题

使用PMD代码分析工具针对如下被测程序,找出该程序存在的潜在缺陷,给出结果界面截图,并说明各个缺陷出现的原因。

被测样本程序

import java.util.Scanner;
public class Coverage {
public static void main(String[] args){
  System.out.println("start main function:path a...");
  int A=0,B=0,X=0;
  Scanner s = new Scanner(System.in);
  System.out.println("输入A:");  A = s.nextInt();
  System.out.println("输入B=");  B = s.nextInt();
  System.out.println("输入X=");  X = s.nextInt();
  s.close();  
  if (A>1 && B==0) {
	X=X/A;
	System.out.println("path c");
  } else {
	System.out.println("path b");  }
  if (A==2 || X>1) {
	X=X+1;
	System.out.println("path e");
  } else {
	System.out.println("path d");  }
  System.out.println("end main function.");
  }

答:

Z__LBIY38___C`L5GCFZSVF.jpg

以下是可能的缺陷(感觉每个人做出来都不一样哈哈哈哈😆):

(1)VariableNamingConventions:

​ ①变量应以小写字符开头,’A’’B’’X’均以大写字符开头

(2)UseUtilityClass:

​ ①所有方法都是静态的,可以考虑使用实用工具类,或添加一个私 有构造函数,或使类抽象来屏蔽这个警告

(3)LocalVariableCouldBeFinal:

​ ①局部变量’s’可以声明为final

(4)LocalVaraiableNamingConventions:

​ ①局部变量名’A’’B’’X’不匹配’[a-z][a-zA-Z0-9]*’

(5)MethodArgumentCouldBeFinal:

​ ①参数’args’未赋值,可以声明为final

(6)CommentRequired:

​ ①类注释是必需的

​ ②公共方法和构造函数的注释是必需的

(7)OneDeclarationPerLine:

​ ①int A=0,B=0,X=0; 每个声明为一行,可以增强代码的可读性

(8)UnusedAssignment:

​ ①变量’B’的初始化式从未使用(后被重写)

​ ②变量’A’的初始化式从未使用(后被覆盖)

​ ③变量’X’的初始化式从未使用(后被覆盖)

​ ④ X=X+1; 赋给变量’X’的值从未使用过

(9)SystemPrintln:

​ ①使用System.out.println

(10)ShortVariable:

​ ① Scanner s = new Scanner(System.in); 避免使用像s这样名字较 短的变量

​ ②避免使用短名称的变量:如A,B,X

(11)DataflowAnomalyAnalysis:

​ ①发现变量’A’的’DD’异常

​ int A=0,B=0,X=0;

​ Scanner s = new Scanner(System.in);

​ System.out.println(“输入A:”);A = s.nextInt();

​ ②发现变量’X’的’DU’异常

​ X=X+1;

​ System.out.println(“path e”);

​ } else {

​ System.out.println(“path d”); }

​ System.out.println(“end main function.”);

​ }

​ ③发现变量’X’的’DD’异常

​ int A=0,B=0,X=0;

​ Scanner s = new Scanner(System.in);

​ System.out.println(“输入A:”); A = s.nextInt();

​ System.out.println(“输入B=”); B = s.nextInt();

​ System.out.println(“输入X=”); X = s.nextInt();

​ ④发现变量’B’的’DD’异常

​ int A=0,B=0,X=0;

​ Scanner s = new Scanner(System.in);

​ System.out.println(“输入A:”); A = s.nextInt();

​ System.out.println(“输入B=”); B = s.nextInt();

(12)CloseResource:

​ ①Scanner s = new Scanner(System.in); 确保像InputStream对象 这样的资源在使用后被关闭

  • 15
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王翊珩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值