10、SpringBoot_测试用例

news2024/10/7 10:16:34

四、测试用例

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 {
    
        @Autowired
        ItemMapper mapper;
    
        @GetMapping("/{id}")
        public Item getById(@PathVariable Long id){
            return mapper.getById(id);
        }
    
        @PostMapping
        public 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_ssm
          username: root
          password: 123456
          driver-class-name: com.mysql.cj.jdbc.Driver
    

2.Web环境模拟测试

2.1目前存在的问题

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

    @SpringBootTest
    class SpringbootTestApplicationTests {
        @Autowired
        ItemController controller;
    
        @Test
        public 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
    
  • 测试一个请求方法

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

2.3预期结果比较

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

    • 比较请求状态码

      @Test
          public 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);
          }
      
    • 比较实际返回值

      @Test
          public 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);
          }
      
      • 如果返回值和实际不匹配会提示如下错误在这里插入图片描述
    • 比较响应头

      	    @Test
      	    public 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转字符串即可

            @Test
            public 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.coloradmin.cn/o/1076204.html

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

相关文章

医药行业投资公司都有哪些?医药企业项目投资分析实用工具

据药融云-投融资数据库信息调研结果发现&#xff0c;在 3000家参与医疗投资的资方中,有超200家专注医疗投资的机构。 资方的信息可以通过垂直的生物医药行业投融资数据库进行查找&#xff0c;该类数据库收载了全球绝大部分的生物医药行业投资机构信息&#xff08;包含了投资机构…

SonarQube学习笔记三:直接使用sonar-scanner扫描器

目录 1.安装Sanner扫描器2.环境变量配置3.创建项目3.1 登录并创建项目3.2 输入项目名称信息3.3 选择分析仓库类型3.4 创建令牌3.5 保存令牌&#xff08;非必须&#xff09;3.6 选择构建技术方案3.6.1 .Net类项目3.6.2 Java类项目 3.7 获取Sonar检查结果3.8 在页面查看检查结果或…

微积分 - 对数函数与指数函数的导数

指数法则 对数法则 换底法则&#xff1a;对于任意的底数b>1和c>1以及任意的数x>0有&#xff1a; 对数函数和指数函数求导 令,那么g的导数是什么&#xff1f;使用导数的定义我们得到&#xff1a; 我们如何来简化这个杂乱的公式呢&#xff1f;当然是使用对数法则了&a…

nodejs+vue 高校社团综合服务系统elementui

在当今高度发达的信息中&#xff0c;信息管理改革已成为一种更加广泛和全面的趋势。为确保中国经济的持续发展&#xff0c; 第三章 系统分析 5 3.1 系统设计目标 6 3.2 系统可行性分析 6 3.3 系统功能分析和描述 7 3.4系统UML用例分析 8 3.4.1管理员用例 9 3.4.2用户用例 9 3.5…

【算法|双指针系列No.3】leetcode202. 快乐数

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

Unity基础课程之物理引擎2-用于射击或者点击消除的射线检测方法

业务逻辑 这段代码实现了一个功能&#xff0c;当玩家按下鼠标左键或按下Q键时&#xff0c;从游戏主角的位置沿着主角的前方方向发射一条射线。如果射线碰撞到了具有Collider触发或碰撞器的游戏物体&#xff0c;则销毁该游戏物体。 程序逻辑 程序的逻辑如下&#xff1a; 1. 在…

SI314软硬件兼容替代GTX314L—低功耗14通道电容触摸传感器

Si314是一款具有自动灵敏度校准功能的14通道电容传感器&#xff0c;其工作电压范围为1.8~5.5V。 Si314设置休眠模式来节省功耗&#xff0c;此时&#xff0c;功耗电流为10uA3.3V。 Si314各个感应通道可实现独立使能、校准、灵敏度调节&#xff0c;可以确保可靠性&#xff0c;且具…

自动化测试框架有哪几种?搭建的思路是什么?完整指南奉上!

前言&#xff1a; 任何成功的自动化测试过程的关键组成部分都是测试自动化框架。降低维护成本&#xff0c;测试工作效率提升和提高质量保证团队的投资回报率ROI是优化敏捷流程时所提供的主要优势之一。 出于以下原因&#xff0c;自动化对于高效的测试过程至关重要&#xff1a…

迅为RK3588开发板使用 tflite 框架

1 TensorFlow Lite 是 TensorFlow 移动和嵌入式设备轻量级解决方案。它使设备机器学习具有低延迟和更小的二进制体积。TensorFlow Lite 同时支持 Android 神经网络 API 的硬件加速。 TensorFlow Lite 使用多项技术降低延迟&#xff0c;例如移动 app 内核优化、pre-fused 激活、…

