Gradle从0入门到实战系列【八】SpringBoot集成Junit单元测试

简介: JUnit 是一个 Java 编程语言的单元测试框架。JUnit 在测试驱动的开发方面有很重要的发展,是起源于 JUnit 的一个统称为 xUnit 的单元测试框架之一。
Junit4Junit5区别非常大,高版本的 springboot(如:2.6.5)只有 junit5没有引入 junit4,但是低版本 springboot(如:2.1.8.RELEASE)的默认引入的是 junit4

初始化项目,访问spring init,创建完成后导入IDEA中
image.png

修改repositories为阿里云的镜像

repositories {
    maven { url 'https://maven.aliyun.com/repository/central' }
    mavenCentral()
}

Junit版本差异

Junit4Junit5区别非常大,高版本的springboot(如:2.6.5)只有junit5没有引入junit4,但是低版本springboot(如:2.1.8.RELEASE)的默认引入的是junit4

image.png

  • Junit Platform: Junit Platform是在JVM上启动测试框架的基础,不仅支持Junit自制的测试引擎,其他测试引擎也都可以接入。
  • Junit Jupiter: Junit Jupiter提供了JUnit5的新的编程模型,是JUnit5新特性的核心。内部 包含了一个测试引擎,用于在Junit Platform上运行。
  • Junit Vintage: 由于JUnit已经发展多年,为了照顾老的项目,JUnit Vintage提供了兼容JUnit4.x,Junit3.x的测试引擎。

junit4代码示例

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@RunWith(SpringRunner.class)
public class Junit4Test {
    
    @Autowired
    private TestRestTemplate testRestTemplate;
    
    @Before
    public void testBefore(){
        System.out.println("before.. 每个Test都会执行一次");
    }
    @Test
    public void test1(){
        String t = testRestTemplate.getForObject("/index", String.class);
        System.out.println("toIndex:" + t);
    }
    @After
    public void TestAfter(){
        System.out.println("after... 每个Test都会执行一次");
    }
    
    @BeforeClass
    public static void initClass(){
        System.out.println("******测试开始初始化,必须是static方法,仅执行一次");
    }
    
    @AfterClass
    public static void endClass(){
        System.out.println("******测试结束初始化,必须是static方法,仅执行一次");
    }
}
//执行顺序是:@BeforeClass→@Before→@Test→@After→@AfterClass

junit5代码示例

//包名有变化
import org.junit.jupiter.api.*;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class Junit5Test {
    
    @BeforeAll
    public static void testBeforeAll() {
        System.out.println("表示在所有单元测试之前执行......");
    }
    
    @BeforeEach
    public void testBeforeEach() {
        System.out.println("类似于JUnit4的@Before 表示在每个单元测试之前执行......");
    }
    @AfterEach
    public void testAfterEach() {
        System.out.println("类似于JUnit4的@After 表示在每个单元测试之后执行......");
    }
    
    @DisplayName("测试类或测试方法声明一个自定义的显示名称")
    @Test
    public void testTwo() throws Exception {
        System.out.println("testTwo......");
    }
    
    /**
     * 规定方法超时时间。超出时间测试出异常
     * @throws InterruptedException
     */
    @Timeout(value = 500, unit = TimeUnit.MILLISECONDS)
    @Test
    void testTimeout() throws InterruptedException {
        Thread.sleep(600);
    }
    
    @AfterAll
    public static void testAfterAll() {
        System.out.println("表示在所有单元测试之后执行......");
    }
}

更多的变化请自行查阅相关文档

build.gradle配置

//方式1
tasks.named('test') {
   useJUnitPlatform()
}

//方式2
test {
   useJUnitPlatform()
}

单元测试代码

  1. 主程序代码

    //application
    package com.it235.it235order
    @SpringBootApplication
    public class It235OrderApplication {
        public static void main(String[] args) {
            SpringApplication.run(It235OrderApplication.class, args);
        }
    }
    
    //controller
    package com.it235.it235order.rest;
    @RestController
    public class OrderController {
    
        @GetMapping("/index")
        public String index(){
            return "ok";
        }
    }
    
    //service
    package com.it235.it235order.service;
    public interface OrderService {
        String get(Long orderId);
    }
    
    @Service
    public class OrderServiceImpl implements OrderService {
        @Override
        public String get(Long orderId) {
            return "订单ID:" + orderId;
        }
    }
  2. 测试程序代码

    package com.it235.it235order;
    
    @SpringBootTest
    public class It235OrderApplicationTests {
    }
    
    package com.it235.it235order.order;
    import com.it235.it235order.It235OrderApplicationTests;
    import com.it235.it235order.service.OrderService;
    import org.junit.jupiter.api.*;
    import org.springframework.beans.factory.annotation.Autowired;
    //集成Tests类
    public class OrderTests extends It235OrderApplicationTests {
        @Autowired
        private OrderService orderService;
    
        @DisplayName("测试方法1")
        @Test
        void getOrderTest() {
            Long orderId = 1001L;
            String s = orderService.get(orderId);
            Assertions.assertEquals("订单ID:" + orderId , s );
        }
    
        @DisplayName("测试方法2")
        @Test
        void getOrderTest2() {
            Long orderId = 1002L;
            String s = orderService.get(orderId);
            Assertions.assertEquals("订单ID2:" + orderId , s );
        }
    }
    

