📜  junit.jupiter 创建测试 - Java (1)

📅  最后修改于: 2023-12-03 14:43:37.154000             🧑  作者: Mango

JUnit Jupiter 创建测试 - Java

JUnit Jupiter 是JUnit 5.x版本中的测试引擎,它提供了不同于之前版本的一些新特性,例如参数化测试和测试生命周期回调注解。

在本文中,我们将简单介绍JUnit Jupiter的使用及其创建测试的方法。

依赖

首先,我们需要在我们的项目中添加JUnit Jupiter依赖。

Gradle:

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter:5.7.2'
}

Maven:

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.7.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>
创建测试类

为了创建测试类,请先新建一个类,然后将其注释为 @Test

import org.junit.jupiter.api.Test;

class MyTests {

    @Test
    void firstTest() {
        // test code goes here
    }

}

这里的 @Test 是JUnit Jupiter中的注解,指示该方法是一个测试方法。

断言

测试中最重要的功能之一是断言。JUnit Jupiter提供了多种断言方法,可以验证代码是否按预期运行。

以下是JUnit Jupiter中的一些常见断言方法:

  • assertTrue:验证条件为真。
  • assertFalse:验证条件为假。
  • assertEquals:验证期望值与实际值相等。
  • assertNotEquals:验证期望值与实际值不相等。
  • assertNull:验证对象为 null
  • assertNotNull:验证对象不为 null

例如:

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

class MyTests {

    @Test
    void test() {
        assertEquals(2, 1 + 1);
        assertTrue(true);
    }

}

这个例子使用 assertEquals 验证 1+1 是否等于 2,使用 assertTrue 验证 true 是否为真。

参数化测试

JUnit Jupiter中的参数化测试使我们可以使用不同的参数运行相同的测试用例,测试代码只需要实现一次即可。

以下是如何编写参数化测试的示例:

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import static org.junit.jupiter.api.Assertions.*;

class MyParamsTests {

    static Stream<String> strings() {
        return Stream.of("foo", "bar");
    }

    @ParameterizedTest
    @MethodSource("strings")
    void testWithMethodSource(String argument) {
        assertNotNull(argument);
    }

}

在此示例中,MethodSource 注解指示代表参数值的静态方法 strings() 在方法调用期间被检测,返回一个字符串流,并用它作为参数执行测试方法。

生命周期回调

JUnit Jupiter提供了测试生命周期回调注解,它们将测试用例分成生命周期阶段,并允许在测试用例执行期间重写其中某些方法以获取更好的控制。

JUnit Jupiter中的生命周期回调注解如下:

  • @BeforeEach: 还原数据
  • @AfterEach: 做一些清理工作
  • @BeforeAll: 在整个测试类开始之前运行
  • @AfterAll: 在整个测试类完成后运行

例如:

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

class MyLifecycleTests {

    @BeforeAll
    static void initAll() {
        System.out.println("initAll()");
    }

    @BeforeEach
    void init() {
        System.out.println("init()");
    }

    @Test
    void succeedingTest() {
        System.out.println("succeedingTest()");
    }

    @Test
    void failingTest() {
        System.out.println("failingTest()");
        fail("a failing test");
    }

    @AfterEach
    void tearDown() {
        System.out.println("tearDown()");
    }

    @AfterAll
    static void tearDownAll() {
        System.out.println("tearDownAll()");
    }

}

在此示例中,@BeforeAll 注解指示 initAll() 静态方法在所有测试方法之前执行,@BeforeEach 注解指示 init() 方法在每个测试方法之前运行。

更多内容请参考JUnit JupiterUser Guide