实验二-160-曾元鹏

本文介绍了一个用于测试三角形分类的程序及其多种白盒测试技术的应用,包括语句覆盖、判定覆盖、条件覆盖、路径覆盖等,并给出了具体的测试用例及JUnit测试脚本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

被测代码链接:http://www.cnblogs.com/WuYeqian/p/6618858.html

一、实验目的

掌握覆盖测试的基本方法和实践

二、实验要求

运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。

三、实验内容

(1)设计某程序的路径覆盖测试用例,如路径覆盖、条件覆盖、分支覆盖、循环覆盖等

伪代码程序如下:

 

 9     public static String triangle(int a,int b,int c){    

10         if(a<1 || a>100 ||b<1 || b>100|| c<1|| c>100){

11            return t1;

12         }

13         else if(a>=b+c ||b>=a+c||c>=a+b){

14             return t2;

15         }

16         else if(a==b &&b==c &&c==a){

17             return t3;

18         }

19         else if(a==b ||b==c ||c==a){

20             return t4;

21         }

22         else if(a*a+b*b==c*c ||b*b+c*c==a*a ||c*c+a*a==b*b){

23             return t5;

24         }

25         else {

26             return t6;

27         }

28     }

 

 

DD-路径(只压缩链路经)

程序图节点

DD-路径

9

A

10

B

11.12.13

C

14

D

15.16.17

E

18

F

19.20

G

21

H

22.23

I

24

J

25.26

K

27.28.29

L

30

M

 

(I)语句覆盖:

A-B-D-F-H-J-L-M 和A-B-D-F-H-J-K-M

A-B-D-F-H-I-M   A-B-D-F-G-M

 A-B-D-E-M 和  A-B-C-M

 

测试用例:

用例ID

输入值

执行路径

预期输出

实际输出

a

b

c

X

Y

1

5

7

8

A-B-D-F-H-J-L-M

一般三角形

一般三角形

2

3

5

4

A-B-D-F-H-J-K-M

直角三角形

直角三角形

3

5

6

6

A-B-D-F-H-I-M

等腰三角形

等腰三角形

4

30

30

30

A-B-D-F-G-M

等边三角形

等边三角形

5

5

5

15

A-B-D-E-M

不构成三角形

不构成三角形

6

120

55

30

A-B-C-M

边值不在范围

边值不在范围

 

(II)分支覆盖(判断覆盖):

