Abel's tech blogAbel's tech blog
  • 基础知识
  • 面向对象
  • IO流
  • String
  • 异常处理机制
  • 多线程
  • 反射机制
  • JVM相关知识
  • 数据库基础
  • 数据库进阶
  • 复杂SQL语句
  • Redis
  • Spring-IOC
  • Spring-AOP
  • Spring-Test
  • SpringBoot
  • SpringMVC
  • MyBatis
  • 基于MyBatis的分页查询
  • SpringSecurity
  • 微服务概念
  • Nacos
  • Dubbo
  • Seata
  • Sentinel
  • SpringGateway网关
  • ELK
  • Quartz
  • 消息队列
  • 数据结构
  • 算法
  • TCP/IP
  • 交换机
  • 路由器
  • Docker
  • Kubernetes
  • Linux
  • 各类工具

    • 菜鸟工具
    • 菜鸟教程
    • IDEA下载
    • 数据结构和算法可视化网站
    • jwt解析
    • maven仓库
  • 开发文档

    • Java 8 API 文档
    • Java 17 API 文档
    • MyBatis 3 中文
    • MyBatis-spring 中文
    • Spring Framework 5 API DOC
    • Spring Framework 6 API DOC
    • SpringBoot 2.7.6 API DOC
    • SpringBoot 3 API DOC
    • Hypertext Transfer Protocol -- HTTP/1.0
  • 配置文件下载

    • 阿里云Maven仓库配置
    • Nginx反向代理配置模板
    • JavaScript组件库
  • JDK 8 Windows x86 64-bit
  • JDK 17 Windows x86 64-bit
  • Maven
  • IntelliJ IDEA 各版本
  • Git
  • 基础知识
  • 面向对象
  • IO流
  • String
  • 异常处理机制
  • 多线程
  • 反射机制
  • JVM相关知识
  • 数据库基础
  • 数据库进阶
  • 复杂SQL语句
  • Redis
  • Spring-IOC
  • Spring-AOP
  • Spring-Test
  • SpringBoot
  • SpringMVC
  • MyBatis
  • 基于MyBatis的分页查询
  • SpringSecurity
  • 微服务概念
  • Nacos
  • Dubbo
  • Seata
  • Sentinel
  • SpringGateway网关
  • ELK
  • Quartz
  • 消息队列
  • 数据结构
  • 算法
  • TCP/IP
  • 交换机
  • 路由器
  • Docker
  • Kubernetes
  • Linux
  • 各类工具

    • 菜鸟工具
    • 菜鸟教程
    • IDEA下载
    • 数据结构和算法可视化网站
    • jwt解析
    • maven仓库
  • 开发文档

    • Java 8 API 文档
    • Java 17 API 文档
    • MyBatis 3 中文
    • MyBatis-spring 中文
    • Spring Framework 5 API DOC
    • Spring Framework 6 API DOC
    • SpringBoot 2.7.6 API DOC
    • SpringBoot 3 API DOC
    • Hypertext Transfer Protocol -- HTTP/1.0
  • 配置文件下载

    • 阿里云Maven仓库配置
    • Nginx反向代理配置模板
    • JavaScript组件库
  • JDK 8 Windows x86 64-bit
  • JDK 17 Windows x86 64-bit
  • Maven
  • IntelliJ IDEA 各版本
  • Git

测试

分类:

单元测试:用于测试一个功能单元,用于测试业务层的(不带持久层),不需要使用Spring容器
集成测试:用于测试多层,测试业务层+持久层属于集成,测试控制器+业务层+持久层也是属于集成测试。通常集成测试都需要使用SPring容器

Junit5测试

从SpringBoot2.2版本开始的默认JUnit
需要Java8环境,可以使用lambda表达式

Junit5常用测试注解

@Test - 放在测试方法上方,可以直接启动该方法
@BeforeEach -- 作用于测试方法上方,表示在每个测试方法执行之前都会调用该方法
@AfterEach -- 作用于测试方法上方,表示在每个测试方法执行之后都会调用该方法
@BeforeAll  -- 作用于方法上方,表示在所有测试方法执行之前执行,且只执行一次,要求该方法为static
@AfterAll  -- 作用于方法上方,表示在所有测试方法执行之后执行,且只执行一次,要求该方法为static

断言 -- 自动化测试会使用

1. 静态导入断言库
  import static org.junit.jupiter.api.Assertions.*;
2. 方法:
  assertEquals(expect,actual)
  assertNull(result)
  assertNotNull(result)
  assertTrue(result)
  assertFalse(result)
  assertThrows(Exception.class,()->{})

mock测试,应用于单元测试中的 -- 模拟测试

如果不想让对业务层的测试对数据库的真实数据造成影响,此时可以采用mock测试,可以对持久层对象进行模拟并训练,从而解决对数据库的影响问题。

模拟bean测试.png

mock测试使用的步骤

1. 静态导入模拟库
  static org.mockito.Mockito.*;
2. 获取模拟对象
  mock(Class) -- 得到对应的mockBean对象
3. 对mock Bean进行训练
  when(userDao.addUser(User)).thenReturn(1);
4. 进行单元测试,根据训练的结果进行一些自动化测试(断言)

Spring集成测试

在测试类上放添加注解
  @ExtendWith(SpringExtension.class)
  @ContextConfiguration(classes = Config.class)
  
或者
  @SpringJUnitConfig(Config.class)
  
则可以使用上下文对象,也可以注入对象,直接使用。
  • 注意点:上下文

    测试过程中,如果需要,可以在某个测试方法结束后,选择关闭上下文,使用注解@DirtiesContext即可,其他测试方法执行时,会重新获取新的上下文对象
        
    如何测试上下文对象是一个还是两个?
        写两个测试方法,分别输出同一个Bean对象,观察输出的引用
        	- 结果一致,说明是从同一个上下文对象获取
        	- 结果不一致,说明是从两个上下文对象获取到的
    

SpringBoot集成测试

SpringBoot进行集成测试,使用注解@SpringBootTest即可,无需指定配置文件,其他操作和Spring集成测试一致。
  • 业务层+持久层的集成测试

  • web测试

    • TestRestTemplate集成测试 - 启动web容器
    1. SpringBoot测试框架会自动启动内嵌服务器
    2. 通过SpringBoot自动配置的TestRestTemplate Bean对象来发起请求
        - 发送get请求,调用方法 getForObject(....)
        - 发送post请求,调用postForObject(.....)
    3. web集成测试的时候,webEnvironment支持以下模式
        RANDOM_PORT, DEFINED_PORT, MOCK, NONE
    
    • 注意点:

      发送get请求:
          //get请求传参是在请求后通过?拼接参数
              String url = "/users/login?userName={username}&pwd={password}";
              String mes = template.getForObject(url,String.class,"tom","123");
              assertEquals("登录成功!",mes);
      发送post请求:
           //定义相对路径
              String url = "/users/regist";
              //post请求传参,参数必须是MultiValueMap类型
              MultiValueMap<String,Object> map = new LinkedMultiValueMap<>();
              map.add("userName","张三");
              map.add("pwd","123");
              //发起post请求
              String mes = template.postForObject(url,map,String.class);
              assertEquals("注册成功!",mes);