一、题目的选择。
我选择的是第一题,题目要求如下:
给定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). 打钩:表示通过测试方法,测试结果完全正确。
五、代码链接。
葵花点穴手
六、总结。
本次作业是前两次作业的一个综合,难度相比前两次作业稍高,由于不熟练,所以在找测试用例方面花费了不少时间,也意识到自身的不足,以后还要继续努力。