Skip to content

JUnit5 测试用例断言

JUnit5 测试用例断言

JUnit5 断言

在 JUnit 5 中,断言用于验证测试的预期结果和实际结果是否一致。JUnit 5 提供了一组丰富的断言方法,用于测试不同类型的条件和值。

  • 内置断言方法
  • 第三方库断言

内置断言方法

  • 必修
    • assertEquals 用于断言预期值和实际值相等
    • assertTrue 断言提供的条件为真
  • 进阶
    • assertAll 执行多条断言
  • 选修
    • assertNotNull 断言实际不为空
    • assertTimeout 用于测试长时间运行的任务,如果测试任务花费的时间超过指定的持续时间,则测试将失败。
    • assertThrows 断言函数执行会发生异常

assertEquals 实例
  • 创建第一个测试类 AssertEqTest
  • 创建测试方法 断言方式使用 assertEquals,方法前记得添加Test注释

    package JUnit5assert;
    
    import org.junit.jupiter.api.Test;
    
    import static org.junit.jupiter.api.Assertions.assertEquals;
    
    public class AssertEqTest {
        @Test
        void Hogwarts(){
            System.out.println("断言测试");
            //第一个参数为预期结果,第二个参数为实际结果
            assertEquals(3,1+1);
        }
    }
    

  • 已知 1+1!=1,断言应该是失败的,我们执行查看结果 - 断言失败 预期结果与实际结果不等 错误输出信息中可以看到断言所在的行数以及测试类和测试方法 还有具体的测试信息
  • 将预期结果与实际结果改为一致,我们在查看执行结果 - 修改断言内容 - 执行查看结果 断言成功 无错误信息

assertTrue 实例
  • 创建测试类 AssertTrueTest
  • 编写两个测试方法 断言方式使用 assertTrue 方法前记得添加Test注释

    package JUnit5assert;
    
    import org.junit.jupiter.api.Test;
    
    import static org.junit.jupiter.api.Assertions.assertTrue;
    
    public class AssertTrueTest {
        //对表达式进行断言
        @Test
        void expressionDemo(){
            System.out.println("断言表达式为True");
            //括号内表达式正确则断言正确,反之则断言失败
            assertTrue(3<1);
    
        }
        //对bool类型断言
        @Test
        void boolDemo() {
            System.out.println("断言布尔类型");
            //括号内是true则断言正确,反之则断言失败
            assertTrue(true);
        }
    
    }
    
  • 执行查看断言测试结果,expressionDemo 方法中断言 3<1 是错误的表达式,断言应失败, boolDemo方法中直接断言 true ,断言正确。

assertNotNull 实例
  • 创建测试类 AssertNotNullTest
  • 创建两个测试方法 断言方式使用 assertNotNull

    package JUnit5assert;
    
    import org.junit.jupiter.api.Test;
    
    import static org.junit.jupiter.api.Assertions.assertNotNull;
    
    public class AssertNotNullTest {
        @Test
        void nullDemo(){
            System.out.println("断言传值为空的场景");
            assertNotNull(null);
        }
        @Test
        void notNullDemo(){
            System.out.println("断言传值不为空的场景");
            assertNotNull(1);
        }
    }
    
  • 执行查看结果

    • nullDemo 方法中 断言 null 而我们期望得到到不为空 不符合预期 断言失败
    • notNullDemo 方法中 断言 1 不为空 断言成功


assertAll 实例

用来判断一组断言是否成功,包含的所有断言都会执行,即使其中一个或多个断言失败,重点内容很重要!

  • 创建 AssertAllDemoTest 测试类
  • 编写测试方法 使用assertAll断言方式进行断言
    • 断言格式
       assertAll("All",//描述信息
                  () -> assertEquals(2, 1 + 1),//使用assertEquals断言方式进行断言,也可使用其他方式
                  () -> assertEquals(4, 2 + 3)
          );
      
  • 执行查看结果

    • 显示两组失败信息,分别对应方法中的两组预期值和实际值不相等的断言
    • 结果中也会显示具体的断言错误信息
    • 实现代码
    package JUnit5assert;
    
    import org.junit.jupiter.api.Test;
    
    import static org.junit.jupiter.api.Assertions.assertAll;
    import static org.junit.jupiter.api.Assertions.assertEquals;
    
    public class AssertAllDemoTest {
        @Test
        void Hogwarts(){
    
            System.out.println("断言测试AssertAll场景");
            //用来判断一组断言是否成功,包含的所有断言都会执行,即使其中一个或多个断言失败,且返回结果
            assertAll("All",//第一个参数heading是描述信息 可表示测试针对的场景
                    () -> assertEquals(2, 1 + 1),//assertEquals中第一个参数为预期结果,第二个参数为实际结果
                    () -> assertEquals(4, 2 + 3),
                    () -> assertEquals(1, 2 + 0)
            );
        }
    }
    

assertTimeout 实例

用于测试长时间运行的任务,如果测试任务花费的时间超过指定的持续时间,则测试将失败。

  • 创建测试类 AssertTimeoutDemoTest
  • 编写测试方法 使用assertTimeout方式进行断言

    • 格式
        assertTimeout(Duration.ofSeconds(3), ()->{
            sleep(4000);
        });
    
    • assertTimeout 第二个参数中的操作执行时间超过第一个参数中的时间,则断言失败,超时抛出异常
    package JUnit5assert;
    
    import org.junit.jupiter.api.Test;
    
    import java.time.Duration;
    
    import static java.lang.Thread.sleep;
    import static org.junit.jupiter.api.Assertions.assertTimeout;
    
    public class AssertTimeoutDemoTest {
        @Test
        void testAssertTimeout() {
            // 超时断言
            //第一个参数为设置预期时间信息,Duration.ofSeconds(3)表示三秒超时
            //第二个参数中传递需要执行的操作
            //assertTimeout第二个参数中的操作执行时间超过第一个参数中的时间,则断言失败,超时抛出异常
            assertTimeout(Duration.ofSeconds(3), ()->{
                sleep(4000);
            });
        }
    }
    
  • 执行查看结果 assertTimeout 第二个参数中的操作执行时间超过第一个参数中的时间,断言失败,超时抛出异常

assertThrows 实例

多用与测试接口,简单了解即可,更多在研发时使用

  • 创建 AssertThrowsDemoTest测试类
  • 在测试类中定义一个函数,再编写一个测试函数,测试函数中使用 assertThrows 进行断言,第二个参数中执行的操作出现异常则断言成功,没有出现异常则断言失败。

    package JUnit5assert;
    
    import org.junit.jupiter.api.Test;
    
    import static org.junit.jupiter.api.Assertions.assertThrows;
    
    public class AssertThrowsDemoTest {
        void fn(int a, int b){
            System.out.println(a / b);
        }
    
        @Test
        void firsttestAssertThrows() {
            // 异常断言
            //fn函数执行时会产生异常,0不可作为除数,断言成功
            assertThrows(ArithmeticException.class, () -> fn(1, 0));
        }
        @Test
        void secondtestAssertThrows() {
            // 异常断言
            //fn函数执行时没有异常,断言失败
            assertThrows(ArithmeticException.class, () -> fn(1, 1));
        }
    }
    
  • 执行查看测试结果 - firsttestAssertThrows中断言成功 - secondtestAssertThrows中断言失败

第三方库断言

简单了解即可

  • Hamcrest
  • AssertJ
  • Truth