【开发篇】三、web下单元测试与mock数据

news2024/11/19 8:24:58

文章目录

  • 1、加载测试专用属性
  • 2、加载测试专用配置
  • 3、测试类中启动web环境
  • 4、发送虚拟请求
  • 5、匹配(断言)响应的执行状态
  • 6、匹配响应的结果
  • 7、匹配响应头
  • 8、业务层测试事务回滚
  • 9、UT数据设置随机数据

请添加图片描述

1、加载测试专用属性

写单元测试时,如果需要一个临时属性,但不能影响其他代码(即作用范围是当前UT类),有两种方式实现:

方式一:使用@SpringBootTest注解的properties属性

模块配置中,有一个test.prop属性:

test:
  prop: 9527

在UT中做临时修改:

@SpringBootTest(properties = {"test.prop=testValue1"})
public class PropertiesAndArgsTest {

    @Value("${test.prop}")    
    private String msg;    
    
    @Test    
    void testProperties(){        
   		System.out.println(msg);    
    }
}

以上这个写法:比多环境开发中的测试环境影响范围更小,仅对当前测试类有效。

方式二:使用args属性

在启动测试环境时可以通过args参数设置测试环境专用的传入参数:

@SpringBootTest(args = {"--test.prop=testValue2"})
public class PropertiesAndArgsTest {

    @Value("${test.prop}")    
    private String msg;    
    
    @Test    
    void testProperties(){        
   		System.out.println(msg);    
    }
}

以上这个args,就类比命令行参数启动、在启动类的args上赋值,–server.port=8080这个格式,第一种方式则类比properties文件,因此,当这两种方式同时设置一个属性时,args的方式优先级更高,生效。 以上这个加载测试临时属性,亮点是不影响其他UT或者其他模块代码,仅对当前测试类生效。

2、加载测试专用配置

源码中有一个Bean,定义了相关配置,如之前的MyBatisPlus的分页拦截器。那如何在UT里加一个配置Bean来辅助测试,且仅服务于这个UT类,如此,也不会引起配置冲突问题。先在test目录下定义一个配置Bean(肯定不能定义到com.src的实际源码里):

在这里插入图片描述

接下来使用@Import注解加载当前测试类专用的配置Bean

@SpringBootTest
@Import(MsgConfig.class)
public class ConfigurationTest {   
 
	@Autowired    
	private String msg;   
	
	@Test    
	void testConfiguration(){
	    System.out.println(msg);
	}
}

在这里插入图片描述

3、测试类中启动web环境

平时写的测试Mapper和Service层方法的UT,就是一个普通的Java程序,没有web环境,想在web环境下启动,可以使用@SpringBootTest注解的webEnvironment属性。

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class WebTest {    
	@Test    
		void testRandomPort () {    
	}
}

其中,属性取值可以为:使用源代码里定义的端口、随机端口、不启用web(默认)…

在这里插入图片描述
在这里插入图片描述

4、发送虚拟请求

在测试类中开启Web环境后,接下来在UT中直接测Controller层的接口:

  • 开启虚拟MVC调用
  • 注入MockMvc对象
  • 创建虚拟对象,传入接口路径
  • 执行请求
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
//开启虚拟MVC调用
@AutoConfigureMockMvc
public class WebTest {
    @Test
    //注入虚拟MVC调用对象
    public void testWeb(@Autowired MockMvc mvc) throws Exception {        
    	//创建虚拟请求,当前访问/books
        MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
        //执行请求        
        ResultActions action = mvc.perform(builder);    
    }
}

以上并不是一次正真的调用,而是虚拟出来了一套Web环境,在这个虚拟环境中发起了这次调用。记得加@AutoConfigureMockMvc开启需求Mvc调用,否则MockMvc这个Bean注入不上,至于注入写在形参里还是属性里,都行。

5、匹配(断言)响应的执行状态

在发送完虚拟请求调用接口后,接下来对请求响应的状态做一个匹配(断言):

  • 获取执行结果
  • 定义执行状态匹配器
  • 定义预期状态
  • 对比预期状态和真实状态
@Test
public void testSataus(@Autowired MockMvc mvc) throws Exception {    
	MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books/1");    
	ResultActions action = mvc.perform(builder);
	//匹配执行状态(是否预期值)    
	//定义执行状态匹配器    
	StatusResultMatchers status = MockMvcResultMatchers.status();    
	//定义预期执行状态    
	ResultMatcher ok = status.isOk();
	//使用本次真实执行结果与预期结果进行比对
	action.andExpect(ok);
}

写个不存在的路径,执行结果:

在这里插入图片描述

6、匹配响应的结果

和匹配状态一样,先看响应一个String的情况:

@Test
public void testSataus(@Autowired MockMvc mvc) throws Exception {    
	MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books/1");    
	ResultActions action = mvc.perform(builder);
	//匹配执行结果(是否预期值)    
	//定义执行结果匹配器    
	ContentResultMatchers content = MockMvcResultMatchers.content();    
	//定义预期执行结果    
	ResultMatcher result = content.string("test1");
	//使用本次真实执行结果与预期结果进行比对
	action.andExpect(result);
}

