51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 973|回复: 1
打印 上一主题 下一主题

[原创] 分享Junit 单元测试要义

[复制链接]
  • TA的每日心情
    无聊
    5 天前
  • 签到天数: 1050 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2022-12-23 13:34:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    一、单元测试
      单元测试是针对最小的功能单元编写的测试代码,对于[url=]Java[/url]来说最小的功能单元是方法,因此单元测试对于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);
          }
      }



    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

  • TA的每日心情

    2024-5-20 21:29
  • 签到天数: 996 天

    连续签到: 1 天

    [LV.10]测试总司令

    2#
    发表于 2022-12-23 20:36:10 | 只看该作者
    单元测试确实有好处。自己自信满满地修改了原方法,原因没啥问题。
    到单元测试就挂了,发现自己修改的地方对既存处理产生了影响。
    这时感叹呐,单元测试价值出来了。虽然写单元测试很痛苦。
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-26 02:33 , Processed in 0.061616 second(s), 25 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表