問題: 給定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
程序代碼: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) + "]"; } }
邏輯覆蓋測試方法 | 說明 |
---|---|
語句覆蓋 | 每條語句至少執行一次 |
斷定覆蓋 | 斷定的每一個分支至少執行一次 |
條件覆蓋 | 斷定的每一個條件應取到各類可能的值 |
斷定-條件覆蓋 | 同時知足斷定覆蓋和條件覆蓋 |
條件組合覆蓋 | 斷定中各類條件的每一種組合至少出現一次 |
1.sum>result,sum<0git
2.sum>result,sum>=0算法
3.sum<=result,sum<0數組
4.sum<=result,sum>=0函數
注:經過分析源碼和流程圖可知,第1種組合永遠也不能知足,因此測試用例只須要覆蓋後3個組合。工具
測試用例 | 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 |
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()); } }
由圖可知,測試進度條爲綠色,errors 0個,Failures 0個,4個測試所有經過。單元測試
此次單元測試我選擇的覆蓋標準是條件組合覆蓋,條件組合覆蓋是最嚴密的白盒覆蓋方法,有利也有弊,它帶來的弊端就是過於複雜且產生的用例數過多,成本過高;正所謂魚與熊掌不能兼得,必須在成本和覆蓋率之間根據實際狀況找個平衡點。 以前就接觸過單元測試,當時單純地認爲單元測試就是測試一個函數是否按照規定要求實現了所有功能;學了軟件工程這門課以後才知道還有覆蓋標準、覆蓋率等這些專業術語。 將來未至,仍需前行!!!