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

random 测试交流1 104字数 1707阅读模式

在测试,尤其是接口测试过程中,我们经常会碰到 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

玩技站长微信
添加好友自动发送入群邀请
weinxin
rainbow-shownow
玩技官方公众号
官方微信公众号
weinxin
PLAYEZU
 
  • 版权提示:本站仅供存储任何法律责任由作者承担▷诈骗举报◁▷新闻不符◁▷我要投稿◁
    风险通知:非原创文章均为网络投稿真实性无法判断,侵权联系2523030730
    免责声明:内容来自用户上传发布或新闻客户端自媒体,切勿!切勿!切勿!添加联系方式以免受骗。
  • 原创转载:https://www.playezu.com/251056.html
    转载说明: 点我前往阅读>>>
    • 五〇九八六二九四
      五〇九八六二九四 9

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

    匿名

    发表评论

    匿名网友
    确定