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的随机数

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

七、总结

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


相关文章
|
3天前
|
Java 数据安全/隐私保护 Spring
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
|
1天前
|
前端开发 IDE Java
"揭秘前端转Java的秘径:SpringBoot Web极速入门,掌握分层解耦艺术,让你的后端代码飞起来,你敢来挑战吗?"
【8月更文挑战第19天】面向前端开发者介绍Spring Boot后端开发,通过简化Spring应用搭建,快速实现Web应用。本文以创建“Hello World”应用为例,展示项目基本结构与运行方式。进而深入探讨三层架构(Controller、Service、DAO)下的分层解耦概念,通过员工信息管理示例,演示各层如何协作及依赖注入的使用,以此提升代码灵活性与可维护性。
|
9天前
|
安全 Java Shell
"SpringBoot防窥秘籍大公开!ProGuard混淆+xjar加密,让你的代码穿上隐形斗篷,黑客也无奈!"
【8月更文挑战第11天】开发SpringBoot应用时,保护代码免遭反编译至关重要。本文介绍如何运用ProGuard和xjar强化安全性。ProGuard能混淆代码,去除未使用的部分,压缩字节码,使反编译困难。需配置ProGuard规则文件并处理jar包。xjar则进一步加密jar包内容,即使被解压也无法直接读取。结合使用这两种工具可显著提高代码安全性,有效保护商业机密及知识产权。
37 3
|
16天前
|
Java API 数据格式
Spring Boot API参数读取秘籍大公开!6大神器助你秒变参数处理大师,让你的代码飞起来!
【8月更文挑战第4天】Spring Boot凭借其便捷的开发和配置特性,成为构建微服务的热门选择。高效处理HTTP请求参数至关重要。本文介绍六种核心方法:查询参数利用`@RequestParam`;路径变量采用`@PathVariable`;请求体通过`@RequestBody`自动绑定;表单数据借助`@ModelAttribute`或`@RequestParam`;请求头使用`@RequestHeader`;Cookie则依靠`@CookieValue`。每种方法针对不同场景,灵活运用可提升应用性能与用户体验。
40 9
|
22天前
|
存储 Java Serverless
Java Spring Boot应用如何实现推送代码到指定仓库并自动部署
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
5天前
|
Java 测试技术
Java SpringBoot Test 单元测试中包括多线程时,没跑完就结束了
Java SpringBoot Test 单元测试中包括多线程时,没跑完就结束了
10 0
|
1月前
|
物联网
好的资源链接,gitee全糖咖啡,B站视频转成mp4,全糖咖啡 / 物联网网关数据上传,,全糖咖啡 / springboot+百度智能车牌检测
好的资源链接,gitee全糖咖啡,B站视频转成mp4,全糖咖啡 / 物联网网关数据上传,,全糖咖啡 / springboot+百度智能车牌检测
|
2月前
|
前端开发 JavaScript 网络协议
Springboot中为什么你能通过一小段代码来访问网页?
Springboot中为什么你能通过一小段代码来访问网页?
37 7
|
1月前
|
存储 Java
软件开发常用之SpringBoot文件上传接口编写(中),一本书,代码大全(里面有很多代码重构的方法),屎山代码的原因是不断追加逻辑,在错误代码上堆积新的功能,在写完逻辑之后去思考一下,逻辑合理不
软件开发常用之SpringBoot文件上传接口编写(中),一本书,代码大全(里面有很多代码重构的方法),屎山代码的原因是不断追加逻辑,在错误代码上堆积新的功能,在写完逻辑之后去思考一下,逻辑合理不
|
1月前
|
安全 测试技术 数据库
基于SpringBoot+Vue中小企业人事管理系统代码(源码+部署说明+演示视频+源码介绍)(2)
基于SpringBoot+Vue中小企业人事管理系统代码(源码+部署说明+演示视频+源码介绍)
27 0