JUnit5简介

2024-03-18 1672阅读

温馨提示:这篇文章已超过383天没有更新,请注意相关的内容是否还可用!

JUnit5简介

JUnit5官网

JUnit5= JUnit Platform + JUnit Jupiter + JUnit Vintag

JUnit Platform:

用于JVM上启动测试框架的基础服务,提供命令行,IDE和构建工具等方式执行测试的支持;

JUnit Jupiter:

包含JUnit新的编程模型和扩展模型,主要就是用于编写测试代码和扩展代码;

JUnit Vintage:

用于在JUnit5中兼容运行JUnit3.x和JUnit4.x的测试用例。

JUnit5架构

JUnit5简介

JUnit5特征

JUnit 5主要特性:

•提供全新的断言和测试注解,支持测试类内嵌;

•更丰富的测试方式:支持动态测试,重复测试,参数化测试等;

•实现了模块化,让测试执行和测试发现等不同模块解耦,减少依赖;

•提供对 Java 8 +版本的支持,如 Lambda 表达式,Stream API等。

JUnit5用法

JUnit5与JUnit4annotation的差异

JUnit4Junit5说明
@Test@Test标记方法为测试方法
@Before@BeforeEach在每个测试执行之前执行
@After@AfterEach在每个测试执行之后执行
@BeforeClass@BeforeAll只执行一次,在所有测试和 @BeforeEach 注解方法之前
@AfterClass@AfterAll只执行一次,在所有测试和 @AfterEach注解方法之后
@Ignore@Disabled禁用执行测试

JUnit5特有annotation

Junit5说明
@DisplayName用来定义一个测试类并指定用例在测试报告中的展示名称
@Nested内嵌测试类
@RepeatedTest重复性测试

实例1

通过Maven导入JUnit5的jar包

  org.junit.jupiter
  junit-jupiter
  5.8.2
  test

第一个测试代码

import org.junit.jupiter.api.*;
@DisplayName("我的第一个Junit5测试用例")
public class MyFirstJunit5Test {
    @BeforeAll
    public static void init() {
        System.out.println("初始化数据");
    }
    @AfterAll
    public static void cleanUp() {
        System.out.println("清理数据");
    }
    @BeforeEach
    public void tearup() {
        System.out.println("当前测试方法开始");
    }
    @AfterEach
    public void tearDown() {
        System.out.println("当前测试方法结束");
    }
    @DisplayName("我的第一个测试")
    @Test
    void testFirstTest(){
        System.out.println("我的第一个测试开始");
    }
    @DisplayName("我的第二个测试")
    @Test
    void testSecondTest(){
        System.out.println("我的第二个测试开始");
    }
    @DisplayName("我的第三个测试")
    @Test
    void testThirdTest(){
        System.out.println("我的第三个测试开始");
    }
}

JUnit5简介

实例2(内嵌测试方法)

@DisplayName("内嵌测试类")
public class NestUnitTest {
        @BeforeEach//在每个测试执行之前执行
        void init() {
            System.out.println("测试方法执行前准备");
        }
        @Nested//定义内嵌测试类
        @DisplayName("第一个内嵌测试类")//定义用例在测试报告中的展示名称
        class FirstNestTest {
            @Test//定义测试方法
            void test1() {
                System.out.println("第一个内嵌测试类执行测试1");
            }
            @Test//定义测试方法
            void test2() {
                System.out.println("第一个内嵌测试类执行测试2");
            }
        }
        @Nested//定义内嵌测试类
        @DisplayName("第二个内嵌测试类")//定义用例在测试报告中的展示名称
        class SecondNestTest {
            @Test//定义测试方法
            void test1() {
                System.out.println("第二个内嵌测试类执行测试1");
            }
            @Test//定义测试方法
            void test2() {
                System.out.println("第二个内嵌测试类执行测试2");
            }
        }
    }

JUnit5简介

实例3(assertAll 方法进行断言)

public class AssertAllTest {
        @Test
        void testGroupAssertions() {
            int[] numbers = {0, 1, 2, 3, 4};
            Assertions.assertAll("numbers",//下面所有条件成立,才通过
                    () -> Assertions.assertEquals(numbers[1], 1),//断言相等
                    () -> Assertions.assertEquals(numbers[3], 3),//断言相等
                    () -> Assertions.assertEquals(numbers[4], 4) //断言相等
            );
        }
    }

