10、SpringBoot_测试用例

四、测试用例

1.准备工作

  • 添加依赖

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.15</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency>
    
  • 写mapper

    @Mapper
    @Repository
    public interface ItemMapper {@Insert("insert into item(name,remark) value(#{name},#{remark})")boolean insert(Item item);@Select("select * from item where id = #{id}")public Item getById(Long id);}
    
  • 写接口

    @RestController
    @RequestMapping("/item")
    @Slf4j
    public class ItemController {@AutowiredItemMapper mapper;@GetMapping("/{id}")public Item getById(@PathVariable Long id){return mapper.getById(id);}@PostMappingpublic boolean save(@RequestBody Item item){log.info("获取方法的入参为:{}",item);return mapper.insert(item);}}
    
  • 写 domain

    @Data
    public class Item {private Long id;private String name;private String remark;
    }
    
  • 提供配置文件

    spring:datasource:druid:url: jdbc:mysql://localhost:3306/springboot_ssmusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver
    

2.Web环境模拟测试

2.1目前存在的问题

  • 实际测试没有走mvcweb环境,是直接调用接口的

    @SpringBootTest
    class SpringbootTestApplicationTests {@AutowiredItemController controller;@Testpublic void testSave(){Item item = new Item();item.setName("键盘");item.setRemark("1000元");controller.save(item);}
    }
    
  • 数据是实际添加到数据库的,应该回滚

  • 缺乏实际返回值的对比

