单元测试之道 读后感

初读《单元测试之道》,以下是我目前的一些总结

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。

 

posted @ 2020-10-18 21:06  哎一咕光洙啊  阅读(100)  评论(0)    收藏  举报