IDEA中使用JUnit5(单元测试框架)

JUnit单元测试框架由Erich Gamma和Kent Beck编写的一个回归测试框架(Regresion Testing Framework),主要用于Java语言程序的单元测试,目前使用的主流版本是JUnit以上版本。

安装JUnit5累(IDEA)

以一个简单的程序为例:

public class Main {
    public static long fact(long n) {//实现阶乘
        long r = 1;
        for (long i = 1; i <= n; i++) {
            r = r * i;
        }
        return r;
    }
}

1.点击类名,并且点击Generate,再选择Test

2.可能会出现以下情况,点击Fix,IDEA帮助你下载好JUnit5(点击OK就行)

3.以后出现就是这样的 选择自己需要进行测试的方法打勾(可以将setup 和tearDown打上勾)

一个测试类中只能声明此注解一次,此注解对应的方法只能被执行一次

@BeforeClass 使用此注解的方法在测试类被调用之前执行

@AfterClass 使用此注解的方法在测试类被调用结束退出之前执行

一个类中有多少个@Test注解方法,以下对应注解方法就被调用多少次

@Before 在每个@Test调用之前执行

@After 在每个@Test调用之后执行(一般用于初始化或者清除)

@Test 使用此注解的方法为一个单元测试用例,一个测试类中可多次声明,每个注解为@Test只执行一次

@Ignore 暂不执行的测试用例,会被JUnit4忽略执行

4.会自动生成

内容如下:(testFact()里面的内容是自己写的测试程序)

然后我们可以直接点击testFact(),右键直接运行,看输出效果就行。

核心测试方法testFact()加上了@Test注解,这是JUnit要求的,它会把带有@Test的方法识别为测试方法。在测试方法内部,我们用assertEquals(1, Factorial.fact(1))表示,期望Factorial.fact(1)返回1assertEquals(expected, actual)是最常用的测试方法,它在Assertion类中定义。Assertion还定义了其他断言方法,例如:

  • assertTrue(): 期待结果为true

  • assertFalse(): 期待结果为false

  • assertNotNull(): 期待结果为非null

  • assertArrayEquals(): 期待结果为数组并与期望数组每个元素的值均相等

单元测试的好处

单元测试可以确保单个方法按照正确预期运行,如果修改了某个方法的代码,只需确保其对应的单元测试通过,即可认为改动正确。此外,测试代码本身就可以作为示例代码,用来演示如何调用该方法。

使用JUnit进行单元测试,我们可以使用断言(Assertion)来测试期望结果,可以方便地组织和运行测试,并方便地查看测试结果。此外,JUnit既可以直接在IDE中运行,也可以方便地集成到Maven这些自动化工具中运行。

在编写单元测试的时候,我们要遵循一定的规范:

一是单元测试代码本身必须非常简单,能一下看明白,决不能再为测试代码编写测试;

二是每个单元测试应当互相独立,不依赖运行的顺序;

三是测试时不但要覆盖常用测试用例,还要特别注意测试边界条件,例如输入为0null,空字符串""等情况。

下面解释一下@Before 在每个@Test调用之前执行 和 @After 在每个@Test调用之后执行的用途

JUnit提供了编写测试前准备、测试后清理的固定代码,称之为Fixture。(新建立一个.java)

public class Calculator {
    private long n = 0;

    public long add(long x) {
        n = n + x;
        return n;
    }

    public long sub(long x) {
        n = n - x;
        return n;
    }
}

将Before和After前面的勾都选择上,然后写上自己的测试程序。

public class CalculatorTest {

    Calculator calculator;

    @BeforeEach
    public void setUp() {
        this.calculator = new Calculator();
    }

    @AfterEach
    public void tearDown() {
        this.calculator = null;
    }

    @Test
    void testAdd() {
        assertEquals(100, this.calculator.add(100));
        assertEquals(150, this.calculator.add(50));
        assertEquals(130, this.calculator.add(-20));
    }

