SpringBoot——学会使用Test,检测自己写的代码(二)

简介: SpringBoot——学会使用Test,检测自己写的代码(二)

3、web环境请求结果比对

目前已经成功的发送了请求,但是还没有起到测试的效果,测试过程必须出现预计值与真实值的比对结果才能确认测试结果是否通过,虚拟请求中能对哪些请求结果进行比对呢?其实发完请求得到的信息只有一种,就是响应对象。至于响应对象中包含什么,就可以比对什么。常见的比对内容如下:


响应状态匹配

 

@Test
    void test02(@Autowired MockMvc mvc) throws Exception {
        MockHttpServletRequestBuilder requestBuilder =
                MockMvcRequestBuilders.get("/books");
        ResultActions actions = mvc.perform(requestBuilder);
        //设定预期值,与真实值进行比较,成功测试通过,失败测试失败
        //定义本次调用的预期值
        StatusResultMatchers status = MockMvcResultMatchers.status();
        //预计本次调用时成功:状态200
        ResultMatcher ok = status.isOk();
        //添加预计值到本次调用过程中进行匹配
        actions.andExpect(ok);
    }


正确结果:

image.png

假如我们把地址改为/bookss,就会报错:


image.png

响应体匹配(非json数据格式)


@Test
void test03(@Autowired MockMvc mvc) throws Exception {
      MockHttpServletRequestBuilder requestBuilder =
              MockMvcRequestBuilders.get("/books");
      ResultActions actions = mvc.perform(requestBuilder);
      ContentResultMatchers content = MockMvcResultMatchers.content();
      ResultMatcher result = content.string("Hello~~");
      actions.andExpect(result);
}


我们再写一个controller用于测试新的内容,代码如下图:

image.png


响应体匹配(json数据格式,开发中的主流使用方式)


@Test
  void test04(@Autowired MockMvc mvc) throws Exception {
      MockHttpServletRequestBuilder requestBuilder =
              MockMvcRequestBuilders.get("/books/getJson");
      ResultActions actions = mvc.perform(requestBuilder);
      ContentResultMatchers content = MockMvcResultMatchers.content();
      ResultMatcher result =
              content.json("{\"name\":\"cabbage\",\"age\":21,\"email\":\"cabbage@qq.com\"}");
      actions.andExpect(result);
  }
}


响应头信息匹配


@Test
void test05(@Autowired MockMvc mvc) throws Exception {
      MockHttpServletRequestBuilder requestBuilder =
              MockMvcRequestBuilders.get("/books/getJson");
      ResultActions actions = mvc.perform(requestBuilder);
      HeaderResultMatchers header = MockMvcResultMatchers.header();
      ResultMatcher contentType =
              header.string("Content-Type", "application/json");
      actions.andExpect(contentType);
  }
}


基本上齐了,头信息,正文信息,状态信息都有了,就可以组合出一个完美的响应结果比对结果了。以下范例就是三种信息同时进行匹配校验,也是一个完整的信息匹配过程。


@Test
void testGetById(@Autowired MockMvc mvc) throws Exception {
    MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books/getJson");
    ResultActions action = mvc.perform(builder);
    StatusResultMatchers status = MockMvcResultMatchers.status();
    ResultMatcher ok = status.isOk();
    action.andExpect(ok);
    HeaderResultMatchers header = MockMvcResultMatchers.header();
    ResultMatcher contentType = header.string("Content-Type", "application/json");
    action.andExpect(contentType);
    ContentResultMatchers content = MockMvcResultMatchers.content();
    ResultMatcher result = content.json("{\"name\":\"cabbage\",\"age\":21,\"email\":\"cabbage@qq.com\"}");
    action.andExpect(result);
}


总结:


web虚拟调用可以对本地虚拟请求的返回响应信息进行比对,分为响应头信息比对、响应体信息比对、响应状态信息比对


五、数据层测试回滚

测试用例如果测试时产生了事务提交就会在测试过程中对数据库数据产生影响,进而产生垃圾数据。这个过程不是我们希望发生的,作为开发者测试用例该运行运行,但是过程中产生的数据不要在我的系统中留痕,这样该如何处理呢?


我们只需要在原始测试用例中添加注解@Transactional即可实现当前测试用例的事务不提交。当程序运行后,只要注解@Transactional出现的位置存在注解@SpringBootTest,springboot就会认为这是一个测试程序,无需提交事务,所以也就可以避免事务的提交。


我们先创建一个新的表,表里面没有任何数据,如图:

image.png

创建对应的实体类,配置好数据库连接的环境,这些就不仔细介绍了,不会的小伙伴们,可以去我的专栏中查找~

image.png

开始测试:


