单元测试之道 读后感
初读《单元测试之道》,以下是我目前的一些总结
1.什么是单元测试
单元测试是用于判断某个特定条件下某个特定函数的行为。
通俗来讲,就是判断某一条件下该函数是否按照预期来执行。
2.为什么要进行单元测试
通过单元测试,可以找出程序编写中的一些问题,进而对程序进行修改和优化,大大减少在程序调试上所付出的时间。
保证底层代码的正确性,避免因底层代码错误而需要重新对整个程序编写的麻烦。
3.如何进行单元测试
首先要考虑的是在编写测试方法之前,如何测试那些可疑的方法。接下来要运行这个测试或同时运行系统模块的所有其他测试。
我们要保证的是所有的测试都通过,而不是新写的或新修改的测试可以通过。
下面是我曾经编写的一段代码以及编写的单元测试代码:
package com.company;
//设计思想:输入的数组中,首先分为没有正数、只有一个正数、有超过一个的正数,其中前两种只需输出一位最大的数即可,后一种情况,
// 以每个正数所在位置为“基本点”,分别计算从第一个基本点到其他基本点的中间包括的所有数之和,以此类推,得出一个最大值
//过程虽然冗余,但是计算精确,没有遗漏
import java.util.Scanner;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
import java.util.ArrayList;
public class MSA {
int max;
int start;
int end;
MSA(){
}
public int Calc(int[] num) {
int temp=0;
int zheng[]=new int[num.length];
for(int i=0,j=0;i<num.length;i++) {
if(num[i]>0) {
zheng[j]=i+1;j++;
}
}
//判断正数集合是否为空
for(int i=0;i<num.length;i++) {
if(zheng[i]!=0) {
temp++;
}
}
//若正数集合为空或为1,说明只有一个正数或全都是负数,则选出一个最大的即可
if(temp==0||temp==1) {
max=num[0];start=0;end=0;
for(int i=1;i<num.length;i++) {
if(num[i]>max) {
max=num[i];
start=i;end=i;
}
}
}
//若正数集合大于1,则进行计算
else{
max=num[zheng[0]-1];start=zheng[0]-1;end=zheng[0]-1;
for(int i=0;i<temp;i++) {
if(max<num[zheng[i]-1]) {
max=num[zheng[i]-1];start=zheng[i]-1;end=zheng[i]-1;
}
}
for(int i=0;i<temp-1;i++) {
for(int j=i+1;j<temp;j++) {
//从sumi加到sumj,j=i+1,存为max,再从
int sum=0;
for(int k=zheng[i]-1;k<zheng[j];k++) {
sum=sum+num[k];
}
if(sum>max) {
max=sum;
end=zheng[j]-1;
start=zheng[i]-1;
}
}
}
System.out.println("max:"+max);
}
return max;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
MSA msa=new MSA();
ArrayList<String> arrayList = new ArrayList<>();
try {
File file = new File("path");
InputStreamReader input = new InputStreamReader(new FileInputStream(file));
BufferedReader bf = new BufferedReader(input);
// 按行读取字符串
String str;
while ((str = bf.readLine()) != null) {
arrayList.add(str);
}
bf.close();
input.close();
} catch (IOException e) {
e.printStackTrace();
}
// 对ArrayList中存储的字符串进行处理
int length = arrayList.size();
int width = arrayList.get(0).split(" ").length;
int num[] = new int[width];
for (int i = 0; i <width; i++) {
String s = arrayList.get(0).split(" ")[i];
num[i] = Integer.parseInt(s);
}
msa.Calc(num);
System.out.println("起始位置"+msa.start);
System.out.println("最末位置"+msa.end);
}
}
测试代码:
package com.company;
import org.junit.Assert;
import org.junit.Test;
import static org.junit.Assert.*;
public class MSATest {
@Test
public void calc() {
int[] arr={-1,2,3,-4,5,6,-8,-6,5};
int[] arr1={-6,-7,-8,-5,-9};
int[] arr2={-5,-6,2,-7};
MSA maxofSubArray = new MSA();
int result = maxofSubArray.Calc(arr);
Assert.assertEquals(12,result);
int result1 = maxofSubArray.Calc(arr1);
Assert.assertEquals(-5,result1);
int result2 = maxofSubArray.Calc(arr2);
Assert.assertEquals(2,result2);
}
}
其中的:
arr={-1,2,3,-4,5,6,-8,-6,5},arr1={-6,-7,-8,-5,-9},arr2={-5,-6,2,-7},设计如下:
程序首先判断zheng集合的长度是否为0或为1,所以测试类选择测试两个数组,arr1是测试zheng.length=0的情况,arr2是测试zheng.length=1的情况,且由max=num[0];知道初始时将第一个数设为最大,再由下面的判断语句if(num[i]>max)知道,若想要增加语句覆盖量,需要数组中存在比第一个数大的数,所以arr1和arr2的第一个数都不是数组中最大的数。若zheng.length不为0又不为1,则需要数组存在两个及以上的正数。由max=num[zheng[0]-1]知道初始最大值设为第一个正数,由if(max<num[zheng[i]-1])语句,如果要增加语句覆盖率,第一个正数就不能是数组中最大的正数。由if(sum>max)知道,若想增加语句覆盖率,起码需要存在n个连续的数相加大于最大正数,所以,如arr,第一个正数2不是最大的正数,且存在2,3,-4,5,6相加等于12大于最大正数6。
浙公网安备 33010602011771号