上一章我们分享了“使用JUnit、AssertJ和Mockito编写单元测试需要准备好的开发环境”。这一章我们来讲讲“什么是JUnit”。
Never in the field of software development was so much owed by so many to so few lines of code.
软件开发史上从未有过如此少量的代码对如此广阔的领域产生了如此巨大的作用。
--Martin Fowler
1997年,Eric Gamma(设计模式“四人帮”之一,Eclipse之父)和Kent Beck(极限编程方法学创始人)在从瑞士苏黎世飞往美国亚特兰大的飞机上偶遇,因为长路漫漫无心睡眠,两个人就进行结对编程,在下飞机之前完成了JUnit这个测试框架的第一个版本。此后,JUnit迅速传播,成为几乎每个Java项目的标配。
JUnit超级流行,是事实上的Java 单元测试和TDD的工具标准。有人在2016年选择了GitHub上最流行的3862个Java项目,找出了最常用的100个组件,可以看到JUnit 以63%的采用率遥遥领先于其他的组件:
知名的项目都有很高的单元测试覆盖率。而JUnit是Java领域单元测试的事实上的标准。另一个可以与JUnit抗衡的测试框架是TestNG,但只有不到10%的采用率。
JUnit 概述
JUnit是事实上的Java测试框架标准。至今JUnit已经发布了第5个版本。与以前的版本相比,JUnit5作出了大量的改进。本教程也是以版本5为基准介绍JUnit的使用。
JUnit 5需要JDK 8.0以上版本。
1. JUnit 5的组成
JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
JUnit 5主要由三大部分组成:
- JUnit Platform:为在JVM上启动测试框架提供基础。它还定义了TestEngine API, 用来开发在平台上运行的测试框架。此外,该平台还提供了一个用于从命令行启动该平台的控制台启动器和一个基于JUnit 4的运行器,用于在基于JUnit 4的环境中在该平台上运行任何TestEngine。它也为流行的IDE(IntelliJ IDEA、Eclipse、NetBeans、Visual Studio Code等)和构建工具(Gradle、Maven、Ant等)提供了一级的支持。
- JUnit Jupiter:是在JUnit 5中编写测试和扩展的新型编程模型[扩展模型的组合。Jupiter子项目提供了用于在平台上运行基于Jupiter的测试的
TestEngine
。 - JUnit Vintage:提供用于在平台上运行基于JUnit 3和JUnit 4的测试的
TestEngine
。
如果我们不需要和JUnit版本3或者4兼容,就不需要JUnit Vintage。
下面是JUnit 5的模块依赖关系图:
2. 测试类与测试方法
测试类
是同时符合下述条件的类:
- 至少包含一个
测试方法。
- 是顶层类、静态成员类或标记为@Nested的成员类。
- 不是抽象类。
- 不是private类。
- 只有一个构造函数。构造函数一般没有参数。特殊情况下有参数(后面的章节会谈到这个)。
测试方法
是同时符合下述条件的方法:
- 被注解或元注解为@Test
,
@RepeatedTest,
@ParameterizedTest,
@TestFactory, @TestTemplate之一。 - 是实例方法,不是静态方法。
- 不是抽象方法。
- 不是private方法。
- 没有返回值。
- 一般没有参数。特殊情况下有参数(后面的章节会谈到这个)。
- 可以抛出任何异常。
测试类可以从超类或接口上继承测试方法。