软件工程第三次作业

软件工程第三次作业

 

一.题目选择

  题目(1):最大连续子数组和(最大子段和)

  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>几种覆盖的比较

  1. 语句覆盖 
      在测试时,首先设计若干个测试用例,然后运行被测程序,使程序中的每个可执行语句至少执行一次。 
    • 优点:可以很直观地从源代码得到测试用例,无须细分每条判定表达式。
    • 缺点:由于这种测试方法仅仅针对程序逻辑中显式存在的语句(即可执行语句),但对于隐藏的条件和可能到达的隐式逻辑分支,是无法测试的。
  2. 判定覆盖 
      设计若干测试用例,运行被侧程序,使得程序中每个判断的取真分支和取假分支至少经历一次,即判断的真假值均曾被满足。判定覆 盖又称为分支覆盖。 
    • 优点:判定覆盖比语句覆盖要多几乎一倍的测试路径,当然也就具有比语句覆盖更强的测试能力。同样判定覆盖也具有和语句覆盖一样的简单性,无须细分每个判定就可以得到测试用例。
    • 缺点:往往大部分的判定语句是由多个逻辑条件组合而成(如,判定语句中包含AND、OR、CASE),若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径。
  3. 条件覆盖 
      选择足够的测试用例,使得运行这些测试用例后,要使每个判断中每个条件的可能取值至少满足一次,但未必能覆盖全部分支。 
    • 优点:显然条件覆盖比判定覆盖,增加了对符合判定情况的测试,增加了测试路径。
    • 缺点:要达到条件覆盖,需要足够多的测试用例,但条件覆盖并不能保证判定覆盖。条件覆盖只能保证每个条件至少有一次为真,而不考虑所有的判定结果。
  4. 判定/条件覆盖 
      设计足够的测试用例,得使判断中每个条件的所有可能取值至少执行一次,同时每个判断本身所有可能结果也至少执行一次。 
    • 优点:判定/条件覆盖满足判定覆盖准则和条件覆盖准则,弥补了二者的不足。
    • 缺点:忽略了条件的组合情况。
  5. 条件组合覆盖 
      选择足够的测试用例,使得每个判定中条件的各种可能组合都至少出现一次。显然,满足“条件组合覆盖”的测试用例是一定满足“判定覆盖”、“条件覆盖”和“判定/条件覆盖”的。 
    • 优点:多重条件覆盖准则满足判定覆盖、条件覆盖和判定/条件覆盖准则。更改的判定/条件覆盖要求设计足够多的测试用例,使得判定中每个条件的所有可能结果至少出现一次,每个判定本身的所有可能结果也至少出现一次。并且每个条件都显示能单独影响判定结果。
    • 缺点:线性地增加了测试用例的数量。
 

2>选择覆盖方法

  • 程序分析

  • 路径分析:

                 

  • 测试结果:
           覆盖所有路径,且结果正确。

 

五.自动测试

  1. 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 }
  2. 测试结果

转载于:https://www.cnblogs.com/GJIN/p/8688694.html

原文地址:https://www.cnblogs.com/twodog/p/12137194.html