JUnit5单元测试框架的使用教程与简单实例

1、JUnit5的使用教程

1.1 简介

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 。

1.2 安装

这里使用Maven进行安装,pom.xml配置文件如下:

<dependencies>
    <!-- JUnit5单元测试框架 -->
    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-launcher</artifactId>
        <version>1.6.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.6.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
        <version>5.6.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>

1.3 JUnit5注解

所有支持的注解都在包 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 用于注册自定义扩展。

1.4 JUnit5与JUnit4注释的比较

两个版本中的大多数注释都是相同的,但很少有区别。这是一个快速比较。

特征 JUNIT4 JUNIT5
声明一种测试方法。 @Test @Test
在当前类中的所有测试方法之前执行。 @BeforeClass @BeforeAll
在当前类中的所有测试方法之后执行。 @AfterClass @AfterAll
在每个测试方法之前执行。 @Before @BeforeEach
每种测试方法后执行。 @After @AfterEach
禁用测试方法/类。 @Ignore @Disabled
测试工厂进行动态测试。 NA @TestFactory
嵌套测试。 NA @Nested
标记和过滤。 @Category @Tag
注册自定义扩展。 NA @ExtendWith

1.5 JUnit5断言(Assertions类)

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入门系列教程》(作者:叶止水)。

2、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>
            <version>1.6.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.6.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
            <version>5.6.0</version>
            <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.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

/**
 * 使用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);
    }
}

执行结果:

发布了357 篇原创文章 · 获赞 210 · 访问量 166万+

猜你喜欢

转载自blog.csdn.net/pan_junbiao/article/details/104296855