单元测试执行命令

  1. 使用gradlew test命令执行

    .\gradlew.bat test
  2. build时跳过test

    .\gradlew build -x test

test闭包扩展参数

  1. 执行单元测试前jvm相关参数

    test {
        // Discover and execute JUnit4-based tests
        useJUnit()
    
        // Discover and execute TestNG-based tests
        useTestNG()
        
        // set a system property for the test JVM(s)
        systemProperty 'some.prop', 'value'
        
        // set heap size for the test JVM(s)
        minHeapSize = "128m"
        maxHeapSize = "512m"
        
        //实际执行:java -Xmx20m -Dspring.profiles.active=unit -XX:+UseG1GC -jar app.jar
        jvmArgs "-Xmx20m" ,"-Dspring.profiles.active=unit" , "-XX:+UseG1GC"
        
        //Junit5
        useJUnitPlatform()
    }
  2. 执行单元测试前拷贝资源文件

    //定义一个拷贝任务,将src/main/db目录文件拷贝至build中
    task copyDbResources(type: Copy) {
        from 'src/main/db'
        into 'build/resources/main/db'
    }
    
    test {
        useJUnitPlatform()
    }
    
    //将测试资源复制到测试资源目录
    processTestResources {
        dependsOn copyDbResources
    }
    
  3. 排除不被单元测试扫描的包

    test {
        // explicitly include or exclude tests
        include 'org/foo/**'
        exclude 'com/it235/it235order/order'
        
        useJUnitPlatform()
    }

总结

SpringBoot将Junit无缝整合后让单元测试变得更加简单,Gradle也只需要简单的配置即可完成Junit的集成。

目录
相关文章
|
2月前
|
Java 测试技术 开发者
必学!Spring Boot 单元测试、Mock 与 TestContainer 的高效使用技巧
【10月更文挑战第18天】 在现代软件开发中,单元测试是保证代码质量的重要手段。Spring Boot提供了强大的测试支持,使得编写和运行测试变得更加简单和高效。本文将深入探讨Spring Boot的单元测试、Mock技术以及TestContainer的高效使用技巧,帮助开发者提升测试效率和代码质量。
276 2
|
2月前
|
测试技术 持续交付 开发者
探索自动化测试的无限可能:从入门到精通
在软件开发领域,确保产品质量是至关重要的。自动化测试作为一种高效、可靠的测试方法,正逐渐成为行业标准。本文将带你深入了解自动化测试的世界,从基础概念到实践技巧,帮助你掌握这一强大的工具。无论你是初学者还是有经验的开发者,都能从中获得宝贵的知识和启发。
|
2月前
|
Java 测试技术 开发者
初学者入门:掌握单元测试的基础与实践
【10月更文挑战第14天】单元测试是一种软件测试方法,它验证软件中的最小可测试单元——通常是单独的函数或类——是否按预期工作。单元测试的目标是确保每个模块在其自身范围内正确无误地运行。这些测试应该独立于其他模块,并且应该能够反复执行而不受外部环境的影响。
68 2
|
2月前
|
XML Java 测试技术
【SpringBoot系列】初识Springboot并搭建测试环境
【SpringBoot系列】初识Springboot并搭建测试环境
88 0
|
15天前
|
安全 Java 测试技术
springboot之SpringBoot单元测试
本文介绍了Spring和Spring Boot项目的单元测试方法,包括使用`@RunWith(SpringJUnit4ClassRunner.class)`、`@WebAppConfiguration`等注解配置测试环境,利用`MockMvc`进行HTTP请求模拟测试,以及如何结合Spring Security进行安全相关的单元测试。Spring Boot中则推荐使用`@SpringBootTest`注解简化测试配置。
|
17天前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
24 3
|
1月前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
95 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
23天前
|
Java 测试技术 API
详解Swagger:Spring Boot中的API文档生成与测试工具
详解Swagger:Spring Boot中的API文档生成与测试工具
34 4
|
1月前
|
Java 测试技术 Android开发
探索自动化测试的奥秘:从入门到精通
【10月更文挑战第37天】本文将带你进入自动化测试的世界,从基础知识到实战案例,逐步揭示自动化测试的神秘面纱。我们将一起探讨如何利用代码来简化测试过程,提高效率,并确保软件质量。无论你是初学者还是有经验的开发者,这篇文章都能为你提供有价值的见解和技巧。让我们一起踏上这段探索之旅吧!
|
1月前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
113 1
下一篇
DataWorks