2.2模拟web环境测试

  • 添加如下属性

    @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
    

    在这里插入图片描述

  • 开启虚拟mvc调用

    @AutoConfigureMockMvc
    
  • 测试一个请求方法

    @Testpublic void getById(@Autowired MockMvc mvc) throws Exception {// @Autowired MockMvc mvc   也可以通过设置全局变量进行注入//创建虚拟请求的MockHttpServletRequestBuilder builder =MockMvcRequestBuilders.get("/item/29");mvc.perform(builder);}
    

2.3预期结果比较

  • 对于请求结果的比对,使用andExcept方法比较

    • 比较请求状态码

      @Testpublic void getById(@Autowired MockMvc mvc) throws Exception {//创建虚拟请求的MockHttpServletRequestBuilder builder =MockMvcRequestBuilders.get("/item/20");ResultActions actions = mvc.perform(builder);//定义请求结果的预期值ResultMatcher ok = MockMvcResultMatchers.status().isOk();actions.andExpect(ok);}
      
    • 比较实际返回值

      @Testpublic void getById(@Autowired MockMvc mvc) throws Exception {//创建虚拟请求的MockHttpServletRequestBuilder builder =MockMvcRequestBuilders.get("/item/20");ResultActions actions = mvc.perform(builder);//定义请求结果的预期值ResultMatcher ok = MockMvcResultMatchers.status().isOk();actions.andExpect(ok);//比较你实际结果值ResultMatcher json = MockMvcResultMatchers.content().json("{\n" +"  \"id\": 20,\n" +"  \"name\": \"笔记本电脑\",\n" +"  \"remark\": \"1二手电脑只要一千块\"\n" +"}");actions.andExpect(json);}
      
      • 如果返回值和实际不匹配会提示如下错误在这里插入图片描述
    • 比较响应头

      	    @Testpublic void getByIdHeader(@Autowired MockMvc mvc) throws Exception {//创建虚拟请求的MockHttpServletRequestBuilder builder =MockMvcRequestBuilders.get("/item/20");ResultActions actions = mvc.perform(builder);//比较响应头ResultMatcher header = MockMvcResultMatchers.header().string("Content-Type","application/json");actions.andExpect(header);}
      
    • 发起post 请求直接在 content 中添加json转字符串即可

            @Testpublic void postItemBoolean(@Autowired MockMvc mvc,@Autowired ItemTest itemTest) throws Exception {Item item = new Item();item.setName("键盘111");item.setRemark("1000元1111");System.out.println("==================");System.out.println(itemTest);//创建虚拟请求的MockHttpServletRequestBuilder builder =MockMvcRequestBuilders.post("/item");builder.contentType("application/json");builder.accept(MediaType.APPLICATION_JSON);ObjectMapper objectMapper = new ObjectMapper();String s = objectMapper.writeValueAsString(itemTest);builder.content(s);ResultActions actions = mvc.perform(builder);MvcResult mvcResult = actions.andReturn();System.out.println(mvcResult.getResponse().getStatus());ResultMatcher ret = MockMvcResultMatchers.content().string("true");actions.andExpect(ret);}
      

2.4.测试用例数据设定###

  • 直接提供配置即可

    testcase:item:name: ${random.int(5)}remark: ${random.int(5)}
    
  • domain

    @ConfigurationProperties(prefix = "testcase.item")
    @Component
    @Data
    public class ItemTest {private String name;private String remark;
    }
    

2.5数据层测试回滚

  • 使用注解 rollback + Transactional

    @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
    //开启虚拟mvc的调用
    @AutoConfigureMockMvc
    @Rollback
    @Transactional
    class SpringbootTestApplicationTests {
    }
    
  • 开启事务和回滚之后,数据就不会写入数据库了。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ELK 处理 SpringCloud 日志

在排查线上异常的过程中&#xff0c;查询日志总是必不可缺的一部分。现今大多采用的微服务架构&#xff0c;日志被分散在不同的机器上&#xff0c;使得日志的查询变得异常困难。工欲善其事&#xff0c;必先利其器。如果此时有一个统一的实时日志分析平台&#xff0c;那可谓是雪…

2023年电工(初级)证考试题库及电工(初级)试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年电工&#xff08;初级&#xff09;证考试题库及电工&#xff08;初级&#xff09;试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#…

mysql面试题40:列值为null或者空字符串时,查询是否会用到索引?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:列值为null或者空字符串时,查询是否会用到索引? 当列的值为NULL时,查询可能会使用索引,但具体是否使用索引取决于数据库的优化器和查询条件。…

Compose 编译器版本和Kotlin版本对应关系

使用了最新的kotlin版本&#xff0c;compose报错&#xff0c;不兼容&#xff0c;在这里记录一下版本对应关系 值得注意的是Compose Kotlin 编译器扩展 (androidx.compose.compiler) 未关联到 Compose 库版本。相反&#xff0c;它会关联到 Kotlin 编译器插件的版本&#xff0c;…

【SoC FPGA】HPS启动过程

SoC HPS启动流程 Boot ROMPreloaderBoot Loader HPS的启动是一个多阶段的过程&#xff0c;每一个阶段都会完成对应的工作并且将下一个阶段的执行代码引导起来。每个阶段均负责加载下一个阶段。第一个软件阶段是引导 ROM&#xff0c;引导 ROM 代码查找并且执行称为预加载器的第 …

【ArcGIS】NDVI估算植被覆盖度FVC

NDVI计算 植被覆盖度计算 Step1&#xff1a;调出栅格计算器工具 1、首先打开软件&#xff0c;然后在操作页面点击&#xff0c;自定义工具栏中——自定义模式。 2、再点击窗口中的命令选项。 3、在窗口右上角处搜索“栅格计算”。 4、然后&#xff0c;直接将栅格计算器直接…

Linux C select 的学习

一. select 系统调用 1. 函数说明 #include <sys/select.h> #include <sys/time.h>int select(int nfds, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout);nfds: 是一个整数值&#xff0c;是指集合中所有文件描述符的范围&#…

SpringBoot 接口 字节数组直接显示为图片

源码&#xff1a; import java.io.ByteArrayOutputStream; import javax.imageio.ImageIO; import org.springframework.web.bind.annotation.RequestMapping;/*** 获取二维码图像* 二维码支付** param price 金额* return 二维码图像* throws IOException IOException*/ Requ…

Windows Nginx 服务器部署(保姆级)

大家好 我是寸铁 不知道怎么部署Windows Nginx 服务器看过来 手把手带你部署服务器 将你的本地网页部署到服务器上 话不多说&#xff0c;直接上操作&#xff01;&#xff01;&#xff01; Windows Nginx服务器部署 进入下载地址&#xff1a; http://nginx.org/en/download.h…

stm32学习笔记:中断的应用:对射式红外传感器计次旋转编码器计次

相关API介绍 EXT配置API(stm32f10x exti.h&#xff09; NVIC 配置API (misc.h) 初始化的中断的步骤 第一步&#xff1a;配置RCC时钟&#xff0c;把涉及外设的时钟都打开 第二步&#xff1a;配置GPIO&#xff0c;设置为输入模式 第三步&#xff1a;配置AFIO&#xff0…

VsCode同时编译多个C文件

VsCode默认只能编译单个C文件&#xff0c;想要编译多个文件&#xff0c;需要额外进行配置 第一种方法 ——> 通过手动指定要编译的文件 g -g .\C文件1 .\C文件2 -o 编译后exe名称 例如我将demo.c和extern.c同时编译得到haha.exe g -g .\demo.c .\extern.c -o haha 第二种…

移动应用-Android开发基础\核心知识点

Android开发基础 知识点 1 介绍了解2 系统体系架构3 四大应用组件4 移动操作系统优缺点5 开发工具6 配置工具7 下载相关资源8JDK下载安装流程9配置好SDK和JDK环境10 第一个Hello word11 AS开发前常用设置12模拟器使用运行13 真机调试14 AndroidUI基础布局15 加载展示XML布局16…

dll动态链接库及ocx activex 控件regsvr32注册失败 解决方法(Win10)

一、错误提示说明&#xff1a; 1、regsvr32注册dll或ocx activex控件时提示模块 dll加载失败&#xff0c;请确保该二进制存储在指定的路径中&#xff0c;或者调试它以检查该二进制或相关的.dll文件是否有问题”。 检查了.dll文件路径也没有问题&#xff0c;在开发机器上是可以…

【Java 进阶篇】JavaScript三元运算符详解

JavaScript是一门广泛用于前端和后端开发的编程语言&#xff0c;具备强大的表达式和运算符。本篇博客将重点介绍JavaScript中的三元运算符&#xff0c;解释其语法、用法和示例。如果您是JavaScript初学者&#xff0c;或者希望更深入了解这门语言的运算符&#xff0c;那么这篇博…

适合自学的网络安全基础技能“蓝宝书”:《CTF那些事儿》

CTF比赛是快速提升网络安全实战技能的重要途径&#xff0c;已成为各个行业选拔网络安全人才的通用方法。但是&#xff0c;本书作者在从事CTF培训的过程中&#xff0c;发现存在几个突出的问题&#xff1a; 1&#xff09;线下CTF比赛培训中存在严重的 “最后一公里”问题 &#…

鉴源实验室 | AUTOSAR SecOC:保障汽车通信的安全

作者 | 沈平 上海控安可信软件创新研究院汽车网络安全组 来源 | 鉴源实验室 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 在现代汽车行业中&#xff0c;随着电子控制单元&#xff08;ECUs&#xff09;的普及以及车与车之间通信的不断增加&#xff0c;确…

【Linux 安装Kibana 及 Es 分词器安装】

一、客户端Kibana安装 Kibana是一个开源分析和可视化平台&#xff0c;旨在与Elasticsearch协同工作。参考文档 1. 下载并解压缩Kibana 下载路径 选择的版本是和 ElasticSearch 对应&#xff08;7.17.3&#xff09; 下载后上传到Linux 系统中&#xff0c;并放在 /root/ 下&a…

利达卓越:关注环保事业,持续赋能科技

随着全球环境问题的日益突出,绿色金融作为一种新兴的金融模式逐渐受到各国的重视。绿色金融是指在金融活动中,通过资金、信贷和风险管理等手段,支持环境友好和可持续发展的项目和产业。绿色金融的出现是为了应对气候变化、资源短缺、污染问题等现实挑战,促进经济的绿色转型和可…

Unity可视化Shader工具ASE介绍——6、通过例子说明ASE节点的连接方式

大家好&#xff0c;我是阿赵。继续介绍Unity可视化Shader编辑插件ASE的用法。上一篇已经介绍了很多ASE常用的节点。这一篇通过几个小例子&#xff0c;来看看这些节点是怎样连接使用的。   这篇的内容可能会比较长&#xff0c;最终是做了一个遮挡X光的效果&#xff0c;不过把这…

Kotlin函数作为参数指向不同逻辑

Kotlin函数作为参数指向不同逻辑 fun sum(): (Int, Int) -> Int {return { a, b -> (a b) } }fun multiplication(): (Int, Int) -> Int {return { a, b -> (a * b) } }fun main(args: Array<String>) {var math: (Int, Int) -> Intmath sum()println(m…