目标检测数据集格式转换:txt格式转换为xml格式(以VisDrone数据集为例)

1.准备好两个文件夹 VisDroneTxt文件夹里面装的是原图片以及txt格式的标签 VisDroneVoc里面的labels文件夹是目标文件夹&#xff0c;用来装转换之后的xml格式标签 2.给出原转换程序 # .txt-->.xml # ! /usr/bin/python # -*- coding:UTF-8 -*- import os import cv2def t…

如何在 Spring Boot 中进行分布式追踪

在 Spring Boot 中进行分布式追踪 分布式系统中的应用程序由多个微服务组成&#xff0c;它们可以位于不同的服务器、容器或云中。当出现问题时&#xff0c;如性能瓶颈、错误或延迟&#xff0c;了解问题的根本原因变得至关重要。分布式追踪是一种用于跟踪和分析分布式应用程序性…

Ceph入门到精通-Nginx超时参数分析设置

nginx中有些超时设置&#xff0c;本文汇总了nginx中几个超时设置 Nginx 中的超时设置包括&#xff1a; “client_body_timeout”&#xff1a;设置客户端向服务器发送请求体的超时时间&#xff0c;单位为秒。 “client_header_timeout”&#xff1a;设置客户端向服务器发送请…

【Azure 架构师学习笔记】-Azure Data Factory (5) --Data Flow

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Data Factory】系列。 接上文【Azure 架构师学习笔记】-Azure Data Factory (4)-触发器详解-事件触发器 前言 Azure Data Factory&#xff0c; ADF 是微软Azure 的ETL 首选服务之一&#xff0c; 是Azure data platfor…

gogs和drone如何配合使用

上篇介绍了drone和gogs安装方法&#xff0c;这次介绍这两个如何使用&#xff0c;此篇文章主要介绍在物理机上进行发布。 此处用到的java项目地址&#xff1a;https://gitee.com/huningfei/demo-test 一 配置gogs 1.1 在Gogs中配置指定仓库的”.drone.yml“文件 1.2 ssh-drone…

美容院微信小程序怎么添加会员管理功能

要为美容院的微信小程序添加会员管理功能&#xff0c;需要遵循以下步骤&#xff1a; 一、明确会员管理功能的定位和目标 首先&#xff0c;要明确会员管理功能的定位和目标。会员管理功能是美容院微信小程序的重要功能之一&#xff0c;它能够帮助美容院更好地管理会员信息、了解…

Cobalt Strike 4.9

Cobalt Strike 4.9 1. 工具介绍1.1. 工具添加1.2. 工具获取 2. 工具使用2.1. 添加权限并运行2.2. 连接服务端2.3. 连接成功 3. 安全性自查 1. 工具介绍 CS 是Cobalt Strike的简称&#xff0c;是一款渗透测试神器&#xff0c;常被业界人称为CS神器。Cobalt Strike已经不再使用MS…

软件测试简历项目经验怎么写?大厂面试手拿把掐

前言 在写简历之前&#xff0c;我们先来看看失败者的简历和成功者的简历之间有什么区别。为什么成功者的简历可以在求职中起到“四两拨千斤”的作用&#xff0c;而失败者的简历却被丢进了垃圾桶&#xff0c;这两者到底有什么不同&#xff1f; 成功的简历与失败的简历 我们发现…

每日一面系列之@Component和@Configuration区别

Configuration 和 Component 到底有何区别呢&#xff1f;我先通过如下一个案例&#xff0c;在不分析源码的情况下&#xff0c;小伙伴们先来直观感受一下这两个之间的区别。 Configurationpublic class JavaConfig01 { }Componentpublic class JavaConfig02 { } 首先&#xff…

常见算法-双骰子游戏(Craps)

常见算法-双骰子游戏&#xff08;Craps&#xff09; 1、说明 一个简单的双骰子游戏&#xff0c;游戏规则如下&#xff1a; 玩家掷两个骰子&#xff0c;点数为1到6&#xff0c; 如果第一次点数和为7或11&#xff0c;则玩家胜&#xff0c;如果点数和为2、3或12&#xff0c;则…

使用Jetson AGX Orin进行口罩识别

在 https://gitee.com/gpus/maskDetection_jetson 代码仓有个口罩识别的案例&#xff0c;我们来看看能不能在Jetson AGX Orin上搞定。 先将该代码仓fork到自己的代码仓&#xff08;以便魔改&#xff09; 回到自己的代码仓&#xff1a; 根据README.md来操作吧&#xff01; 首先…