在这里插入图片描述

当预期结果是一个json时:

ResultMatcher result = content.json("{\"id\":1,\"name\":\"SpringBoot2\"}");

7、匹配响应头

大同小异,步骤一致:

@Test
public void testContentType(@Autowired MockMvc mvc) throws Exception {
    MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
    ResultActions action = mvc.perform(builder);
    //匹配器
    HeaderResultMatchers header = MockMvcResultMatchers.header();
    //预期结果
    ResultMatcher resultHeader = header.string("Content-Type", "application/json");
    action.andExpect(resultHeader);
}

正常写UT时,这三个连一起就行,比如,先获取执行状态匹配器,再定义预期,然后做匹配。再响应头、响应结果…

8、业务层测试事务回滚

在UT时,不让方法执行给数据库带来脏数据,可以加事务注解@Transactional,在有@SpringBootTest注解的情况下,Spring会识别到我们在做UT而回滚事务。

@SpringBootTest
@Transactional
public class DaoTest {

    @Autowired
    private BookService bookService;

	@Test
	void testSave(){
		bookservice.save(new Book());
	}

}

如果想在测试用例中提交事务,可以通过@Rollback注解,并设置value属性为false:

@SpringBootTest
@Transactional
@Rollback(false)  # 此时,会提交事务,即会影响数据库
public class DaoTest {

}

9、UT数据设置随机数据

测试用例数据通常采用随机值进行测试,使用SpringBoot提供的随机数为其赋值,举个例子:

testcast:
  book:
      id: ${random.int}           # 随机整数    
      id2: ${random.int(10)}      # 10以内随机数    
      type: ${random.int(10,20)}  # 10到20随机数    
      uuid: ${random.uuid}        # 随机uuid    
      name: ${random.value}       # 随机字符串,MD5字符串,32位    
      publishTime: ${random.long} # 随机整数(long范围)

注意:

  • ${random.int}表示随机整数
  • ${random.int(10)}表示10以内的随机数
  • ${random.int(10,20)}表示10到20的随机数
  • 其中表示范围的圆括号()可以是任意字符,例如[ ],!!均可

定义个实体类绑定下随机生成的数据:

在这里插入图片描述

测试类看下效果:

@Autowired
private Book book;

@Test
void testData(){
	System.out.println(book);
}

写懵了,刚开始竟然直接输出了一个new的Book对象,对象于Bean,前者不受Spring管控,也就是说Spring拿到随机数据也不能赋值给它,这个对象必须是Bean,所以改为了自动注入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1032200.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PyTorch实战:卷积神经网络详解+Python实现卷积神经网络Cifar10彩色图片分类

目录 前言 一、卷积神经网络概述 二、卷积神经网络特点 卷积运算 单通道,二维卷积运算示例 单通道,二维,带偏置的卷积示例 带填充的单通道,二维卷积运算示例 Valid卷积 Same卷积 多通道卷积计算 1.局部感知域 2.参数共…

常见弱口令汇编

