赞
踩
JUnit是一个Java语言的单元测试框架。它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个。 JUnit有它自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。
JUnit5旨在调整java8样式的编码,并且比JUnit4更强大和灵活。
什么是Junit5
JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
这看上去比Junit4 复杂,实际上在导入包时也会复杂一些。
JUnit Platform:是在JVM上启动测试框架的基础。
JUnit Jupiter:是JUnit5扩展的新的编程模型和扩展模型,用来编写测试用例。Jupiter子项目为在平台上运行Jupiter的测试提供了一个TestEngine (测试引擎)。
JUnit Vintage:提供了一个在平台上运行JUnit 3和JUnit 4的TestEngine 。
这里使用Maven进行安装,pom.xml配置文件如下:
- <dependencies>
- <!-- JUnit5单元测试框架 -->
- <dependency>
- <groupId>org.junit.platform</groupId>
- <artifactId>junit-platform-launcher</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.junit.jupiter</groupId>
- <artifactId>junit-jupiter-engine</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.junit.vintage</groupId>
- <artifactId>junit-vintage-engine</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
所有支持的注解都在包 org.junit.jupiter.api 下;
使用@Test、@TestTemplate、@RepeatedTest、@BeforeAll、@AfterAll、@BeforeEach或@AfterEach注释的方法不能返回值。
注解 | 说明 |
---|---|
@Test | 表示方法是测试方法。与JUnit 4的@Test注释不同,这个注释不声明任何属性,因为JUnit Jupiter中的测试扩展基于它们自己的专用注释进行操作。 |
@ParameterizedTest | 表示方法是参数化测试。 |
@RepeatedTest | 表示方法是重复测试的测试模板。 |
@TestFactory | 表示方法是动态测试的测试工厂。 |
@TestInstance | 用于为带注释的测试类配置测试实例生命周期。 |
@TestTemplate | 表示方法是为测试用例设计的模板,根据注册提供程序返回的调用上下文的数量进行多次调用。 |
@DisplayName | 声明测试类或测试方法的自定义显示名称。 |
@BeforeEach | 表示在当前类中每个@Test、@RepeatedTest、@ParameterizedTest或@TestFactory方法之前执行注释的方法;类似于JUnit 4的@Before。 |
@AfterEach | 表示在当前类中的每个@Test、@RepeatedTest、@ParameterizedTest或@TestFactory方法之后,都应该执行带注释的方法;类似于JUnit 4的@After。 |
@BeforeAll | 表示应在当前类中的所有@Test、@RepeatedTest、@ParameterizedTest和@TestFactory方法之前执行带注释的方法;类似于JUnit 4的@BeforeClass。 |
@AfterAll | 表示在当前类中,所有@Test、@RepeatedTest、@ParameterizedTest和@TestFactory方法都应该执行注释的方法;类似于JUnit 4的@AfterClass。 |
@Nested | 表示带注释的类是一个嵌套的、非静态的测试类。@BeforeAll和@AfterAll方法不能直接在 @Nested 测试类中使用,除非使用“每个类”测试实例生命周期。 |
@Tag | 用于在类或方法级别声明过滤测试的标记;类似于TestNG中的测试组或JUnit 4中的类别。 |
@Disabled | 用于禁用测试类或测试方法;类似于JUnit 4的@Ignore。 |
@ExtendWith | 用于注册自定义扩展。 |
两个版本中的大多数注释都是相同的,但很少有区别。这是一个快速比较。
特征 | JUNIT4 | JUNIT5 |
---|---|---|
声明一种测试方法。 | @Test | @Test |
在当前类中的所有测试方法之前执行。 | @BeforeClass | @BeforeAll |
在当前类中的所有测试方法之后执行。 | @AfterClass | @AfterAll |
在每个测试方法之前执行。 | @Before | @BeforeEach |
每种测试方法后执行。 | @After | @AfterEach |
禁用测试方法/类。 | @Ignore | @Disabled |
测试工厂进行动态测试。 | NA | @TestFactory |
嵌套测试。 | NA | @Nested |
标记和过滤。 | @Category | @Tag |
注册自定义扩展。 | NA | @ExtendWith |
JUnit Jupiter附带了许多JUnit 4拥有的断言方法,并添加了一些可以很好地用于Java 8 lambdas的断言方法。
所有JUnit5断言都是 org.junit.jupiter.api.Assertions 中的静态方法断言类。
Asser类中主要方法如下:
方法名称 | 方法描述 |
---|---|
assertEquals | 断言传入的预期值与实际值是相等的。 |
assertNotEquals | 断言传入的预期值与实际值是不相等的。 |
assertArayEquals | 断言传入的预期数组与实际数组是相等的。 |
assertNull | 断言传入的对象是为空。 |
assertNotNull | 断言传入的对象是不为空。 |
assertTrue | 断言条件为真。 |
assertFalse | 断言条件为假。 |
assertSame | 断言两个对象引用同一个对象,相当于"==”。 |
assertNotSame | 断言两个对象引用不同的对象,相当于"!=”。 |
assertThat | 断言实际值是否满足指定的条件。 |
注意:上面的每一 个方法, 都有对应的重载方法,可以在前面加一个String类型的参数,表示如果断言失败时的提示。
推荐教程:
推荐JUnit5使用教程:《JUnit5入门系列教程》(作者:叶止水)。
【实例】在IDEA开发工具中,中使用JUnit5实现一个简单的测试实例。
IDEA开发工具默认已经安装好了JUnit插件,如下图:
如果没有安装JUnit插件,请执行安装。
(1)编写pom.xml配置文件,引入JUnit5所需的jar包。
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <groupId>com.pjb.mvnbook</groupId>
- <artifactId>hello-world</artifactId>
- <version>1.0-SNAPSHOT</version>
-
- <dependencies>
- <!-- JUnit5单元测试框架 -->
- <dependency>
- <groupId>org.junit.platform</groupId>
- <artifactId>junit-platform-launcher</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.junit.jupiter</groupId>
- <artifactId>junit-jupiter-engine</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.junit.vintage</groupId>
- <artifactId>junit-vintage-engine</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
-
- </project>
(2)创建HelloWorld.java类,该类是被测试的对象。
- /**
- * 业务类
- * @author pan_junbiao
- **/
- public class HelloWorld
- {
- public String sayHello()
- {
- return "您好,欢迎访问 pan_junbiao的博客";
- }
-
- public static void main(String[] args)
- {
- System.out.println(new HelloWorld().sayHello());
- }
- }
(3)创建测试类。
创建测试类的方法一:
选择需要被测试的类,点击鼠标右键(弹出菜单)→ Go To → Test。
创建测试类的方法二:
选择需要被测试的类,使用快捷键: Ctrl + Shift + T
在弹出的Create Test窗口中,输入相关测试类信息,并勾选需要被测试的方法。
编写测试代码:
- import org.junit.jupiter.api.Test;
- import org.junit.jupiter.api.AfterEach;
- import org.junit.jupiter.api.BeforeEach;
-
- /**
- * 使用JUnit5进行测试类
- * @author pan_junbiao
- **/
- class HelloWorldTest
- {
- @BeforeEach
- void setUp()
- {
- System.out.println("@BeforeEach,测试开始");
- }
-
- @AfterEach
- void tearDown()
- {
- System.out.println("@AfterEach,测试结束");
- }
-
- @Test
- void sayHello()
- {
- HelloWorld helloWorld = new HelloWorld();
- String result = helloWorld.sayHello();
- System.out.println(result);
- assertEquals("您好,欢迎访问 pan_junbiao的博客",result);
- }
- }
执行结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。