软工第三次个人作业

一、题目的选择。

我选择的是第一题,题目要求如下:
给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。
引用自《百度百科》

二、问题的分析。

1. 算法。

输入一组数,用curSum保存当前和,用maxSum保存当前和的最大值。并将curSum与maxSum都赋初值0。若curSum大于maxSum,则将curSum的值赋给maxSum。若最后curSum小于0,则返回0,否则返回当前和的最大值maxSum。

2. 核心代码。

public class MaxNum {
            public static int maxSum(int[] array){  
	        int maxSum = 0; 
	        for(int i=0;i<array.length;i++){
	            for(int j = i ; j < array.length;j++){  
	                 int curSum = 0;  
	                for (int k = i; k <= j; k++){  
	                    curSum += array[k];  
	                    if(curSum > maxSum){  
	                        maxSum = curSum;  
	                    }  
	                }  
	            } 
	        }
	        if (maxSum < 0) {
				return 0;
			}
	        else {
				return maxSum;
			}
	    }  

3. 流程图。

4.验证题目中的用例。

三、单元测试。,

1. 覆盖方法。

(1)语句覆盖:选择合适用例,所有语句被执行一次。

语句覆盖又称行覆盖,段覆盖,基本块覆盖,这是最常用也是最常见的一种覆盖方式,就是度量被测代码中每个可执行语句是否被执行到了。这里说的是"可执行语句",因此就不会包括像C++的头文件声明,代码注释,空行,等等。非常好理解,只统计能够执行的代码被执行了多少行。需要注意的是,单独一行的花括号{} 也常常被统计进去。语句覆盖常常被人指责为"最弱的覆盖",它只管覆盖代码中的执行语句,却不考虑各种分支的组合等等。假如只要求达到语句覆盖,那么换来的确实测试效果不明显,很难更多地发现代码中的问题。

(2)判定覆盖:每个判定至少取一次真、一次假。

判定覆盖是设计足够多的测试用例,使得程序中的每一个判断至少获得一次"真"和一次"假",即使得程序流程图中的每一个真假分支至少被执行一次。

(3)条件覆盖:每个条件的各种可能结果至少满足一次。

条件覆盖是电脑编程术语,是逻辑覆盖的一种。它指的是设计足够多的测试用例,使得被测试程序中的每个逻辑条件的可能值至少被满足一次。

(4)判定条件覆盖:同时满足判断覆盖和条件覆盖。

判定条件覆盖是设计足够的测试用例,得使判断中每个条件的所有可能取值至少执行一次,同时每个判断本身所有可能结果也至少执行一次。缺点是忽略了条件的组合情况。

(5)条件组合覆盖:所有组合情况都要覆盖一次。

在白盒测试法中,选择足够的测试用例,使得每个判定中条件的各种可能组合都至少出现一次。显然,满足"条件组合覆盖"的测试用例是一定满足"判定覆盖"、"条件覆盖"和"判定/条件覆盖"的。

2. 我选择判定/条件覆盖。

覆盖情况应执行路径:

3. 选择用例:

(1)测试用例1:(-1,-7,-9,-15,-20)
(2)测试用例2:(1,3,5,7,9)
(3)测试用例3:(-2,9,4,5,-3)
(4)测试用例4:(-7,1,-3,12,-5)

四、结果展示。

1. 自动测试截图。

(1)测试用例1。


(2)测试用例2。


(3)测试用例3。


(4)测试用例4。

2.单元测试代码。

	@Test
	public void test1() {
		int number = 5;
		int a[] = {-1,-7,-9,-15,-20};
		assertEquals(0, MaxNum.maxSum(a));
	}
	@Test
	public void test2() {
		int number = 5;
		int a[] = {1,3,5,7,9};
		assertEquals(25, MaxNum.maxSum(a));
	}
	@Test
	public void test3() {
		int number = 5;
		int a[] = {-2,9,4,5,-3};
		assertEquals(18, MaxNum.maxSum(a));
	}
	@Test
		public void test4() {
			int number = 5;
			int a[] = {-7,1,-3,12,-5};
			assertEquals(12, MaxNum.maxSum(a));
	}

3. 单元测试截图。

4.结果分析。

(1). Runs:总共有4个测试方法,已经运行了4个;
(2). Errors:抛出异常的测试方法的个数是0;
(3). Failures:表示失败的测试方法的个数是0;
(4). 打钩:表示通过测试方法,测试结果完全正确。

五、代码链接。

葵花点穴手

六、总结。

本次作业是前两次作业的一个综合,难度相比前两次作业稍高,由于不熟练,所以在找测试用例方面花费了不少时间,也意识到自身的不足,以后还要继续努力。

posted @ 2018-03-30 22:34  火锅妹  阅读(228)  评论(0编辑  收藏  举报