軟件工程第三次做業

1、題目選擇

題目(1):最大連續子數組和(最大子段和)

問題: 給定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。

引用自《百度百科》html

2、代碼

程序代碼:JunitDemo
參考博客:五種求解最大連續子數組的算法java

package site.yuanrui.demo;

import java.util.Arrays;
/**
 * 數據類
 * @author YUANRUI
 * version 1.0
 *
 */
public class MaxArray 
{
    private int[] array;
    public MaxArray(int[] array) 
    {
        this.array = array;
    }
    /**
     * 求字段和的最大值
     * @return
     */
    public int maxSubArray()
    {
        int n = this.array.length;
        int result = 0;
        int sum = 0;
        for (int i = 0; i < n; i++)
        {
            sum += this.array[i];
            if (sum > result) 
            {
                result = sum;
            }
            if (sum < 0) 
            {
                //子串和爲負數,丟掉
                sum = 0;
            }
        }
        return result;
    }
    /**
     * 返回對象的字符串形式
     */
    public String toString()
    {
        return "MaxArray [array=" + Arrays.toString(array) + "]";
    }
}

3、選擇覆蓋標準並設計測試用例

1.5種邏輯覆蓋測試方法對比

邏輯覆蓋測試方法 說明
語句覆蓋 每條語句至少執行一次
斷定覆蓋 斷定的每一個分支至少執行一次
條件覆蓋 斷定的每一個條件應取到各類可能的值
斷定-條件覆蓋 同時知足斷定覆蓋和條件覆蓋
條件組合覆蓋 斷定中各類條件的每一種組合至少出現一次

2.畫出上述程序段的流程圖以下:

3.在這裏我選擇條件組合覆蓋,根據條件組合覆蓋的定義,每一個斷定包含一個條件,共有4種可能的組合,即該知足如下覆蓋狀況:

  1.sum>result,sum<0git

  2.sum>result,sum>=0算法

  3.sum<=result,sum<0數組

  4.sum<=result,sum>=0函數

注:經過分析源碼和流程圖可知,第1種組合永遠也不能知足,因此測試用例只須要覆蓋後3個組合。工具

4.這裏設計了個測試用例,用以覆蓋上述4中條件組合,以下表所示:

測試用例 array[] 覆蓋組合號 執行路徑 覆蓋條件
測試用例1 {-1,-2,-3,-4} 3 abe sum<=result,sum<0
測試用例2 {1,2,3,4} 2 acd sum>result,sum>=0
測試用例3 {-1,2,-2,4} 4 abd sum<=result,sum>=0

4、利用自動測試工具對程序進行測試

package site.yuanrui.test;

import static org.junit.Assert.*;

import java.lang.reflect.Parameter;
import java.util.Arrays;
import java.util.Collection;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

import site.yuanrui.demo.MaxArray;
/**
 * MaxArray測試類
 * @author YUANRUI
 *
 */
@RunWith(Parameterized.class)
public class MaxArrayTest 
{
    private int excepted;
    private int[] array;
    public MaxArrayTest(int excepted,int[] array)
    {
        this.excepted = excepted;
         this.array = array;
    }
    @Parameters
    public static Collection words()
    {
        return Arrays.asList(new Object[][]{
            {20,new int[]{-2,11,-4,13,-5,-2}},//題目中測試用例
            {0,new int[]{-1,-2,-3,-4}},//測試用例1
            {10,new int[]{1,2,3,4}},//測試用例2
            {4,new int[]{-1,2,-2,4}}//測試用例3
        });
    }
    @Test
    public void testMaxSubArray() 
    {
        MaxArray ma = new MaxArray(this.array);
        int num = ma.maxSubArray();
        assertEquals(this.excepted, ma.maxSubArray());
    }
}

5、程序運行和自動測試分析結果


  由圖可知,測試進度條爲綠色,errors 0個,Failures 0個,4個測試所有經過。單元測試

6、總結

此次單元測試我選擇的覆蓋標準是條件組合覆蓋,條件組合覆蓋是最嚴密的白盒覆蓋方法,有利也有弊,它帶來的弊端就是過於複雜且產生的用例數過多,成本過高;正所謂魚與熊掌不能兼得,必須在成本和覆蓋率之間根據實際狀況找個平衡點。 以前就接觸過單元測試,當時單純地認爲單元測試就是測試一個函數是否按照規定要求實現了所有功能;學了軟件工程這門課以後才知道還有覆蓋標準、覆蓋率等這些專業術語。 將來未至,仍需前行!!!
相關文章
相關標籤/搜索