JUnit 5学习笔记

1.JUnit5的改变

JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage

JUnit Platform: Junit
Platform是在JVM上启动测试框架的基础,不仅支持Junit自制的测试引擎,其他测试引擎也都可以接入。

JUnit Jupiter: JUnit Jupiter提供了JUnit5的新的编程模型,是JUnit5新特性的核心。内部包含了一个测试引擎,用于在Junit Platform上运行。

JUnit Vintage: 由于JUint已经发展多年,为了照顾老的项目,JUnit Vintage提供了兼容JUnit4.x,Junit3.x的测试引擎。

2.JUnit5常用注解及测试

JUnit5的注解与JUnit4的注解有所变化

  • @Test :表示方法是测试方法。但是与JUnit4的@Test不同,他的职责非常单一不能声明任何属性,拓展的测试将会由Jupiter提供额外测试
  • @ParameterizedTest :表示方法是参数化测试,下方会有详细介绍
  • @RepeatedTest :表示方法可重复执行,下方会有详细介绍
  • @DisplayName :为测试类或者测试方法设置展示名称
  • @BeforeEach :表示在每个单元测试之前执行
  • @AfterEach :表示在每个单元测试之后执行 @BeforeAll :表示在所有单元测试之前执行
  • @AfterAll :表示在所有单元测试之后执行
  • @Tag :表示单元测试类别,类似于JUnit4中的@Categories
  • @Disabled :表示测试类或测试方法不执行,类似于JUnit4中的@Ignore
  • @Timeout :表示测试方法运行如果超过了指定时间将会返回错误
  • @ExtendWith :为测试类或测试方法提供扩展类引用

2.1 @DisplayName/@Disabled/@BeforeEach/@AfterEach/@BeforeAll/@AfterAll

@SpringBootTest
@DisplayName("Junit5功能测试类")
public class TestJunit {
   
   
    //----------------------------常用注解----------------------------
//
    @DisplayName("测试DisplayName注解---方法1")
    @Test
    public void testDisplayName1() {
   
   
        System.out.println(123);
    }

    @Disabled
    @DisplayName("测试DisplayName注解---方法2")
    @Test
    public void testDisplayName2() {
   
   
        System.out.println(456);
    }

    @BeforeEach
    public void testBeforeEach() {
   
   
        System.out.println("测试就要开始了....");
    }

    @AfterEach
    public void testAfterEach() {
   
   
        System.out.println("测试已经结束了....");
    }

    @BeforeAll
    public static void testBeforeAll() {
   
   
        System.out.println("所有测试就要开始了....");
    }

    @AfterAll
    public static void testAfterAll() {
   
   
        System.out.println("所有测试已经结束了....");
    }
}

在这里插入图片描述

我们再把 testDisplayName2 方法上的@Disabled注解打开。可以看到,这个测试方法已经被禁用了。

在这里插入图片描述

2.2 @Timeout

package com.szh.boot;

import org.junit.jupiter.api.*;

import java.time.Duration;
import java.util.concurrent.TimeUnit;

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

@SpringBootTest
@DisplayName("Junit5功能测试类")
public class TestJunit {
   
   
    @BeforeEach
    public void testBeforeEach() {
   
   
        System.out.println("测试就要开始了....");
    }

    @AfterEach
    public void testAfterEach() {
   
   
        System.out.println("测试已经结束了....");
    }

    @BeforeAll
    public static void testBeforeAll() {
   
   
        System.out.println("所有测试就要开始了....");
    }

    @AfterAll
    public static void testAfterAll() {
   
   
        System.out.println("所有测试已经结束了....");
    }

    @DisplayName("测试Timeout注解")
    @Timeout(value = 5, unit = TimeUnit.MILLISECONDS)
    @Test
    public void testTimeout() throws InterruptedException {
   
   
        Thread.sleep(1000);
    }
}

在这里插入图片描述

2.3 @RepeatedTest

package com.szh.boot;

import org.junit.jupiter.api.*;

import java.time.Duration;
import java.util.concurrent.TimeUnit;

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

@SpringBootTest
@DisplayName("Junit5功能测试类")
public class TestJunit {
   
   
    @BeforeEach
    public void testBeforeEach() {
   
   
        System.out.println("测试就要开始了....");
    }

