软件工程第三次作业
一.题目选择
题目(1):最大连续子数组和(最大子段和)
- 问题:给定n个整数(可能为负数)组成的序列a1,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
例如,当(a1,a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。
二.环境的选择
选用eclipse的junit单元测试工具
三.程序编写
- 程序源码
1 package maxsum; 2 3 import java.util.Scanner; 4 5 public class maxsum { 6 public static int maxSubArray(int N,int a[]){ 7 int sum=0,mins=0,ans=0; 8 for (int i = 1;i <= N; i++){ 9 sum += a[i]; 10 if (sum - mins > ans) 11 ans = sum - mins; 12 if (mins > sum) 13 mins = sum; 14 } 15 return ans; 16 } 17 public static void main(String[] args){ 18 Scanner sc = new Scanner(System.in); 19 int N=sc.nextInt(); 20 int[] a = new int[100]; 21 for(int i=0;i<N;i++) { 22 a[i] = sc.nextInt(); 23 } 24 sc.close(); 25 int sum = maxSubArray(N,a); 26 System.out.print(sum); 27 } 28 }
- github代码链接
四.几种覆盖方法的比较与选择
1>几种覆盖的比较
- 语句覆盖
在测试时,首先设计若干个测试用例,然后运行被测程序,使程序中的每个可执行语句至少执行一次。- 优点:可以很直观地从源代码得到测试用例,无须细分每条判定表达式。
- 缺点:由于这种测试方法仅仅针对程序逻辑中显式存在的语句(即可执行语句),但对于隐藏的条件和可能到达的隐式逻辑分支,是无法测试的。
- 判定覆盖
设计若干测试用例,运行被侧程序,使得程序中每个判断的取真分支和取假分支至少经历一次,即判断的真假值均曾被满足。判定覆 盖又称为分支覆盖。- 优点:判定覆盖比语句覆盖要多几乎一倍的测试路径,当然也就具有比语句覆盖更强的测试能力。同样判定覆盖也具有和语句覆盖一样的简单性,无须细分每个判定就可以得到测试用例。
- 缺点:往往大部分的判定语句是由多个逻辑条件组合而成(如,判定语句中包含AND、OR、CASE),若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径。
- 条件覆盖
选择足够的测试用例,使得运行这些测试用例后,要使每个判断中每个条件的可能取值至少满足一次,但未必能覆盖全部分支。- 优点:显然条件覆盖比判定覆盖,增加了对符合判定情况的测试,增加了测试路径。
- 缺点:要达到条件覆盖,需要足够多的测试用例,但条件覆盖并不能保证判定覆盖。条件覆盖只能保证每个条件至少有一次为真,而不考虑所有的判定结果。
- 判定/条件覆盖
设计足够的测试用例,得使判断中每个条件的所有可能取值至少执行一次,同时每个判断本身所有可能结果也至少执行一次。- 优点:判定/条件覆盖满足判定覆盖准则和条件覆盖准则,弥补了二者的不足。
- 缺点:忽略了条件的组合情况。
- 条件组合覆盖
选择足够的测试用例,使得每个判定中条件的各种可能组合都至少出现一次。显然,满足“条件组合覆盖”的测试用例是一定满足“判定覆盖”、“条件覆盖”和“判定/条件覆盖”的。- 优点:多重条件覆盖准则满足判定覆盖、条件覆盖和判定/条件覆盖准则。更改的判定/条件覆盖要求设计足够多的测试用例,使得判定中每个条件的所有可能结果至少出现一次,每个判定本身的所有可能结果也至少出现一次。并且每个条件都显示能单独影响判定结果。
- 缺点:线性地增加了测试用例的数量。
2>选择覆盖方法
- 程序分析
- 路径分析:
- 测试结果:
覆盖所有路径,且结果正确。
五.自动测试
- junit自动测试类
1 package maxsum; 2 3 import static org.junit.Assert.*; 4 5 import java.util.Arrays; 6 import java.util.Collection; 7 8 import org.junit.Test; 9 import org.junit.runner.RunWith; 10 import org.junit.runners.Parameterized; 11 import org.junit.runners.Parameterized.Parameters; 12 @RunWith(Parameterized.class) 13 public class MaxSumTest { 14 private int excepted; 15 private int[] array; 16 public MaxSumTest(int excepted,int[] array){ 17 this.excepted = excepted; 18 this.array = array; 19 } 20 /** 21 * 3.由@Parameterized.Parameters修饰一个 22 * public static Collection xxx() 23 */ 24 @Parameters 25 public static Collection data() { 26 return Arrays.asList(new Object[][] { 27 { 9, new int[]{-1,3,4,-8,9}}, 28 { 7, new int[]{-2,5,-6,3,4}}, 29 { 0, new int[]{-1,-2,-3,-4,-5}}, 30 { 12, new int[]{-1,6,-7,3,4,5,-6}} 31 }); 32 } 33 34 @Test 35 public void testMaxSubArray() { 36 assertEquals(this.excepted, maxsum.maxSubArray(this.array.length-1, this.array)); 37 } 38 39 }
- 测试结果
转载于:https://www.cnblogs.com/GJIN/p/8688694.html