Java学习第十六部分——JUnit框架

目录

一.概述

二.作用

三.版本

四.优势

五.局限性

六.发展方向

七.核心组件

[1 测试用例](#1 测试用例)

2.断言(Assertions)

3.测试生命周期

4.测试运行器

八.简单示例

[九.JUnit 4 与 JUnit 5 的区别](#九.JUnit 4 与 JUnit 5 的区别)

十.idea项目实战

1.在idea中创建Java项目,注意选择"Maven"

2.将"pom.xml"文件内容替换成下面内容

3.重新加载Maven项目,直到不再报错​

4.按下图创建对应项目和Java类文件

5.两个Java类文件代码内容如下,替换即可

6.运行测试类,结果如下​编辑

7.代码解释如下


一.概述

JUnit 是一个用于 Java 语言的单元测试框架,它在软件开发中被广泛用于编写和运行可重复的测试代码。

二.作用

JUnit 主要用于单元测试,即对程序中的最小可测试部分(通常是方法)进行测试。它有如下作用:
- **验证代码的正确性**: 通过编写测试用例,确保代码的功能符合预期。
- **提高代码质量**: 通过测试发现潜在的错误和漏洞。
- **支持敏捷开发**: 在持续集成和持续交付(CI/CD)中,JUnit 测试可以快速反馈代码问题,帮助团队快速迭代。
**- **降低维护成本**:**当代码修改后,通过运行测试用例可以快速发现是否引入了新的问题。

三.版本

JUnit 有多个版本,目前最常用的是 JUnit 4 和 JUnit 5:
- **JUnit 4**: 广泛使用注解(如`@Test`、`@Before`、`@After`等),是 Java 开发中常用的版本。
**- **JUnit 5**:**是 JUnit 的最新版本,引入了新的注解和扩展机制,提供了更好的模块化支持和更灵活的测试生命周期管理。

四.优势

- **简单易用**: 提供了丰富的注解和断言方法,易于上手。
- **集成性强**: 与大多数 Java IDE 和构建工具(如 Maven、Gradle)无缝集成。
**- **可扩展性**:**支持自定义扩展,可以满足复杂的测试需求。

五.局限性

- **仅支持单元测试**: 对于集成测试和端到端测试,需要结合其他工具(如 TestNG 或 Selenium)。
- **学习曲线**:虽然简单,但对于初学者来说,理解测试生命周期和断言机制可能需要一些时间。

六.发展方向

JUnit 5 是目前的主要发展方向,它将继续优化测试生命周期管理、扩展机制和模块化支持。同时,JUnit 也在不断与其他测试工具和框架(如 Mockito、Spring Test)进行更紧密的集成。并且, JUnit 是 Java 开发中不可或缺的工具之一,通过合理使用 JUnit,可以显著提高代码质量和开发效率。

七.核心组件

1.测试用例

测试用例是 JUnit 的基本单元,通常是一个 Java 类,继承自`TestCase`(JUnit 3)或使用注解(JUnit 4 和 JUnit 5)。

public class CalculatorTest {

@Test

public void testAdd() {

Calculator calc = new Calculator();

assertEquals(5, calc.add(2, 3));

}

}

2.断言(Assertions)

断言用于验证测试结果是否符合预期。JUnit 提供了多种断言方法:

  • `assertEquals(expected, actual)`:验证实际值是否等于预期值。

  • `assertTrue(condition)`:验证条件是否为真。

  • `assertNotNull(object)`:验证对象是否不为`null`。

  • `assertThrows`(JUnit 5):验证是否抛出了预期的异常。

3.测试生命周期

JUnit 提供了测试生命周期的注解,用于在测试前后执行特定的代码:
- **JUnit 4**

  • `@Before`:在每个测试方法之前执行。

  • `@After`:在每个测试方法之后执行。

  • `@BeforeClass`:在所有测试方法之前执行一次。

  • `@AfterClass`:在所有测试方法之后执行一次。
    - **JUnit 5**

  • `@BeforeEach`:在每个测试方法之前执行。

  • `@AfterEach`:在每个测试方法之后执行。

  • `@BeforeAll`:在所有测试方法之前执行一次。

  • `@AfterAll`:在所有测试方法之后执行一次。

4.测试运行器

JUnit 使用测试运行器来执行测试用例。常用的运行器包括:

  • `JUnitCore`:用于命令行运行测试。

  • IDE 内置的测试运行器(如 IntelliJ IDEA 或 Eclipse):方便开发者在开发环境中直接运行测试。

八.简单示例

JUnit 4 示例:

import static org.junit.Assert.*;

import org.junit.Before;

import org.junit.Test;

public class CalculatorTest {

private Calculator calc;

@Before

public void setUp() {

calc = new Calculator();

}

@Test

public void testAdd() {

assertEquals(5, calc.add(2, 3));

}

@Test

public void testSubtract() {

assertEquals(1, calc.subtract(3, 2));

}

}

JUnit 5 示例:

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

import org.junit.jupiter.api.BeforeEach;

import org.junit.jupiter.api.Test;

public class CalculatorTest {

private Calculator calc;

@BeforeEach

public void setUp() {

calc = new Calculator();

}

@Test

public void testAdd() {

assertEquals(5, calc.add(2, 3));

}

@Test

public void testSubtract() {

assertEquals(1, calc.subtract(3, 2));

}

}

九.JUnit 4 与 JUnit 5 的区别

- **注解变化**: JUnit 5 引入了新的注解(如`@DisplayName`、`@Nested`等),提供了更灵活的测试组织方式。
- **扩展机制**: JUnit 5 提供了更强大的扩展机制,支持自定义扩展。
- **模块化支持**: JUnit 5 更好地支持 Java 9 的模块化特性。
**- **异常处理**:**JUnit 5 提供了更简洁的异常测试方法(如`assertThrows`)。

十.idea项目实战

1.在idea中创建Java项目,注意选择"Maven"

2.将"pom.xml"文件内容替换成下面内容

复制代码
<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.example</groupId>
    <artifactId>simple-junit-project</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!-- JUnit 5 -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.9.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.9.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M7</version>
            </plugin>
        </plugins>
    </build>
</project>

3.重新加载Maven项目,直到不再报错

4.按下图创建对应项目和Java类文件

5.两个Java类文件代码内容如下,替换即可

java 复制代码
​
package com.example;

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }

    public int subtract(int a, int b) {
        return a - b;
    }
}

