Java中的JUnit单元测试
Java原生并没有提供单元测试的方法,一般的简单测试使用main
方法进行测试,但是如果对于复杂的测试,则需要使用第三方框架来实现,例如JUnit
框架
JUnit5 的组成:JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
JUnit5 建议使用 Java8 及以上版本
- JUnit Platform 是在 JVM 上启动测试框架的基础,它定义了
TestEngine
在平台运行的新测试框架的 API - JUnit Jupiter 它用于编写测试代码的新的编程和扩展模型。它具有所有新的 Junit 注释和
TestEngine
实现来运行这些注释编写的测试。 - JUnit Vintage JUnit4 已经存在了很长时间,并且有许多以 JUnit4 编写的测试。JUnit Jupiter 还需要支持这些测试。为此,开发了 JUnit Vintage 子项目。提供了一个测试引擎,用于在平台上运行基于 JUnit 3 和 JUnit 4 的测试。它要求 JUnit 4.12 或更高版本出现在类路径或模块路径中。从它的名字 Vintage(古老的)中也能有所体会。
4和5的区别
JUnit4
@Test
的包是org.junit.Test
- 需要
@RunWith(SpringRunner.class)
- 测试类和测试方法需要
public
修饰
JUnit5
@Test
的包是org.junit.jupiter.api.Test
- 不需要
@RunWith(SpringRunner.class)
- 测试类和测试方法不需要
public
修饰
SE项目不同IDE的使用
-
Eclipse
- 选中当前工程,右键选择:
build path - add libraries - JUnit 4 - 下一步
- 创建Java类,进行单元测试。
- 此类中声明单元测试方法。
- 此单元测试方法上需要声明注解:
@Test
,并在单元测试类中导入:import org.junit.Test;
- 声明好单元测试方法以后,就可以在方法体内测试相关的代码。
- 写完代码以后,左键双击单元测试方法名,右键:
run as - JUnit Test
- 选中当前工程,右键选择:
-
IDEA
-
在代码空白位置右键,Generate,Test
Testing library
选择Junit版本Class name
输入测试类名称Destination packages
选择测试类的包Member
选择要要测试的方法
-
OK
-
注解
Annotations | 描述 |
---|---|
@BeforeEach | 在方法上注解,在每个测试方法运行之前执行。 |
@AfterEach | 在方法上注解,在每个测试方法运行之后执行 |
@BeforeAll | 该注解方法会在所有测试方法之前运行,该方法必须是静态的。 |
@AfterAll | 该注解方法会在所有测试方法之后运行,该方法必须是静态的。 |
@Test | 用于将方法标记为测试方法 |
@DisplayName | 用于为测试类或测试方法提供任何自定义显示名称 |
@Disable | 用于禁用或忽略测试类或方法 |
@Nested | 用于创建嵌套测试类 |
@Tag | 用于测试发现或过滤的标签来标记测试方法或类 |
@TestFactory | 标记一种方法是动态测试的测试工场 |
常用测试方式
普通测试
@Test
void testDemo() {
}
重复性测试
@RepeatedTest(5)
void testDemo(TestInfo testInfo,RepetitionInfo repetitionInfo){
System.out.println("repeat:" + testInfo.getDisplayName());
System.out.println("这是第 "+ repetitionInfo.getCurrentRepetition()+ "次重复");
}
参数测试
@ParameterizedTest
@ValueSource(strings = {"java", "python", "go"})
void testDemo(String candidate) {
assertTrue(candidate.contains("o"));
}
超时测试
@Test
@Timeout(value = 500, unit = TimeUnit.MILLISECONDS)
void testDemo() {
// fails if execution time exceeds 500 milliseconds
}