    @Test
    void testSub() {
        assertEquals(-100, this.calculator.sub(100));
        assertEquals(-150, this.calculator.sub(50));
        assertEquals(-130, this.calculator.sub(-20));
    }
}

有两个标记为@BeforeEach@AfterEach的方法,它们会在运行每个@Test方法前后自动运行,通过@BeforeEach来初始化,通过@AfterEach来清理资源,称之为Fixture。

上面的测试代码在JUnit中运行顺序如下:

for (Method testMethod : findTestMethods(CalculatorTest.class)) {
    var test = new CalculatorTest(); // 创建Test实例
    invokeBeforeEach(test);
        invokeTestMethod(test, testMethod);
    invokeAfterEach(test);
}

//可见,@BeforeEach和@AfterEach会“环绕”在每个@Test方法前后。

JUnit还提供了@BeforeAll@AfterAll,它们在运行所有@Test前后运行,顺序如下:(一般用于初始化和清理一些比较繁琐的资源)(了解)

invokeBeforeAll(CalculatorTest.class);
for (Method testMethod : findTestMethods(CalculatorTest.class)) {
    var test = new CalculatorTest(); // 创建Test实例
    invokeBeforeEach(test);
        invokeTestMethod(test, testMethod);
    invokeAfterEach(test);
}
invokeAfterAll(CalculatorTest.class);

因为@BeforeAll@AfterAll在所有@Test方法运行前后仅运行一次,因此,它们只能初始化静态变量,例如:

public class DatabaseTest {
    static Database db;

    @BeforeAll
    public static void initDatabase() {
        db = createDb(...);
    }
    
    @AfterAll
    public static void dropDatabase() {
        ...
    }
}

总结:

  1. 对于实例变量,在@BeforeEach中初始化,在@AfterEach中清理,它们在各个@Test方法中互不影响,因为是不同的实例;

  2. 对于静态变量,在@BeforeAll中初始化,在@AfterAll中清理,它们在各个@Test方法中均是唯一实例,会影响各个@Test方法。

  3. 注意到每次运行一个@Test方法前,JUnit首先创建一个XxxTest实例,因此,每个@Test方法内部的成员变量都是独立的,不能也无法把成员变量的状态从一个@Test方法带到另一个@Test方法。

### 配置和使用 JUnit 5 进行单元测试 #### 安装必要的插件和支持 为了能够在 IntelliJ IDEA 中顺利使用 JUnit 5,需要安装相应的支持工具。这可以通过访问官方资源来完成,例如直接在官网下载对应版本的插件[^1]。 对于具体操作,在 **Settings -> Plugins -> Marketplace** 中可以找到并安装 JUnit 插件,之后应用更改并重启 IDE 来使新安装生效[^2]。 #### 添加依赖项到项目中 确保项目的构建配置文件包含了对 JUnit 5 的依赖声明。如果采用 Maven 或 Gradle 构建,则应在 `pom.xml` 或 `build.gradle` 文件内加入合适的库引用: 对于 Maven 用户来说,应该向 `pom.xml` 增加如下片段: ```xml <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.x.x</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.x.x</version> <scope>test</scope> </dependency> ``` 而对于 Gradle 用户而言,需编辑 `build.gradle` 如下所示: ```groovy dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-api:5.x.x' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.x.x' } ``` 请注意替换上述代码中的 `5.x.x` 版本号为实际使用的稳定版次。 #### 创建测试类与方法 创建一个新的 Java 测试源根目录(通常是 `src/test/java`),然后在此处定义带有 `@Test` 注解的方法来进行功能验证。当利用特定快捷方式组合如 Alt+Insert 自动生成测试结构时,可指定生成 `.java` 文件的位置[^3]。 编写简单的例子展示如何标记一个基本测试函数: ```java import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class ExampleTests { @Test void shouldReturnTrueWhenConditionMet() { assertTrue(true); } } ``` #### 执行单元测试 一旦完成了以上准备工作,就可以右键单击任意测试类或单独的方法执行它们。IDEA 将自动检测已注册的运行器,并提供选项以图形界面形式查看结果统计以及失败详情报告。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值