junit - lixidaydayup/plan GitHub Wiki

单元测试

什么是单元测试

我们的程序大体上分为N个模块,模块是一种功能的概念,比如”登录模块”,“商品列表”,“商品详情”等等,然后某个模块都包括一些细分的功能,比如某个函数,“当输入为lixi的时候 返回:用户存在 输入为huhaonan的时候 返回:用户不存在”。 这是一个非常细小的功能。针对这种细小的函数进行的测试就叫做“单元测试”,否则叫做“集成测试”,其他的还有“回归测试”等等,你要自己复习一下。

怎么做单元测试

单元测试的目的,就是要保证你的这个小函数,永远是正确的,单元测试要一直试图使用各种方式,让你的程序出问题,比如该输入用户名的时候,给你传一个null,应该要输入字母的地方给你输入一个数字,等等。在这种健壮的考验下面,你的函数,在遇到任何问题的时候,都能很好地处理,表现得跟你预期一样。所以,单元测试的方式就是“用各种不同的输入case,包括good case(你本来期望的输入参数) 和 bad case (你并不期望的输入参数,为空,为乱码,为中文等等), 然后期待程序在 good case下面输出正确的结果,在bad case下面能很好的处理异常,不至于程序挂掉。

junit是什么

junit是一个可以帮助java开发人员简易地编写单元测试的框架,在它的帮助下面,可以很容易地,很自由地编写单元测试

单元测试的核心-断言

单元测试最核心的地方就是断言,断言就是告诉程序,这个地方我期望的结果,是比如A.equals(B).如果不是的话,请报错,告诉我单元测试失败了。 具体的断言包括

assertEquals(A, B); // A要跟B相等
assertTrue(person.getName().equals("lixi")) // 这个括号里面的一定要是true
assertNotNull(person); // 这个对象不能为null

jUnit例子

比如我们现在有这么一个函数

   public String getName(Person person) {
      return person.getName();
   }

针对这个函数,我们首先看到,调用了person.getName(),但是并没有测试person到底是不是null。根据这个我们可以构造bad case。然后这个函数的作用是返回person的那么属性,那么我们需要构造一个good case,是说,假如我传入了一个name叫"lixi"的person对象进去,输入的String一定要等于"lixi",所以我们会编写2个TestCase

  1. good case
   @Test
   public void testGoodCase() {
      Person p = new Person();
      p.setName("lixi");
      String yourName = getName(p);
      assertEquals(yourName, "lixi");
   }
  1. bad case
   @Test
   public void testBadCase() {
      Person p = null;
      assertNotNull(getName(p)); // 这里就会报错,因为我们的程序没有判断是否是null
   }

很显然,good case是一定可以通过的,但是bad case,注意到我们传入了一个null,在调用getName的时候一定会抛异常,这样就过不了了。那我们就必须去改进我们的程序,可以处理这种null的问题,改进如下:

   public String getName(Person person) {
      // 如果是null 那么直接返回空白字符串
      if(person == null) {
          return "";
      }
      return person.getName();
   }
⚠️ **GitHub.com Fallback** ⚠️