一、OA办公系统常见弱口令 (一)致远OA system用户(默认密码:system,对应A8的系统管理员、A6的单位管理员) group-admin(默认密码:123456,对应A8集团版的集团管理员&am…

百度知道本地搭建环境无限制采集聚合【最新版】

本工具是本地php环境搭建,根据关键词进行采集聚合某度知道,不限制ip,最新版新添加了违规词过滤,样式处理,自动匹配优质标题等功能,只需要导入关键词可以无限采集,是养站的好帮手! 功…

BOM与DOM--记录

BOM基础(BOM简介、常见事件、定时器、this指向) BOM和DOM的区别和联系 JavaScript的DOM与BOM的区别与用法详解 DOM和BOM是什么?有什么作用? 图解BOM与DOM的区别与联系 BOM和DOM详解 JavaScript 中的 BOM(浏览器对…

怎么将几张图片做成pdf合在一起

怎么将几张图片做成pdf合在一起?在我们平时的工作中,图片和pdf都是非常重要的电脑文件,使用也非常频繁,图片能够更为直观的展示内容,而pdf则更加的正规,很多重要文件大多会做成pdf格式的。在职场人的日常工…

ThePASS 研究院|探索 Aragon:开创性的 DAO 基础设施实现全面治理

这篇研究文章由 ThePASS 团队呈献,同时感谢 Aragon Growth Guild 的校对。The PASS 是一个开创性的 DAO 聚合器和搜索引擎,目前是最大的DAO数据来源,在为 DAO 提供洞见和分析方面起着关键作用。 介绍 DAO的诞生源于一个简单的理念&#xff…

BLE Mesh蓝牙mesh传输大数据包传输文件照片等大数据量通讯

1、BLE Mesh数据传输现状 BLE Mesh网络技术是低功耗蓝牙的一个进阶版,Mesh扩大了蓝牙在应用中的规模和范围,因为它同时支持超过三万个网络节点,可以跨越大型建筑物,不仅可以使得医疗健康应用更加方便快捷,还能监测像学…

前端三件套速成

一、HTML 1、基本的文档结构 <!doctype html> <html lang"en-US"><head><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width" /><title>My test page</title></…

API文档搜索引擎

导航小助手 一、认识搜索引擎 二、项目目标 三、模块划分 四、创建项目 五、关于分词 六、实现索引模块 6.1 实现 Parser类 6.2 实现 Index类 6.2.1 创建 Index类 6.2.2 创建DocInfo类 6.2.3 创建 Weight类 6.2.4 实现 getDocInfo 和 getInverted方法 6.2.5 实现 …

解析数据库的“四世同堂”,畅聊数据前沿技术!

引言 数据库与大数据一直是技术圈的两个常青领域。PC 时代诞生了最早的关系型数据库&#xff0c;之后数据类型越来越多&#xff0c;出现了各种非关系型数据库。云时代拉开序幕的同时&#xff0c;“大数据”一词也被广泛使用&#xff0c;涵盖海量数据的采集、处理、存储、分析和…

【数模研赛思路】2023华为杯研究生数学建模竞赛选题建议及CDEF题思路

大家好呀&#xff0c;全国研究生数学建模竞赛今天早上开赛啦&#xff0c;在这里先带来初步的选题建议及思路。 目前团队正在写E题完整论文&#xff0c;此外C已经完成了第一问代码及结果&#xff0c;本文章只是一个比较粗略的文字版思路&#xff0c;更加详细的半小时视频讲解版…

React 全栈体系(十二)

第六章 React UI 一、流行的开源 React UI 组件库 1. material-ui(国外) 官网: http://www.material-ui.com/#/github: https://github.com/callemall/material-ui 2. ant-design(国内蚂蚁金服) 官网: https://ant.design/index-cnGithub: https://github.com/ant-design/…

企业虚拟化KVM的三种安装方式(1、完全文本2、模板镜像+配置文件3、gustos图形方式部署安装虚拟机)

一、安装完虚拟机后的操作 第一步: 第二步&#xff1a;分配的内存大一下&#xff0c;处理器多些 第三步&#xff1a;打开虚拟化 打开虚拟机、安装KVM 一般企业如果使用kvm虚拟化平台&#xff0c;都会把物理服务器装成Centos的操作系统&#xff0c;然后装上kvm&#xff0c;创建…

创龙TL6678F开发板: 实现FPGA与DSP之间 SRIO(3.125Gbps, 4x)通信

创龙TL6678F开发板官方Demo:SRIO_AD9613 实现了FPGA和DSP之间的SRIO通信, SRIO的速率为5Gbps. 在FPGA端, srio_gen_2 模块的参考时钟为 125MHz. 而Demo: udp_10g_echo 实现了10G以太网通信, ten_gig_eth_pcs_pma模块的参考时钟为156.25 MHz. 两者共用一个 cdcm61002, 且两个参考…

【100天精通Python】Day67:Python可视化_Matplotlib 绘动画,2D、3D 动画 示例+代码

1 绘制2D动画&#xff08;animation&#xff09; Matplotlib是一个Python绘图库&#xff0c;它提供了丰富的绘图功能&#xff0c;包括绘制动画。要绘制动画&#xff0c;Matplotlib提供了FuncAnimation类&#xff0c;允许您创建基于函数的动画。下面是一个详细的Matplotlib动画示…

服务器时间正常,docker容器日志显示时间少了8小时

问题&#xff1a; 项目中docker部署的项目容器日志时间少了8小时。解决&#xff1a; 在Dockerfile添加下面语句&#xff1a; # 设置时区 ENV TZ"Asia/Shanghai"

数字人惯性动作捕捉技术服务,激发吉祥物IP创新活力

近日&#xff0c;2023年成都市全国科普日主场活动启动仪式中&#xff0c;全球首发全国首个科普数字人形象大使“科普熊猫”&#xff0c;在大会活动现场&#xff0c;数字人“科普熊猫”结合惯性动作捕捉技术&#xff0c;与现场主持人、观众进行实时互动交流&#xff0c;以虚实结…

华为云云耀云服务器L实例评测|2核2G跑mysql性能测试

前言 上一次我们介绍了华为云云耀云服务器L实例的基本信息&#xff0c;从购买到特色都做了简要介绍。但是 很多人看到这个配置又产生了迟疑&#xff0c;主要是因为云耀现在提供的全系是2核&#xff0c;性能吃得消吗&#xff1f;今天我们就来做一个性能测试 环境准备 因为我们…

Unity fbx动画压缩自动化

应用场景&#xff1a;Unity WebGl项目&#xff0c;原先的动画压缩后也有20到30M&#xff0c;导致用户进入网页加载太慢。需求是在不对动画精确度造成影响的前提下&#xff0c;影响尽可能地压缩动画。&#xff08;使用的是Maya导出的人体骨骼动画&#xff0c;在动画压缩方式选择…

2023华为杯数学建模研赛思路分享——最全版本F题深度解析

题目回顾&#xff1a; 强对流降水临近预报 我国地域辽阔&#xff0c;自然条件复杂&#xff0c;因此灾害性天气种类繁多&#xff0c;地区差异大。其中&#xff0c;雷雨大风、冰雹、龙卷、短时强降水等强对流天气是造成经济损失、危害生命安全最严重的一类灾害性天气[1]。以202…