在测试,尤其是接口测试过程中,我们经常会碰到 java.lang.NullPointerException 的报错,那么是什么原因导致的呢,我们在测试用例设计的时候,我们是否可以有效覆盖,从而规避空指针类的问题呢?

出现空指针异常,一般也是以下几种原因导致

class Person {
    private String name;
    private int age;

    public void Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String get() {
        return name + ", " + age;
    }

 public static void main(String[] agrs){

        Person person = null;
        System.out.println(person.get());

    }

通常在实际业务开发过程中,经常会先初始化一个对象,在具体的逻辑中再进行实例化,这种情况是最常见的,比如:接口请求时,传入某个特定的参数后,可能会报 java.lang.NullPointerException

在接口分析阶段,我们就需要和研发确认业务逻辑,接口有时候有非常多的入参,但入参又可能会分成几种不同作用的入参。

我们需要将这些参数进行归类,设计测试用例时,对于作用于对象实例化判断的这类型的参数,建议是要进行单独考虑的 ,用于覆盖可能产生空指针异常报错。


public static void main(String[] agrs){

       Person person = null;
       System.out.println(person.getName());

   }

其实和第一种情况是类似的,也是由于空对象引起的,针对作用于对象实例化的参是进行用例覆盖。

public static void main(String[] agrs){

        List<Person> personList = new ArrayList<>();
            personList.add(new Person("zhangsan",19));
            personList.add(new Person("lisi",20));
            personList.add(new Person(null,21));
        System.out.println(personList.get(3).getName().length());

    }

在业务逻辑中,会经常对一些值进行一些长度判断,比如,大于多少字,显示 XX...这种。

但这种情况一般都是由于开发在使用数据时,未做判空导致。
还有就是数据库数据存储不规范造成的,直观所能看到的大部分数据,其实都是来源于数据库,数据库的存储往往又是多样性的,可能在这几百条数据中,就会偶尔有那么条不合规的情况。这种的很难人工验证和排查到,但偶尔命中后,要及时重视,并跟进。向上推动,从数据库源头解决此类问题。

不过话说回来,想在测试用例这端覆盖此类场景还是比较难的。需要非常了解业务,以及对于开发人员开发思路也要非常了解(经常出这种问题的开发,他一定还会出同样类型的问题)

public static void main(String[] agrs){

        boolean b = false;
        String[] strings =null;
        if(b){
            strings = new String[]{"张三", "李四"};
        }

        System.out.println(strings[1]);
    }

其实和第一种情况是非常类似的,业务处理过程中,往往是先定义参数,随业务逻辑的进行,会对参数进行初始化,当定义的参数未赋值或者被赋值对象也是 null 时,就会抛出空指针异常的问题。

总得来讲,用例设计时,对于作用于对象或参数实例化判断的参数,一定要进行单独考虑的。
这种对象或实例被赋予的值为 null 的场景,我们其实也是可以在进行数据准备时,造一些异常数据,来验证一下程序的健壮性的。但可能对测试要求会高一些,需要熟悉业务数据库存储情况,业务代码逻辑相关,才能够针对特定场景,制定特定的用例。


↙↙↙阅读原文可查看相关链接,并与作者交流