测试过程中,经常出现 java.lang.NullPointerException 的原因和见解探讨

random
random
订阅者
10532
文章
0
粉丝
测试交流1 190字数 974阅读3分14秒阅读模式

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

出现空指针异常,一般也是以下几种原因导致文章源自玩技e族-https://www.playezu.com/251056.html

  • 调用一个空对象的实例方法。
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文章源自玩技e族-https://www.playezu.com/251056.html

在接口分析阶段,我们就需要和研发确认业务逻辑,接口有时候有非常多的入参,但入参又可能会分成几种不同作用的入参。文章源自玩技e族-https://www.playezu.com/251056.html

  • 作用于业务逻辑跳转
  • 作用于对象实例化判断
  • 作为业务数据处理

我们需要将这些参数进行归类,设计测试用例时,对于作用于对象实例化判断的这类型的参数,建议是要进行单独考虑的 ,用于覆盖可能产生空指针异常报错。文章源自玩技e族-https://www.playezu.com/251056.html

  • 访问或修改空对象的字段。

public static void main(String[] agrs){
Person person = null;
System.out.println(person.getName());
}

其实和第一种情况是类似的,也是由于空对象引起的,针对作用于对象实例化的参是进行用例覆盖。文章源自玩技e族-https://www.playezu.com/251056.html

  • 获取一个空对象的长度
    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...这种。

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

不过话说回来,想在测试用例这端覆盖此类场景还是比较难的。需要非常了解业务,以及对于开发人员开发思路也要非常了解(经常出这种问题的开发,他一定还会出同样类型的问题)文章源自玩技e族-https://www.playezu.com/251056.html

  • 访问或修改一个空的数组时
    public static void main(String[] agrs){
    boolean b = false;
    String[] strings =null;
    if(b){
    strings = new String[]{"张三", "李四"};
    }
    System.out.println(strings[1]);
    }
    

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

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

 
    • 五〇九八六二九四
      五〇九八六二九四 9

      这种 场景其实用例覆盖挺难的,主要是研发逻辑怎么整 的,不太好说
      不过经常出这个问题的研发,后面工作中一定也会出,这个是真的

    匿名

    发表评论

    匿名网友
    确定

    拖动滑块以完成验证