JUnit5简介

实例4(超时方法测试)

public class AssertTimeoutTest {
    @Test
    @DisplayName("超时方法测试")
    void test_should_complete_in_one_second(){
        //断言超时
        Assertions.assertTimeoutPreemptively(Duration.of(1, ChronoUnit.SECONDS),
                () -> Thread.sleep(1000));
    }
}

JUnit5简介

实例5(异常测试)

public class AssertThrowsExceptionTest {
        @Test
        @DisplayName("测试捕获的异常")
        void assertThrowsException() {
            String str = null;
            //1、断言抛出异常,2,抛出IllegalArgumentException异常
            Assertions.assertThrows(IllegalArgumentException.class, () -> {
                Integer.valueOf(str);
            });
        }
}

JUnit5简介

实例6(参数化测试)

注解说明
_ @valueSource __ 通过注解可以直接指定携带的运行参数 _
_ @EnumSource __ 枚举参数元,允许我们通过将参数值有给定的Enum枚举类型传入 _
_ @MethodSource __ 通过其他的Java方法函数来作为参数源 _
_ @ArgumentSource __ 参数类参数源,应用类必须实现ArgumentsProvide接口 _
_ @CSVSource __ csv格式作为参数源 _
_ @CSVFileSource __ csv文件作为参数源 _
public class ParameterizedUnitTest {
    @ParameterizedTest
    @ValueSource(ints = {2,4,8})
    void testNumberShouldBeEven(int num){
        Assertions.assertEquals(0,num % 2);
    }
    @ParameterizedTest
    @ValueSource(strings = {"Effective Java","Code Complete","Clean Code"})
    void testPrintTitle(String title){
        System.out.println(title);
    }
    @ParameterizedTest
    @CsvSource({"1,One", "2,Two", "3,Three"})
    void testDataFromCsv(long id, String name) {
        System.out.printf("id: %d, name: %s", id, name);
    }
    @ParameterizedTest
    @CsvSource(value = {"1|2","3|4"},delimiter = '|')
    public void parameterizedCvsSourceTest(String fruit, int rank) {
        System.out.println(fruit);
        System.out.println(rank);
    }
    @ParameterizedTest
    @CsvFileSource(resources = {"/resources/CsvSource(1).csv"})
    public void parameterizedCsvFileSourceTest(String id,String name){
        System.out.println(id);
        System.out.println(name);
    }
    @ParameterizedTest
    @EnumSource(value = TimeUnit.class,mode = EnumSource.Mode.INCLUDE,names = {"DAYS","SECONDS"})
    public void parameterizedEnumSourceTest(TimeUnit timeUnit){
        System.out.println(timeUnit);
    }
    @ParameterizedTest
    @EnumSource(value = TimeUnit.class,mode = EnumSource.Mode.MATCH_ANY,
    names = {"^(M|N).+SECONDS$","SECONDS"})
    public void parameterizedEnumSourceTest1(TimeUnit timeUnit){
        System.out.println(timeUnit);
    }
//    @ParameterizedTest
//    @MethodSource("methodSourceTestFactory")
//    public void parameterizedMethodSourceTest(Student student){
//        System.out.println(student.getName());
//    }
//
//    public static Stream methodSourceTestFactory(){
//        Student student = new Student("Junit5",23);
//        Stream student1 = Stream.of(student);
//        return student1;
//    }
    @ParameterizedTest
    @NullAndEmptySource  //(等同于@NullSource和@EmptySource 两个)
    public void parameterizedNullAndEmptySourceTest(String nullSource){
        System.out.println(nullSource.length());
    }
}

使用JUnit 5优点

  • JUnit 5利用了Java 8或更高版本的特性,例如lambda函数,使测试更强大,更容易维护;
  • JUnit 5为描述、组织和执行测试添加了一些非常有用的新功能。例如,测试得到了更好的显示名称,并且可以分层组织;
  • JUnit 5被组织成多个库,所以只将你需要的功能导入到你的项目中。通过Maven和Gradle等构建系统,包含合适的库很容易;
  • JUnit 5可以同时使用多个扩展,这是JUnit 4无法做到的(一次只能使用一个runner)。这意味着你可以轻松地将Spring扩展与其他扩展(如你自己的自定义扩展)结合起来。
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]