​
java 复制代码
package com.example;

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

class CalculatorTest {
    private Calculator calculator;

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

    @Test
    void testAdd() {
        assertEquals(5, calculator.add(2, 3), "2 + 3 should equal 5");
    }

    @Test
    void testSubtract() {
        assertEquals(1, calculator.subtract(3, 2), "3 - 2 should equal 1");
    }
}

6.运行测试类,结果如下

7.代码解释如下

对于pom.xml

  • <modelVersion> :定义了 POM 文件的版本,通常是 4.0.0

  • <groupId> :定义了项目的唯一标识,通常是反向域名形式,例如 com.example

  • <artifactId> :定义了项目的名称,例如 simple-junit-project

  • <version> :定义了项目的版本号,例如 1.0-SNAPSHOT

  • <properties>:定义了一些常用的属性,例如 Java 编译版本和字符编码。

  • <dependencies>:定义了项目依赖的库。这里我们添加了 JUnit 5 的依赖,用于编写和运行单元测试。

    • junit-jupiter-api:JUnit 5 的核心 API,用于编写测试用例。

    • junit-jupiter-engine:JUnit 5 的测试引擎,用于运行测试用例。

  • <build>:定义了项目的构建配置。

    • maven-surefire-plugin:用于运行测试的 Maven 插件。

对于Calculator

  • add 方法 :接收两个整数参数 ab,返回它们的和。

  • subtract 方法 :接收两个整数参数 ab,返回它们的差。

对于CalculatorTest

  • @BeforeEach 注解setUp 方法会在每个测试方法运行之前被调用。这里用于初始化 Calculator 对象。

  • @Test 注解:标记这是一个测试方法。

  • testAdd 方法

    • 调用 calculator.add(2, 3),计算结果。

    • 使用 assertEquals 断言方法,验证计算结果是否等于预期值 5

    • 第三个参数是断言失败时的错误信息。

  • testSubtract 方法

    • 调用 calculator.subtract(3, 2),计算结果。

    • 使用 assertEquals 断言方法,验证计算结果是否等于预期值 1

相关推荐
Dcs2 分钟前
超强推理不止“大”——手把手教你部署 Mistral Small 3.2 24B 大模型
java
简佐义的博客9 分钟前
破解非模式物种GO/KEGG注释难题
开发语言·数据库·后端·oracle·golang
东阳马生架构12 分钟前
订单初版—1.分布式订单系统的简要设计文档
java
SH11HF16 分钟前
小菜狗的云计算之旅,学习了解rsync+sersync实现数据实时同步(详细操作步骤)
学习·云计算
程序员爱钓鱼21 分钟前
【无标题】Go语言中的反射机制 — 元编程技巧与注意事项
开发语言·qt
Frank学习路上31 分钟前
【IOS】XCode创建firstapp并运行(成为IOS开发者)
开发语言·学习·ios·cocoa·xcode
Code blocks36 分钟前
使用Jenkins完成springboot项目快速更新
java·运维·spring boot·后端·jenkins
荔枝吻1 小时前
【沉浸式解决问题】idea开发中mapper类中突然找不到对应实体类
java·intellij-idea·mybatis
2301_805054561 小时前
Python训练营打卡Day59(2025.7.3)
开发语言·python