@SpringBootTest
@Transactional
@Rollback(false)
public class SqlTest {
    @Autowired
    private UserMapper userMapper;
    @Test
    void test01() {
        User user = new User();
        user.setName("cabbage");
        user.setAge(20);
        user.setEmail("cabbage@qq.com");
        userMapper.insert(user);
    }
}


上述代码运行后并不会对数据库产生影响,但是如果把false改为true,再次执行代码,数据库就会出现垃圾数据,如图所示:

image.png

如果我们想提交事物,只需要添加一个@RollBack的注解,设置回滚状态为false即可正常提交事务,是不是很方便呢?springboot在辅助开发者日常工作这一块展现出了惊人的能力,实在太贴心了。


总结:


在springboot的测试类中通过添加注解@Transactional来阻止测试用例提交事务

通过注解@Rollback控制springboot测试类执行结果是否提交事务,需要配合注解@Transactional使用


六、测试用例数据设定

对于测试用例的数据固定书写肯定是不合理的,springboot提供了在配置中使用随机值的机制,确保每次运行程序加载的数据都是随机的。具体如下:


testcase:
  book:
    id: ${random.int}
    id2: ${random.int(10)}
    type: ${random.int!5,10!}
    name: ${random.value}
    uuid: ${random.uuid}
    publishTime: ${random.long}


当前配置就可以在每次运行程序时创建一组随机数据,避免每次运行时数据都是固定值的尴尬现象发生,有助于测试功能的进行。数据的加载按照之前加载数据的形式,使用@ConfigurationProperties注解即可


@Component
@Data
@ConfigurationProperties(prefix = "testcase.book")
public class BookCase {
    private int id;
    private int id2;
    private int type;
    private String name;
    private String uuid;
    private long publishTime;
}


让我们写个代码测试一下:


@SpringBootTest
public class RandomTest {
    @Autowired
    private BookCase bookCase;
    @Test
    void test01() {
        System.out.println(bookCase.getId());
        System.out.println(bookCase.getName());
    }
}


运行结果:

image.png


对于随机值的产生,还有一些小的限定规则,比如产生的数值性数据可以设置范围等,具体如下:

image.png


${random.int}表示随机整数

${random.int(10)}表示10以内的随机数

${random.int(10,20)}表示10到20的随机数

其中()可以是任意字符,例如[],!!均可

七、总结

这一篇总结了常用的代码测试的方法,去大厂真的是必不可少!希望小伙伴们都可以认真掌握,创作不易,喜欢的话,可以给博主三连支持哦~~


相关文章
|
1月前
|
缓存 监控 Java
|
2月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
147 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
1月前
|
缓存 监控 Java
|
2月前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
536 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
2月前
|
Java BI API
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
这篇文章介绍了如何在Spring Boot项目中整合iTextPDF库来导出PDF文件,包括写入大文本和HTML代码,并分析了几种常用的Java PDF导出工具。
634 0
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
|
2月前
|
JSON NoSQL Java
springBoot:jwt&redis&文件操作&常见请求错误代码&参数注解 (九)
该文档涵盖JWT(JSON Web Token)的组成、依赖、工具类创建及拦截器配置,并介绍了Redis的依赖配置与文件操作相关功能,包括文件上传、下载、删除及批量删除的方法。同时,文档还列举了常见的HTTP请求错误代码及其含义,并详细解释了@RequestParam与@PathVariable等参数注解的区别与用法。
|
2月前
|
消息中间件 Java 大数据
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
79 2
|
2月前
|
前端开发 Java
学习SpringMVC,建立连接,请求,响应 SpringBoot初学,如何前后端交互(后端版)?最简单的能通过网址访问的后端服务器代码举例
文章介绍了如何使用SpringBoot创建简单的后端服务器来处理HTTP请求,包括建立连接、编写Controller处理请求,并返回响应给前端或网址。
61 0
学习SpringMVC,建立连接,请求,响应 SpringBoot初学,如何前后端交互(后端版)?最简单的能通过网址访问的后端服务器代码举例
|
2月前
|
监控 Java 开发者
掌握SpringBoot扩展接口:提升代码优雅度的16个技巧
【10月更文挑战第20天】 SpringBoot以其简化配置和快速开发而受到开发者的青睐。除了基本的CRUD操作外,SpringBoot还提供了丰富的扩展接口,让我们能够更灵活地定制和扩展应用。以下是16个常用的SpringBoot扩展接口,掌握它们将帮助你写出更加优雅的代码。
93 0
|
3月前
|
SQL JSON Java
springboot 如何编写增删改查后端接口,小白极速入门,附完整代码
本文为Spring Boot增删改查接口的小白入门教程,介绍了项目的构建、配置YML文件、代码编写(包括实体类、Mapper接口、Mapper.xml、Service和Controller)以及使用Postman进行接口测试的方法。同时提供了SQL代码和完整代码的下载链接。
springboot 如何编写增删改查后端接口,小白极速入门,附完整代码