Junit 单元测试要义总结

发表于:2022-12-23 09:22

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:抓住小白白    来源:CSDN

  一、单元测试
  单元测试是针对最小的功能单元编写的测试代码,对于Java来说最小的功能单元是方法,因此单元测试对于Java 来说就是针对单个Java方法的测试。
  单元测试测试的基本思路是TDD(Test-Driven Development)测试驱动开发,通过测试驱动开发,提升开发质量。
  单元测试的好处:
  1、确保单个方法运行正常;
  2、修改方法的代码后,单元测试可以快速自测;
  3、可以自动化运行所有单元测试并获得报告;
  4、单元测试代码可以直接用来演示方法的调用和执行;
  二、Junit
  Junit 当前版本:3.x / 4.x / 5.x
  待测试的类及方法:
  public class Calculator{
      public int calculate(String expression){
          String[] ss = expression.split("\\+");
          System.out.println(expression + " -> " + Arrays.toString(ss))
          int sum = 0;
          for(String s : ss){
              sum = sum + Integer.parseInt(s);
          }
          return sum;
      }
  }
  测试类及方法:
  public class CalculatorTest{
      @Test
      public void testCalculate(){
          /*当未实现单元测试内容时,需要写fail 这样运行到这里的时候会执行失败,可以通过这种方式提示用户实现该单元测试内容
          fail("Not yet implemented"); */
      }
      @Test
      public void testCalculate(){
          /*测试列举执行场景*/
          assertEquals(3,new Calculator.calculate("1+2"));
          assertEquals(6,new Calculator.calculate("1+2+3"));
          assertEquals(35,new Calculator.calculate("12+23"));
      }
      @Test
      public void testCalculate(){
          /*测试执行异常输入场景,帮助方法编写考虑异常场景,实现测试驱动开发*/
          assertEquals(3,new Calculator.calculate("1 +2"));
      }
  }
  常用断言:
  注意:
  1、Junit 使用Assert 断言测试结果(浮点数assertEquals要制定delta);
  2、每个测试方法必须完全独立;
  3、测试代码必须非常简单;
  4、不能为测试代码再编写测试;
  5、方法输入场景考虑需要全面,才能起到单测效果。
  三、常用注解
  以上注解Junit 执行逻辑:
  invokeBeforeClass(CalculatorTest.class); //@BeforeClass
  for(Method testMethod : findTestMethods(CalculatorTest.class)){
      CalculatorTest test = new CalculatorTest(); //new 
      test.setUp(); //@Before
      testMethod.invoke(test);//@Test
      test.tearDown();@After
  }
  invokeAfterClass(CalculatorTest.class);//@AfterClass
  四、异常测试
  /*测试代码执行若抛出 NumberFormatException 则测试通过;若抛出其他异常或者没有抛出异常,则测试不通过*/
  @Test(expected = NumberFormatException.class)
  public void testNumberFormatException(){
      Integer.parseInt(null);
  }
  五、参数化测试
  若待测试的输入和输出是一组数据
  1、可以把测试数据组织起来;
  2、用不同的测试数据调用相同的测试方法。
  @RunWith(Parameterized.class)
  public class AbsTest{
      @Parameters
      public static Collection<?> data(){
          return Arrays asList(new Object[][]{{0,0},{1,1},{-1,1}});
      }
      int input ;
      int expected;
      public AbsTest(int input,int expected){
          this.input = input;
          this.expected = expected;
      }
      @Test
      public void testAbs(){
          int r = Math.abs(this.input);
          assertEquals(this.expected, r);
      }
  }
  参数必须由静态方法data() 返回,返回类型为Collection<Object[]>静态方法必须标记为@Parameters 测试类必须标记为@RunWith(Parameterized.class) ,构造方法参数必须和测试参数对应。
  六、超时测试
  public class PItest{
      PI pi = new PI();
      /*timeout时间单位为毫秒,如下含义为不超过1000ms的情况的下,测试通过*/
      @Test(timeout=1000)
      public void testTimeout(){
          /*计算pi到展开项的第1000个*/
          double r = pi.calculate(1000);
          assertEquals(3.14, r , 0.01);
      }
  }
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号