JUnit基础

什么是JUnit

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

为什么要用JUnit

  • 写了个类,要给别人用。
  • 别人用了你的类,出错了,是他的错还是你的错?
  • 类会不会有bug,测试一下。

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

  • 那用main()去测试好不好?
  • 多个方法都要测试,写在main()里太混乱。
  • 大多数情况下需要人为的观察输出结果。
  • 《现代软件工程》课上讲到:
  • 开发优质代码的时间和开发劣质代码的时间一样。
  • 好的开发者从编写一开始就不会写出难堪代码。

测试通常命名规范

  • 类放在test文件夹中
  • 测试类:xxxxTest (例 demoTest ,demo即为原类名,Test作为后缀)
  • 测试类里的测试方法:testxxxxx (例 testAdd ,add即为原方法名,test作为前缀)
  • 通常来说原类和测试类层级对应

快速生成测试用例

  • 首先你拥有一段待测试的类代码
  • 在那个.java文件右击,新建JUnit Test Case
  • 参考图片后 点击下一步
  • 选中需要测试的方法,点击完成
  • 询问是否添加JUnit库,选择是就好了
  • 至此Test类便生成了
//静态引入了Junit的断言
import static org.junit.Assert.*;
//引入了注解@Test,可以让每一个带有此注解的test方法执行测试用例
import org.junit.Test;
//默认生成的一个测试用例
@Test
public void testAdd() {
    fail("尚未实现");
}
  • 现在可以尝试执行测试用例了

简单编写测试用例

  • 方法 assertEquals([String] , expected , actual)
  • assert:断言。
  • assertEquals:判断expected(期望内容)和actual(实际内容)是否相等。
  • [String]:可选参数,输入一段文字,若错误,将会在发生错误时报告这个消息。
  • expected / actual:类型除数组外随意,但二者类型需一样。
  • 更多方法可以查阅api说明文档或查看jar包。
  • 第一个测试用例
@Test
public void testAdd() {
    assertEquals(7, new simpleCalcuate().add(2, 5));
}
  • 运行测试通过
  • 运行次数:测试用例个数。
  • 错误次数:报错。
  • 故障次数:断言不通过。

常用注解

  • @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。
  • 但是Eclipse引入的Hamcrest仅仅是core(核心部分),即没有这个core包,JUnit不能正常工作。
  • 因此我们需要去官网下载完整的Hamcrest.jar和Junit4.jar,添加构建进当前项目并移除上述图中的JUnit4(避免产生冲突)。下图是我已经提前将这俩jar包构建了用户库进行加入。
  • 方法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());
}

补充

  • 运行测试用例
  • 运行单一测试用例:双击方法名,右击运行。
  • 运行所有测试类的全部方法:在任意地方右击,运行配置,选择所有,运行。

  • 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的新特性我们开发者更需要掌握。