Java单元测试 JUnit基础

JUnit基础

什么是JUnit

  • JUnit是一个Java语言的单元测试框架。
  • JUnit是用于编写和运行可重复的自动化测试的开源测试框架, 这样可以保证我们的代码按预期工作。
  • Junit测试可叫做开发者测试,因为程序员知道被测试的类方法如何完成功能和完成什么样的功能。

为什么要用JUnit

  • 写了个类,要给别人用。

    • 别人用了你的类,出错了,是他的错还是你的错?

    • 类会不会有bug,测试一下。

    (软件测试员只能测试软件上线之后功能正常否,性能达标否;但他不能测不了你的方法)

  • 那用main()去测试好不好?

    • 多个方法都要测试,写在main()里太混乱。

    • 大多数情况下需要人为的观察输出结果。

  • 《现代软件工程》课上讲到:

    • 开发优质代码的时间和开发劣质代码的时间一样。

    • 好的开发者从编写一开始就不会写出难堪代码。

测试通常命名规范

  • 类放在test文件夹中

  • 测试类:xxxxTest (例 demoTest ,demo即为原类名,Test作为后缀)

  • 测试类里的测试方法:testxxxxx (例 testAdd ,add即为原方法名,test作为前缀)

  • 通常来说原类和测试类层级对应
    image-20210508234159442

快速生成测试用例

  • 首先你拥有一段待测试的类代码

  • 在那个.java文件右击,新建JUnit Test Case

  • 参考图片后 点击下一步
    image-20210509000853909

  • 选中需要测试的方法,点击完成
    image-20210509001211528

  • 询问是否添加JUnit库,选择是就好了
    image-20210509002239355

  • 至此Test类便生成了

    • //静态引入了Junit的断言
      import static org.junit.Assert.*;
      //引入了注解@Test,可以让每一个带有此注解的test方法执行测试用例
      import org.junit.Test;
      
    • //默认生成的一个测试用例
      @Test
      public void testAdd() {
          fail("尚未实现");
      }
      
  • 现在可以尝试执行测试用例了
    image-20210509003519435

简单编写测试用例

  • 方法 assertEquals([String] , expected , actual)

    • assert:断言。

    • assertEquals:判断expected(期望内容)和actual(实际内容)是否相等。

    • [String]:可选参数,输入一段文字,若错误,将会在发生错误时报告这个消息。

    • expected / actual:类型除数组外随意,但二者类型需一样。

    • 更多方法可以查阅api说明文档或查看jar包。

  • 第一个测试用例

    • @Test
      public void testAdd() {
          assertEquals(7, new simpleCalcuate().add(2, 5));
      }
      
    • 运行测试通过
      image-20210509011600516

      • 运行次数:测试用例个数。
      • 错误次数:报错。
      • 故障次数:断言不通过。

常用注解

  • @Test:标示方法为测试用例,能够被执行。

    • @Test(timeout=XX):标示该测试用例需要在多少毫秒内完成,否则测试失败。
    • @Test(expected=xxxxx.class):例如@Test(expected = java.lang.ArithmeticException.class),标示该测试用例预期会抛出算术运算异常,若实际抛出则测试成功,若没有抛出则测试失败。
  • @Ignore:标示该方法在测试时会被忽略执行。

  • @Before:标示该方法在所有测试用例开始前要执行一次。

    static int cnt = 0;
    @Before
    public void init() {
        cnt++;
    //例如在每次执行测试用例时输出这是第几个。
    //@Before常用于初始化获取一些测试数据。
        System.out.println(cnt);
    }
    
  • @After:标示该方法在所有测试用例开始后要执行一次。

  • 更多注解可以查阅api说明文档。

Hamcrest断言

  • 什么是Hamcrest

    • Junit 自带的断言 Assert,只是基础的一些断言,如 assertTrue、assertEquals、assertNotEquals 等。如果需要值在某个区间或需满足多个匹配条件,这时便需要使用Hamcrest断言。
    • JUnit和Hamcrest是两个不同的框架即不同的东西。
    • 只不过是JUnit也使用了Hamcrest框架,所以JUnit引入时附带了Hamcrest。
      image-20210509014428106
    • 但是Eclipse引入的Hamcrest仅仅是core(核心部分),即没有这个core包,JUnit不能正常工作。
    • 因此我们需要去官网下载完整的Hamcrest.jar和Junit4.jar,添加构建进当前项目并移除上述图中的JUnit4(避免产生冲突)。下图是我已经提前将这俩jar包构建了用户库进行加入。
      image-20210509015833051
  • 方法assertThat([String], actual, matcher)

    • assertThat:判断actual(实际内容)matcher(匹配)是否相等。
    • [String]:可选参数,输入一段文字,若错误,将会在发生错误时报告这个消息。
    • matcher:Hamcrest提供了一套匹配符Matcher,这些匹配符更接近自然语言,可读性高,更加灵活。
  • 优化后的测试用例

    • @Test
      public void testAdd() {
          assertThat(new simpleCalcuate().add(2, 5), is(7));
          assertThat(new simpleCalcuate().add(2, 5), allOf(greaterThan(0), lessThan(20)));
      }
      
    • @Test
      public void testGetName() {
          assertThat(new otherExample().getName(), containsString("xes"));
      }
      
    • @Test
      public void testGetCon() {
          Connection con = new otherExample().getCon();
          System.out.println(con);
          assertThat(con,notNullValue());
      }
      

补充

  • 运行测试用例

    • 运行单一测试用例:双击方法名,右击运行。
      image-20210509022954717
      image-20210509023032263

    • 运行所有测试类的全部方法:在任意地方右击,运行配置,选择所有,运行。
      image-20210509023209902
      image-20210509023601831
      image-20210509023656815

  • JUnit还可以实现更多的诸如参数化测试、测试套件运行器等应用,可以自行查阅网络资料学习了解。

  • JUnit当然是用Java写的,所以它只适用于Java单元测试。但是 其他语言也有类似的一大批工具,例如NUnit (针对.Net 平台) , CUnit (针对C语言) , CppUnit(针对C++语言), PyUnit (针对Python), PHPUnit (针对PHP)等。

  • JUnit5兼容Junit4,JUnit5已经发布许久,但它也相对复杂,它有着更多的测试方式,更少的其他库的依赖。JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage。学会了JUnit基础后,JUnit5的新特性我们开发者更需要掌握。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值