learning_record_doc/java/spring/测试/Junit5.md

11 KiB
Raw Blame History

`JUnit5

注解

JUnit4包路径org.junit

JUnit5包路径 org.junit.jupiter.api

JUnit4 JUnit5 说明
@Test @Test 表示该方法是一个测试方法。JUnit5 与 JUnit 4 的 @Test 注解不同的是,它没有声明任何属性,因为 JUnit Jupiter 中的测试扩展是基于它们自己的专用注解来完成的。这样的方法会被继承,除非它们被覆盖
@BeforeClass @BeforeAll 表示使用了该注解的方法应该在当前类中所有使用了 @Test @RepeatedTest、@ParameterizedTest 或者 @TestFactory 注解的方法之前 执行 仅执行一次
@AfterClass @AfterAll 表示使用了该注解的方法应该在当前类中所有使用了 @Test、@RepeatedTest、@ParameterizedTest 或者 @TestFactory 注解的方法之后执行 仅执行一次
@Before @BeforeEach 表示使用了该注解的方法应该在当前类中每一个使用了 @Test、@RepeatedTest、@ParameterizedTest 或者 @TestFactory 注解的方法之前 执行
@After @AfterEach 表示使用了该注解的方法应该在当前类中每一个使用了 @Test、@RepeatedTest、@ParameterizedTest 或者 @TestFactory 注解的方法之后 执行
@Ignore @Disabled 用于禁用一个测试类或测试方法,当前单元测试置为无效,即单元测试时跳过该测试
@Category @Tag 用于声明过滤测试的 tags该注解可以用在方法或类上类似于 TesgNG 的测试组或 JUnit 4 的分类。
@Parameters @ParameterizedTest 表示该方法是一个参数化测试 配合@ValueSource使用
unknown @RepeatedTest @RepeatedTest(n)重复性测试即执行n次表示方法是可以按照指定次数重复执行
unknown @ValueSource @ValueSource(ints = {1, 2, 3}):参数化测试提供数据 配合@ParameterizedTest使用
@RunWith @ExtendWith @ExtendWith用于以声明方式注册扩展@Runwith 就是放在测试类名之前,用来确定这个类怎么运行的,用法:@ExtendWithSpringExtension.class
@Rule @ExtendWith Rule 是一组实现了 TestRule 接口的共享类,提供了验证、监视 TestCase 和外部资源管理等能力
@ClassRule @ExtendWith @ClassRule 用于测试类中的静态变量,必须是 TestRule 接口的实例,且访问修饰符必须为 public。
@FixMethodOrder @TestMethodOrder 用于为测试类配置测试方法执行顺序;类似于Junit4的
unknown @TestInstance 用于为测试类配置测试实例生命周期
unknown @DisplayName 为测试类或测试方法声明自定义的展示名称
unknown @DisplayNameGeneration 为测试类声明一个自定义的显示名称生成器
unknown @Timeout 用于测试方法、测试工厂、测试模板或生命周期方法,在其执行超过指定时间时失败。
unknown @RegisterExtension 用于通过字段以编程方式注册扩展
unknown @TempDir 用于在生命周期方法或测试方法中通过字段注入或参数注入临时目录;位于org.junit.jupiter.api.io包。
unknown @Nested 嵌套测试
unknown @TestClassOrder 用于@Nested注解的测试类可以配置测试类执行顺序
unknown @TestFactory 测试工厂

断言

断言方法 描述
assertNull() 检查对象是否为空
assertNotNull() 检查对象是否不为空
assertEquals() 判断预期值与实际值是否相等的
assertNotEquals() 判断预期值与实际值是否相等的
assertFalse() 检查条件是否为假
assertTrue() 检查条件是否为真
assertSame() 检查两个对象引用是否引用同一对象(即对象是否相等)
assertNotSame() 检查两个对象引用是否不引用统一对象(即对象不等)
assertArrayEquals() 判断预期数组与实际数组是否相等
assertIterableEquals() 判断预期的和实际的可迭代对象是完全相等的。完全相等意味着集合中元素的数量和顺序必须相同,迭代的元素必须相等。
assertLinesMatch() 判断预期字符串列表是否与实际列表相等
assertTimeout() 它们是用于测试长时间运行的任务,如果测试任务花费的时间超过指定的持续时间,则测试将失败
assertThrows() assetThrows()断言提供的Executable执行会引发expectedType异常并返回异常
fail() *fail()*方法指未通过测试

Junit4断言静态类org.junit.Assert

JUnit5断言静态类org.junit.jupiter.Assertions

其他

引擎

JUnit4junit-vintage-engine

Junit5junit-jupiter-engine

生命周期

file

Spring Test 注解

注解 说明
@RollBack @Rollback是一个测试注解用来指示 测试管理事务应在回滚后 测试方法已经完成注解value默认为true表示不进行事务提交@RollBack(value=false)表示进行事务的提交
@Transactional 不进行事务提交 等同于@RollBack(value=true)
@Commit 进行事务提交 等同于@RollBack(value=false)

案例

嵌套测试+Order

执行TestClass 会执行该类下得所有方法

@ Nested用于表示注释类是嵌套类。 可以共享的非静态测试类 (即内部类) 使用enclosed类的实例进行设置和状态。封闭类可以是顶级测试类也可以是 另一个 @ Nested测试类嵌套可以任意深。

@TestMethodOrder注解 设置方法执行顺序策略 有以下三种策略可以设置

策略类 描述
MethodOrderer.Alphanumeric 根据方法的字母数字排序
MethodOrderer.OrderAnnotation 根据@Order注解进行排序执行
MethodOrderer.Random 随机执行

@Nested+@TestMethodOrder(MethodOrderer.Alphanumeric.class)

实例代码:

package com.guadou.erp.service.wms.service.impl;

import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
/**
 * @author dss
 * @since 2023/2/3
 */
public class TestNested {
    @Nested
    @TestMethodOrder(MethodOrderer.Alphanumeric.class)
    class TestClass{
        @Test
        void testa(){
            System.out.println("testa");
        }
        @Test
        void testb(){
            System.out.println("testb");
        }
        @Test
        void testc(){
            System.out.println("testc");
        }
    }
}

@Nested+@TestMethodOrder(MethodOrderer.OrderAnnotation.class)

输出信息:

testa
testb
testc

实例代码:

package com.guadou.erp.service.wms.service.impl;

import org.junit.jupiter.api.*;

/**
 * @author dss
 * @since 2023/2/3
 */
public class TestNested {
    @Nested
    @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
    class TestClass{
        @Test
        @Order(3)
        void testa(){
            System.out.println("testa");
        }
        @Test
        @Order(1)
        void testb(){
            System.out.println("testb");
        }
        @Test
        @Order(2)
        void testc(){
            System.out.println("testc");
        }
    }
}

@Nested+@TestMethodOrder(MethodOrderer.Random.class)

实例代码:

package com.guadou.erp.service.wms.service.impl;

import org.junit.jupiter.api.*;

/**
 * @author dss
 * @since 2023/2/3
 */
public class TestNested {
    @Nested
    @TestMethodOrder(MethodOrderer.Random.class)
    class TestClass{
        @Test
        void testa(){
            System.out.println("testa");
        }
        @Test
        void testb(){
            System.out.println("testb");
        }
        @Test
        void testc(){
            System.out.println("testc");
        }
    }
}

输出:

二月 03, 2023 4:22:01 下午 org.junit.jupiter.api.MethodOrderer$Random <clinit>
信息: MethodOrderer.Random default seed: 4392369797561700
testa
testc
testb