A-B-C-M(1.

A-B-D-E-M(1.2.

A-B-D-E-G-M(1.2.右,3

A-B-D-F-H-I-M(1.2.右,3右,4

A-B-D-F-H-J-K-M(1.2.右,3右,4右,5

A-B-D-F-H-J-L-M(1.2.右,3右,4右,5

 

测试用例:

用例ID

输入值

执行路径

预期输出

实际输出

A

B

C

X

Y

1

20

30

110

A-B-C-M

边值不在范围

边值不在范围

2

10

22

10

A-B-D-E-M

不构成三角形

不构成三角形

3

70

70

70

A-B-D-E-G-M

等边三角形

等边三角形

4

30

50

30

A-B-D-F-H-I-M

等腰三角形

等腰三角形

5

5

12

13

A-B-D-F-H-J-K-M

直角三角形

直角三角形

6

50

60

55

A-B-D-F-H-J-L-M

一般三角形

一般三角形

 

(III)路径覆盖:

A-B-C-M(1.

A-B-D-E-M(1.2.

A-B-D-E-G-M(1.2.右,3

A-B-D-F-H-I-M(1.2.右,3右,4

A-B-D-F-H-J-K-M(1.2.右,3右,4右,5

A-B-D-F-H-J-L-M(1.2.右,3右,4右,5

 

测试用例:

用例ID

输入值

执行路径

预期输出

实际输出

A

B

C

X

Y

1

22

33

130

A-B-C-M

边值不在范围

边值不在范围

2

30

22

60

A-B-D-E-M

不构成三角形

不构成三角形

3

5

5

 5

A-B-D-E-G-M

等边三角形

等边三角形

4

25

40

25

A-B-D-F-H-I-M

等腰三角形

等腰三角形

5

12

5

13

A-B-D-F-H-J-K-M

直角三角形

直角三角形

6

6

3

5

A-B-D-F-H-J-L-M

一般三角形

一般三角形

 

(IV)条件覆盖:各个条件取真或假的可能至少执行一次((F/T表示真假都一样)

 

第一个条件:

编号

a<1

 a>100

b<1

b>100

 c<1

c>100

覆盖路径

1

T

F/T

F/T

F/T

F/T

F/T

A-B-C-M

2

F/T

T

F/T

F/T

F/T

F/T

A-B-C-M

3

F/T

F/T

T

F/T

F/T

F/T

A-B-C-M

4

F/T

F/T

F/T

T

F/T

F/T

A-B-C-M

5

F/T

F/T

F/T

F/T

T

F/T

A-B-C-M

6

F/T

F/T

F/T

F/T

F/T

T

A-B-C-M

7

F

F

F

F

F

F

A-B-D

 

第二个条件:

编号

a>=b+c 

b>=a+c

c>=a+b  

覆盖路径

1

T

F/T

F/T

A-B-D-E-M

2

F/T

T

F/T

A-B-D-E-M

3

F/T

F/T

T

A-B-D-E-M

4

F

F

F

A-B-D-F

 

第三个条件:

编号

a==b 

b==c  

c==a  

覆盖路径

1

T

T

T

A-B-D-F-G-M

2

F

T/F

F/T

A-B-D-F-H

3

F/T

F

F/T

A-B-D-E-M

4

F/T

F/T

F

A-B-D-F

 

第四个条件:

编号

a==b 

b==c  

c==a 

覆盖路径

1

T

T/F

F

A-B-D-F-H-I-M

2

T

F

F/T

A-B-D-F-H-I-M

3

F/T

T

F

A-B-D-F-H-I-M

4

F

T

F/T

A-B-D-F-H-I-M

 

F/T

F

T

A-B-D-F-H-I-M

 

F

F/T

T

A-B-D-F-H-I-M

 

F

F

F

A-B-D-F-H-J

 

第五个条件:

编号

a*a+b*b==c*c 

b*b+c*c==a*a 

c*c+a*a==b*b 

覆盖路径

1

T

F/T

F/T

A-B-D-F-H-J-K-M

2

F/T

T

F/T

A-B-D-F-H-J-K-M

3

F/T

F/T

T

A-B-D-F-H-J-K-M

4

F

F

F

A-B-D-F-H-J-L-M

 

 

测试用例:

用例ID

输入值

执行路径

预期输出

实际输出

A

B

C

X

Y

1

22

33

130

A-B-C-M

边值不在范围

边值不在范围

2

30

22

60

A-B-D-E-M

不构成三角形

不构成三角形

3

5

5

 5

A-B-D-F-G-M

等边三角形

等边三角形

4

25

40

25

A-B-D-F-H-I-M

等腰三角形

等腰三角形

5

12

5

13

A-B-D-F-H-J-K-M

直角三角形

直角三角形

6

6

3

5

A-B-D-F-H-J-L-M

一般三角形

一般三角形

 

2)根据各位同学自己的被测程序,分别作出各类白盒测试技术的用例设计和相应的Junit脚本。

所有的覆盖的技术:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖,基本路径测试方法

  

1) 被测原代码

 

 

public class Client {

	public static void main(String[] args) throws Exception {
		new Menu();
	}

}

public class IsInteger {
	public static boolean IsNum(String str)
	       {
	        if(str==null)
	         {
	           return false;
	         }
	        else{
	            try{
	             @SuppressWarnings("unused")
	             int num=Integer.valueOf(str);//把字符串强制转换为数字 
	             return true;//是数字,返回true
	             }catch (Exception e) {
	              return false;
	             }
	         }
	     }
}

public class Menu {
	private static Scanner in = new Scanner(System.in);
	     public Menu() throws Exception
	     {
	          while(true){
	              this.show();
	         }
	     }
	     @SuppressWarnings("resource")
	     public void show() throws Exception{
	         
	         System.out.println("======三角形种类=====");
	         System.out.println("[1] 进行三角形类型判断");
	         System.out.println("[e] 退出。");
	         while (in.hasNext()) {
	        String i = in.nextLine();
	         switch(i){
	             case "1":{
	                 int i_a,i_b,i_c;
	                 System.out.println("请输入三角形的三条边:");        
	                 do {
	                     Scanner scana=new Scanner(System.in);             
	                     String a=scana.next();
	                     Scanner scanb=new Scanner(System.in); 
	                     String b=scanb.next();                
	                     Scanner scanc=new Scanner(System.in);
	                     String c=scanc.next();
	                     if(IsInteger.IsNum(a)&&IsInteger.IsNum(b)&&IsInteger.IsNum(c))
	                    {
	                         i_a = Integer.parseInt(a);
	                          i_b = Integer.parseInt(b);
	                         i_c = Integer.parseInt(c);
	                          System.out.println(Sort.triangle(i_a, i_b, i_c));
	                          break;
	                     }
	                     else{
	                        System.out.println("输入不是整数!请重请输入三角形的三条边:");
	                    }
	                 } while (true);    
	                 System.out.println("==========请继续选择===========");
	                 System.out.println("[1] 进行三角形类型判断");
	                 System.out.println("[e] 退出。");    
	                 break ;
	         }    
	             case "e":{
	                 System.exit(1) ;        // 系统退出
	                 break ;
	            }
	             default:{
	                 System.out.println("请选择正确的操作!") ;
	             }
	         }
	     }
	     }
}

public class Sort {
	
	static String t1="边的值不在范围内";
	static String t2="不构成三角形";
	static String t3="等边三角形";
	static String t4="等腰三角形";
	static String t5="直角三角形";
	static String t6="一般三角形";
	public static String triangle(int a,int b,int c){    
	if(a<1 || a>100 ||b<1 || b>100|| c<1|| c>100)
	         {
	             return t1;
	         }
	         else if(a>=b+c ||b>=a+c||c>=a+b)
	         {
	             return t2;
	         }
	         else if(a==b &&b==c &&c==a){
	             return t3;
	         }
	         else if(a==b ||b==c ||c==a){
	             return t4;
	         }
	         else if(a*a+b*b==c*c ||b*b+c*c==a*a ||c*c+a*a==b*b){
	             return t5;
	         }
	         else {
	             return t6;
	         }
	     }
}

 

 

2)依据覆盖技术的测试用例:

public class test01 {

	@Before
	public void setUp() throws Exception {
	}

	@Test
	public void testTriangle() {
		assertEquals("一般三角形", otherTest.Sort.triangle(20, 30, 15));
		assertEquals("直角三角形", otherTest.Sort.triangle(3, 4, 5));
		assertEquals("等边三角形", otherTest.Sort.triangle(20, 20, 20));
		assertEquals("等腰三角形", otherTest.Sort.triangle(30, 30, 15));
		assertEquals("边的值不在范围内", otherTest.Sort.triangle(120, 30, 15));
		assertEquals("不构成三角形", otherTest.Sort.triangle(50, 20, 10));
	}
	
	// 语句覆盖
	@Test
	      public void statementTest() {
	          assertEquals("边的值不在范围内", otherTest.Sort.triangle(120, 30, 15));
	          assertEquals("不构成三角形", otherTest.Sort.triangle(10, 20, 10));
	          assertEquals("等边三角形", otherTest.Sort.triangle(3, 3, 3));
	          assertEquals("等腰三角形", otherTest.Sort.triangle(5, 5, 7));
	          assertEquals("直角三角形", otherTest.Sort.triangle(3, 4, 5));
	          assertEquals("一般三角形", otherTest.Sort.triangle(60, 50, 55));
	      }
	// 判定覆盖
	@Test
	public void judgeTest1() {
	  
		assertEquals("边的值不在范围内", otherTest.Sort.triangle(120, 30, 15));
	}
	@Test
    public void judgeTest2() {

		 assertEquals("不构成三角形", otherTest.Sort.triangle(10, 20, 10));
    }
	@Test
    public void judgeTest3() {

		assertEquals("等边三角形", otherTest.Sort.triangle(3, 3, 3));
    }
	@Test
    public void judgeTest4() {

		assertEquals("等腰三角形", otherTest.Sort.triangle(5, 5, 7));
    }
	@Test
    public void judgeTest5() {

		assertEquals("直角三角形", otherTest.Sort.triangle(3, 4, 5));
    }
	@Test
    public void judgeTest6() {

		 assertEquals("一般三角形", otherTest.Sort.triangle(60, 50, 55));
    }
	//条件覆盖
	 @Test
	 public void conditionTest1() {
	     assertEquals("边的值不在范围内",otherTest.Sort.triangle(101, 50, 55));
	 }
	 @Test
	 public void conditionTest2() {
		 assertEquals("不构成三角形", otherTest.Sort.triangle(20, 30, 80));
	 }
	 @Test
	 public void conditionTest3() {
	     assertEquals("等边三角形",otherTest.Sort.triangle(55, 55, 55));
	 }
	 @Test
	 public void conditionTest4() {
	     assertEquals("等腰三角形",otherTest.Sort.triangle(55, 50, 55));
	 }
	 @Test
	 public void conditionTest5() {
	     assertEquals("直角三角形",otherTest.Sort.triangle(6, 10,8));
	 }
	 @Test
	 public void conditionTest6() {
	     assertEquals("一般三角形",otherTest.Sort.triangle(20,10, 15));
	 }
	 public void conditionTest7() {
	     assertEquals("边的值不在范围内",otherTest.Sort.triangle(10, 120, 55));
	 }
	 public void conditionTest8() {
	     assertEquals("边的值不在范围内",otherTest.Sort.triangle(10, 50, 130));
	 }
	 public void conditionTest9() {
	     assertEquals("等腰三角形",otherTest.Sort.triangle(11, 11,10));
	 }
	 //路径覆盖
	 @Test
	 public void pathTest1() {
	     assertEquals("边的值不在范围内",otherTest.Sort.triangle(0, 0, 150));
	 }
	 @Test
	 public void pathTest2() {
		 assertEquals("不构成三角形", otherTest.Sort.triangle(20, 30, 80));
	 }
	 @Test
	 public void pathTest3() {
		 assertEquals("等边三角形",otherTest.Sort.triangle(55, 55, 55));
	 }
	 @Test
	 public void pathTest4() {
		 assertEquals("等腰三角形",otherTest.Sort.triangle(55, 50, 55));
	 }
	 @Test
	 public void pathTest5() {
		 assertEquals("直角三角形",otherTest.Sort.triangle(6, 10,8));
	 }
	 @Test
	 public void pathTest6() {
		 assertEquals("一般三角形",otherTest.Sort.triangle(20,10, 15));
	 }
}

  

 

4) 测试小结:

第一部分:需对代码的划分结构进行修改,使得作图更为方便,同时也可使解题的思路更为清晰。对测试用例的选择有着很多的,还需进一步进行规划,找出具有代表性的用例进行测试。

 

第二部分,在测试中未找到出错的缺陷,在选取用例时希望能更具代表性。

 

 

转载于:https://www.cnblogs.com/ypzeng/p/6706300.html

 热更新框架设计系列课程总体介绍:       本系列课程由《热更新框架设计之Xlua基础》、《热更新框架设计之热更流程与热补丁技术》、《热更新框架设计之游戏客户端框架》三套课程组成。 三套课程是一个不可分割有机的整体,笔者带领大家由浅入深逐级深入 ,在领悟热更精髓的基础之上,通过高端架构设计,**完成设计出“低耦合”、“低侵入”、“高复用”性的游戏(VR/AR)客户端热更框架。《热更新框架设计之客户端热更框架》课程介绍:       本作为热更框架系列课程中的客户端框架设计与实现部分。理解本作需要之前的所有知识点积累,在其基础之上给学员展现当今商业热更框架中,商业级热更框架的基本原理、设计全过程、实现框架产品等全过程。通过本作学习可以让资深开发人员晋升为游戏架构师、主程、技术总监等职位。        为了更好更快的服务广大学员,本课程分为上、中、下三部分,内容如下:        上部:             UI框架与AB框架整合,重构整合为 “热更新UI框架”。        中部:             “热更新UI框架”与热更流程技术重构整合。               纯Lua框架设计理念与实现。        下部:              复合型热更框架设计与实现。              框架产品加入HotFix功能模块,且功能演示与测试完善。  A:《热更新框架设计之客户端热更框架(中)》https://edu.youkuaiyun.com/course/detail/27135B:《热更新框架设计之客户端热更框架(下)》https://edu.youkuaiyun.com/course/detail/27136 
热更新框架设计系列课程总体介绍:     本系列课程由《热更新框架设计之Xlua基础》、《热更新框架设计之热更流程与热补丁技术》、《热更新框架设计之游戏客户端框架》三套课程组成。 三套课程是一个不可分割有机的整体,笔者带领大家由浅入深逐级深入 ,在领悟热更精髓的基础之上,通过高端架构设计,**完成设计出“低耦合”、“低侵入”、“高复用”性的游戏(VR/AR)客户端热更框架。《热更新框架设计之热更流程与热补丁技术》课程介绍:        本课程为热更框架系列课程中的热更流程设计部分,主要起到承上启下的作用,为后续的框架大整合提供必要技术准备。本作主要通过“客户端与(下载)服务器内部数据核心交换”的示意图,给学员展现当今商业热更框架中,基本与核心的热更流程实现原理与设计思考。    课程主要分为四大部分:    一: 热更流程核心脚本与接口开发、核心编辑器类开发。    : IIS服务器安装与配置。    三:   lua脚本加载资源与整体热更流程检验。    四: 基于xlua的热补丁技术讲解与案例应用。 温馨提示:     1: 本套课程需要具备一定的框架理解与驾驭能力,为了更好的理解本作,强烈推荐广大学员首先学完必要的前导课程:“UI客户端框架设计”、“AssetBundle 框架设计”、“lua基础与中级篇”。     2:  本课程使用Unity2017版本讲解,但是本课程主要讲解开发思想与具体实现技术,所以对Unity版本不敏感。 学员使用后续的Unity2018/19/2020..... 等版本基本没有影响。一、热更新系列(技术含量:中高级):A:《lua热更新技术中级篇》https://edu.youkuaiyun.com/course/detail/27087B:《热更新框架设计之Xlua基础视频课程》https://edu.youkuaiyun.com/course/detail/27110C:《热更新框架设计之热更流程与热补丁技术》https://edu.youkuaiyun.com/course/detail/27118D:《热更新框架设计之客户端热更框架(上)》https://edu.youkuaiyun.com/course/detail/27132E:《热更新框架设计之客户端热更框架(中)》https://edu.youkuaiyun.com/course/detail/27135F:《热更新框架设计之客户端热更框架(下)》https://edu.youkuaiyun.com/course/detail/27136:框架设计系列(技术含量:中级): A:《游戏UI界面框架设计系列视频课程》https://edu.youkuaiyun.com/course/detail/27142B:《Unity客户端框架设计PureMVC篇视频课程(上)》https://edu.youkuaiyun.com/course/detail/27172C:《Unity客户端框架设计PureMVC篇视频课程(下)》https://edu.youkuaiyun.com/course/detail/27173D:《AssetBundle框架设计_框架篇视频课程》https://edu.youkuaiyun.com/course/detail/27169三、Unity脚本从入门到精通(技术含量:初级)A:《C# For Unity系列之入门篇》https://edu.youkuaiyun.com/course/detail/4560B:《C# For Unity系列之基础篇》https://edu.youkuaiyun.com/course/detail/4595C: 《C# For Unity系列之中级篇》https://edu.youkuaiyun.com/course/detail/24422D:《C# For Unity系列之进阶篇》https://edu.youkuaiyun.com/course/detail/24465四、虚拟现实(VR)与增强现实(AR):(技术含量:初级)A:《虚拟现实之汽车仿真模拟系统 》https://edu.youkuaiyun.com/course/detail/26618五、Unity基础课程系列(技术含量:初级) A:《台球游戏与FlappyBirds—Unity快速入门系列视频课程(第1部)》 https://edu.youkuaiyun.com/course/detail/24643B:《太空射击与移动端发布技术-Unity快速入门系列视频课程(第2部)》https://edu.youkuaiyun.com/course/detail/24645 C:《Unity ECS() 小试牛刀》https://edu.youkuaiyun.com/course/detail/27096六、Unity ARPG课程(技术含量:初中级):A:《MMOARPG地下守护神_单机版实战视频课程(上部)》https://edu.youkuaiyun.com/course/detail/24965B:《MMOARPG地下守护神_单机版实战视频课程(中部)》https://edu.youkuaiyun.com/course/detail/24968C:《MMOARPG地下守护神_单机版实战视频课程(下部)》https://edu.youkuaiyun.com/course/detail/24979
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值