    @AfterEach
    public void testAfterEach() {
   
   
        System.out.println("测试已经结束了....");
    }

    @BeforeAll
    public static void testBeforeAll() {
   
   
        System.out.println("所有测试就要开始了....");
    }

    @AfterAll
    public static void testAfterAll() {
   
   
        System.out.println("所有测试已经结束了....");
    }

    @RepeatedTest(5)
    @Test
    public void testRepeatedTest() {
   
   
        System.out.println(1);
    }
}

在这里插入图片描述

3.断言

断言(assertions)是测试方法中的核心部分,用来对测试需要满足的条件进行验证。这些断言方法都是org.junit.jupiter.api.Assertions 的静态方法。JUnit 5 内置的断言可以分成如下几个类别:

3.1 简单断言

用来对单个值进行简单的验证。如:

方法 说明
assertEquals 判断两个对象或两个原始类型是否相等
assertNotEquals 判断两个对象或两个原始类型是否不相等
assertSame 判断两个对象引用是否指向同一个对象
assertNotSame 判断两个对象引用是否指向不同的对象
assertTrue 判断给定的布尔值是否为 true
assertFalse 判断给定的布尔值是否为 false
assertNull 判断给定的对象引用是否为 null
assertNotNull 判断给定的对象引用是否不为 null
package com.szh.boot;

import org.junit.jupiter.api.*;

import java.time.
### 数据类型实现方法 在处理超出标准整数范围的数值时,`LargeInteger` 类型的实现通常依赖于特定编程语言或数据库系统的扩展功能。以下是一些常见的实现方法: - **使用内置大整数支持**:某些现代编程语言如 Python 和 Java 提供了内置的大整数支持。例如,在 Python 中可以直接使用任意精度的整数,而在 Java 中则可以利用 `BigInteger` 类来处理非常大的整数。[^5] - **自定义数据类型**:对于需要更高灵活性的情况,可以通过定义新的数据结构来表示大整数,并且实现相应的数学运算函数。例如,在 PostgreSQL 中可以创建一个自定义的数据类型,并通过定义特定的操作符和函数来支持该类型的运算。[^4] - **第三方库**:许多语言都有第三方库专门用于处理大整数。例如,在 C++ 中可以使用 GMP (GNU Multiple Precision Arithmetic Library) 库来处理非常大的整数。 ### 使用问题与注意事项 当使用 `LargeInteger` 类型时,需要注意以下几个方面的问题: - **性能开销**:由于大整数的运算通常比普通整数要慢,因此在性能敏感的应用中应当谨慎使用。特别是在数据库系统中,大整数字段可能会影响查询效率。 - **内存消耗**:存储和处理大整数会占用更多的内存资源,这在设计数据模型时需要考虑进去。 - **转换问题**:从其他类型转换到大整数类型时,必须确保不会丢失信息。例如,在 MySQL 中如果将 `BIGINT` 转换为 `DOUBLE` 时存在舍入错误,可能会导致结果中的最后几位数字出错。[^3] - **算术运算**:进行算术运算时,应特别注意溢出问题。即使是在支持大整数的语言中,不当的操作也可能导致意外的结果。例如,两个大整数相乘的结果如果超过最大可表示值,可能会得到异常的结果。[^3] ### 示例代码 假设我们想在 Java 中使用 `BigInteger` 来处理非常大的整数,以下是简单的示例代码: ```java import java.math.BigInteger; public class LargeIntegerExample { public static void main(String[] args) { // 创建两个非常大的整数 BigInteger bigNum1 = new BigInteger("123456789012345678901234567890"); BigInteger bigNum2 = new BigInteger("987654321098765432109876543210"); // 执行加法运算 BigInteger sum = bigNum1.add(bigNum2); System.out.println("Sum: " + sum); // 执行乘法运算 BigInteger product = bigNum1.multiply(bigNum2); System.out.println("Product: " + product); } } ``` 这段代码演示了如何创建 `BigInteger` 对象以及如何执行基本的算术运算。 ### 相关问题 1. 在哪些情况下应该选择使用大整数而不是标准整数? 2. 如何在 Python 中处理非常大的整数? 3. 有哪些流行的第三方库可以帮助处理大整数? 4. 使用大整数时如何优化性能? 5. 在数据库设计中,使用大整数类型需要注意哪些事项?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值