• SpringBoot单元测试


    1、什么是单元测试

    单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证的过程就叫单元测试。

    单元测试是开发者或者测开人员编写的一小段代码,用于检验被测代码的一个很小的、很明确的(代码) 功能是否正确。执行单元测试就是为了证明某段代码的执行结果是否符合我们的预期。如果测试结果符合我们的预期,称之为测试通过,否则就是测试未通过(或者叫测试失败)

    Java 中的最小测试单元就到方法了,也就说对方法的测试就是单元测试

    2、单元测试有哪些好处?

    1. 可以非常简单、直观、快速的测试某一 个功能是否正确

    2. 使用单元测试可以帮我们在打包的时候,发现一 些问题,因为在打包之前,所以的单元测试必须通过,否则不能打包成功

    3. 使用单元测试,在测试功能的时候,可以不污染连接的数据库,也就是可以不对数据库进行任何改变的情况下,测试功能

    3、SpringBoot 单元测试使用

    Spring Boot 项目创建时会默认单元测试框架 spring-boot-test,而这个单元测试框架主要是依靠另一个著名的测试框架 JUnit 实现的,打开 pom.xml 就可以看到,以下信息是 Spring Boot 项目创建是自动添加的:

    <dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-testartifactId>
    <scope>testscope>
    dependency>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    确认项目中已经内置了测试框架( 高版本的spr ingboot会内置测试框架)

    3.1 生成单元测试的类

    需要测试哪个类,就在哪个类中鼠标右击,选择 Generate

    在这里插入图片描述

    然后选择 Test

    在这里插入图片描述

    在这里插入图片描述

    最终结果:

    在这里插入图片描述

    3.2 配置单元测试的类并添加@SpringBootTest注解

    因为我们测试的这个类是运行在 SpringBoot 中的类,所以要给当前的类上进行标识,表明这个类中的单元测试方法是运行在 SpringBoot 环境中的

    @SpringBootTest
    class UserMapperTest {
    
        @Test
        void getUserById() {
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.3 添加单元测试的业务代码

    @SpringBootTest
    class UserMapperTest {
    
        @Autowired
        private UserMapper userMapper;
        
        @Test
        void getUserById() {
            UserInfo userInfo = userMapper.getUserById(1);
            System.out.println(userInfo);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3.4 进行测试并查看结果

    在这里插入图片描述
    每个测试方法,都要这个绿色的运行图标,只要点击即可

    在这里插入图片描述

    根据这个结果,其实就可以知道,就算是数据库中没有结果,这个测试也是能成功的。有没有一种方式,如果数据库中没有对应的数据,就让测试报错,不再执行?

    当然可以,使用断言

    3.5 使用断言

    简单的断言说明

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

    使用 assertNotNull 进行断言

    在这里插入图片描述

    一定要使用 junit 的API

    @SpringBootTest
    class UserMapperTest {
    
        @Autowired
        private UserMapper userMapper;
    
        @Test
        void getUserById() {
            UserInfo userInfo = userMapper.getUserById(1);
            //如果 userInfo 为 null,则报错	
            Assertions.assertNotNull(userInfo);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    测试成功

    如果使用 Assertions.assertNull(userInfo),再看看结果

    在这里插入图片描述

    结果测试失败,因为 userinfo 不为 null

    3.6 在不修改数据库的前提下,执行单元测试

    为了不污染连接的数据库,需要在测试方法上添加 @Transactional 注解

    例如写一个修改操作:

    UserMapper.xml:

    
    <update id="update">
    	update userinfo set username=#{username} where id=#{id};
    update>
    
    • 1
    • 2
    • 3
    • 4

    UserMapper:

    @Mapper //加了注解,此时就变成了 mybatis 的接口
    public interface UserMapper {
    	//根据用户id修改用户名
        public int update(@Param("id") Integer id, @Param("username") String username);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    单元测试:

    @SpringBootTest
    class UserMapperTest {
        @Autowired
        private UserMapper userMapper;
        
        @Test
        @Transactional //表示不污染数据库
        void update() {
            int result = userMapper.update(1, "fl");
            Assertions.assertEquals(1, result);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    原始数据:

    在这里插入图片描述

    进行单元测试:

    在这里插入图片描述

    测试通过后,再查看数据库中的数据是否被改变:

    在这里插入图片描述

    为什么会这样?

    因为在单元测试中添加 @Transactionl 表示在方法执行完后进行事务回滚

  • 相关阅读:
    gitmodel学习笔记(三):利用scipy分析概率论与数理统计
    “轻松实现Linux和Windows文件共享,只需几步配置!“
    浅谈-动态路由之OSPF的理解
    centos VS code中gdb调试无法显示STL内容的问题(仅显示内存地址信息)
    医保移动支付和接口对接开发
    Python 中的方法重载
    配置中心微服务(Spring Cloud Config)
    公链常用的共识算法
    2022-09-16 第五组 张明敏 学习笔记
    Linux openGauss 数据库远程连接
  • 原文地址:https://blog.csdn.net/qq_56044032/article/details/128129321