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.mzph.cn/news/102484.shtml

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

相关文章

MAVEN_HOME与M2_HOME的区别

参考文件&#xff1a;maven - What is the difference between M2_HOME and MAVEN_HOME - Stack Overflow MAVEN_HOME适用于 Maven 1&#xff0c;M2_HOME适用于 Maven 2 及更高版本。 Maven 2 是对 Maven 1 的完全重写&#xff0c;并且不向后兼容。拥有两个不同的_HOME变量意…

RabbitMQ详细使用

工作队列 注意事项&#xff1a;一个消息只能被处理一次&#xff0c;不可以处理多次 轮询分发信息 消息应答 消费者在接收到消息并且处理该消息之后&#xff0c;告诉rabbitmq它已经处理了&#xff0c;rabbitmq可以把该消息删除了。倘若mq没有收到应答&#xff0c;mq会将消息转…

uniapp上echarts地图钻取

1: 预期效果 通过切换地图 , 实现地图的钻取效果 2: 实现原理以及核心方法/参数 一开始是想利用更换地图数据的形式进行地图钻取 , 这就意味着我们需要准备全国30多个省份的地图数据 , 由于一开始考虑需要适配小程序端 , 如此多的地图文件增加了程序的体积 , 如果使用接口调…

ubuntu22.04 电脑声音和腾讯会议等声音很小怎么修复

电脑的声音很小&#xff0c;特别是开微信会议的时候几乎听不到声音&#xff0c;而声音设置都已经设置为最大 这时候就是用命令 alsamixer腾讯会议的声音 调整这两个声音的大小即可 H键弹出帮助菜单 F6按键选择声卡 左右按键选择轨道 M键静音所选轨道 上下按键调整音量…

数据采集平台项目(四)

1. DataX中null值的输出 mysql经过dataX的传输后&#xff0c;默认会将null转换为空字符串""&#xff0c;而hive中默认的null值存储格式为\N. 解决方案&#xff1a; 修改datax底层源码修改hive默认null值为空字符串 2. Hive的安装 解压安装&#xff0c;修改文件名…

【数据结构】二叉树--链式结构的实现 (遍历)

目录 一 二叉树的遍历 1 构建一个二叉树 2 前序遍历 3 中序遍历 4 后续遍历 5 层序 6 二叉树销毁 二 应用(递归思想) 1 二叉树节点个数 2 叶子节点个数 3 第K层的节点个数 4 二叉树查找值为x的节点 5 判断是否是二叉树 一 二叉树的遍历 学习二叉树结构&#xff0…

python集合的应用场景

Python中的集合&#xff08;set&#xff09;是一种无序且不重复的数据结构&#xff0c;它可以用于存储多个元素。集合可以用于解决很多问题&#xff0c;以下是一些常见的应用场景及相应的代码示例&#xff1a; 去重&#xff1a;集合可以快速去重&#xff0c;只保留不重复的元素…

HQChart支持的画图工具列表

HQChart支持的画图工具列表 线段类线段射线标价线垂直线箭头趋势线水平线水平线段平行射线平行线平行通道价格通道线M头W底头肩型波浪尺AB波浪尺箱型线涂鸦线段 图形类圆弧线矩形平行四边形三角形圆对称角度 文字类文本箭头NoteAnchoredTextPriceLabelPriceNote 其他江恩角度线…

华纳云:SQL Server怎么批量导入和导出数据

在SQL Server中&#xff0c;您可以使用不同的方法来批量导入和导出数据&#xff0c;具体取决于您的需求和数据源。以下是一些常见的方法&#xff1a; 批量导入数据&#xff1a; 使用SQL Server Management Studio (SSMS) 导入向导&#xff1a; 打开SQL Server Management Stud…

Linux:redis集群(3.*版本 和 5.*版本)搭建方法

介绍 至少6个实例才能组成集群。3主3从会自动分配 Redis集群原理 Redis集群架构 Redis Cluster采用虚拟槽分区&#xff0c;将所有的数据根据算法映射到0~16383整数槽内 Redis Cluster是一个无中心的结构 每个节点都保存数据和整个集群的状态 集群角色 Master&#xff1a;Master…

YOLOv7改进策略:RIFormerBlock助力检测|CVPR2023 RIFormer:无需TokenMixer也能达成SOTA性能的极简ViT架构

💡💡💡本文属于原创独家改进: 稀疏重参数RIFormerBlock模型引入YOLOv7进行创新性 RIFormerBlock | 亲测在多个数据集实现涨点; 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c ✨✨✨前沿最新计算机顶会复现 🚀🚀🚀YOLOv7自研创新结合,轻松…

C++课程总复习

一、c的第一条程序 1.cout cout >输出类对象&#xff0c;用来输出的&#xff0c;可以自动识别类型&#xff0c;所以不需要加格式符号 << 插入符&#xff08;输出符号&#xff09; endl 换行>\n #include <iostream> //#预处理 //include 包含 相应的头…

php倒叙

在PHP中&#xff0c;可以使用多种方法对数组进行倒序排序。 使用array_reverse()函数&#xff1a;这是最简单的方法&#xff0c;它可以将数组元素的顺序完全颠倒。 $arr [3, 1, 5, 2, 4]; $reversedArr array_reverse($arr); print_r($reversedArr); // 输出&#xff1a;Arra…

Arduino安装esp32-cam以及CameraWebServer实例的实现

目录 1. 硬件2. 软件2.1 arduino下载安装2.2 arduino配置esp32-cam开发板文件2.3 下载相应版本的esp32 3. ESP32-CAM实例&#xff1a;CameraWebServer3.1 选择开发板3.2 选择示例代码进行验证3.3 烧录进行实测 1. 硬件 没买下载主板的可使用usb转串口模块进行烧录&#xff0c;接…

【Linux】UNIX 术语中,换页与交换的区别和Linux 术语中,换页与交换的区别?

UNIX换页和交换的区别 在UNIX中&#xff0c;换页&#xff08;Paging&#xff09;是一种内存管理技术&#xff0c;用于在程序运行时动态地将其代码和数据从磁盘加载到内存中。当程序需要访问的页面不在内存中时&#xff0c;就会发生页错误&#xff08;page error&#xff09;&a…

2023C语言暑假作业day6

1.选择题 1 1、以下叙述中正确的是&#xff08; &#xff09; A: 只能在循环体内和switch语句体内使用break语句 B: 当break出现在循环体中的switch语句体内时&#xff0c;其作用是跳出该switch语句体&#xff0c;并中止循环体的执行 C: continue语句的作用是&#xff1a;在执…

软考 系统架构设计师系列知识点之软件质量属性(4)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之软件质量属性&#xff08;3&#xff09; 所属章节&#xff1a; 第8章. 系统质量属性与架构评估 第2节. 面向架构评估的质量属性 相关试题 3. 某公司欲开发一个在线交易系统。在架构设计阶段&#xff0c;公司的架构师…

小程序:下拉刷新+上拉加载+自定义导航栏

下拉刷新 &#xff1a; <scroll-view scroll-y"true" 允许纵向滚动 refresher-enabled"true" 开启自定义下拉刷新 默认为false :refresher-triggered&quo…

【uniapp+uView框架】验证码倒计时代码

<view class"code-btn flex flex-center" click"getCode"> {{countdown}}<u-verification-code :seconds"60" ref"uCode" change"codeChange"></u-verification-code> </view>// 保存倒计时提示 co…

iOS 获取模拟器沙盒路径

xcrun simctl get_app_container booted Bundle Identifier data