SpringBoot Web环境模拟测试

举报
兮动人 发表于 2022/05/29 16:42:33 2022/05/29
【摘要】 1. 加载测试专用属性 2. 加载测试专用配置 3. web环境模拟测试 4. 实际开发需求中使用 1. 加载测试专用属性在启动测试环境时可以通过properties参数设置测试环境专用的属性优势:比多环境开发中的测试环境影响范围更小,仅对当前测试类有效properties属性可以为当前测试用例添加临时属性配置在启动测试环境时可以通过args参数设置测试环境专用的传入参数当两者都存在时,可...

1. 加载测试专用属性

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 在启动测试环境时可以通过properties参数设置测试环境专用的属性

  • 优势:比多环境开发中的测试环境影响范围更小,仅对当前测试类有效

  • properties属性可以为当前测试用例添加临时属性配置
    在这里插入图片描述
    在这里插入图片描述

  • 在启动测试环境时可以通过args参数设置测试环境专用的传入参数
    在这里插入图片描述

  • 当两者都存在时,可以看到加参数 args 的优先输出,这是因为在 boot 中有配置文件的高低
    在这里插入图片描述
    在这里插入图片描述

  • 加载测试临时属性应用于小范围测试环境

2. 加载测试专用配置

  • 使用@Import注解加载当前测试类专用的配置
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 加载测试范围配置应用于小范围测试环境

3. web环境模拟测试

  1. 模拟端口
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. 虚拟请求测试
    在这里插入图片描述
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
//开启虚拟MVC调用
@AutoConfigureMockMvc
public class WebTest {
    @Test
    //注入虚拟MVC对象
   void testWeb(@Autowired MockMvc mvc) throws Exception {
        //创建虚拟请求,当前访问 /books
        MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
        //执行对应的请求
        mvc.perform(builder);
    }

}

启动后就可以模拟出外部请求的环境,直接访问,而不通过请求浏览器来实现了
在这里插入图片描述

  1. 虚拟请求状态匹配,验证是否成功
// 设置预期值,与真实值进行比较
@Test
void testStatus(@Autowired MockMvc mvc) throws Exception {
    MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
    ResultActions action = mvc.perform(builder);
    //匹配执行状态(是否预期值)
    //定义执行状态匹配器,本次调用的预期值
    StatusResultMatchers status = MockMvcResultMatchers.status();
    //定义预期执行状态,
    ResultMatcher ok = status.isOk();
    //使用本次真实执行结果与预期结果进行比对
    action.andExpect(ok);
}

匹配成功,返回对应请求的值
在这里插入图片描述
失败则返回对应的错误码和信息
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 虚拟请求响应体匹配
    在这里插入图片描述
@Test
void testBody(@Autowired MockMvc mvc) throws Exception {
    MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
    ResultActions action = mvc.perform(builder);
    //匹配执行状态(是否预期值)
    //定义结果匹配器
    ContentResultMatchers content = MockMvcResultMatchers.content();
    //定义预期执行结果
    ResultMatcher result = content.string("springboot");
    //使用本次真实执行结果与预期结果进行比对
    action.andExpect(result);
}
  • 改成不匹配的响应体,就会报错
    在这里插入图片描述
  1. 虚拟请求响应体(JSON)匹配
@RestController
@RequestMapping
public class BookController {

    @GetMapping("books")
    public Book getById() {
        System.out.println("getById is running...");

        Book book = new Book();
        book.setId(1);
        book.setName("springboot");
        book.setType("教育");
        book.setDescription("springboot cool!");
        return book;
    }
}
  • 把请求到的JSON字符串直接复制到下面进行比对
    在这里插入图片描述
@Test
void testJson(@Autowired MockMvc mvc) throws Exception {
    MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
    ResultActions action = mvc.perform(builder);
    //匹配执行状态(是否预期值)
    //定义结果匹配器
    ContentResultMatchers content = MockMvcResultMatchers.content();
    //定义预期执行结果
    ResultMatcher result = content.json("{\"id\":1,\"name\":\"springboot\",\"type\":\"教育\",\"description\":\"springboot cool!\"}");
    //使用本次真实执行结果与预期结果进行比对
    action.andExpect(result);
}
  1. 虚拟请求响应头匹配
@Test
    void testContentType(@Autowired MockMvc mvc) throws Exception {
        MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
        ResultActions action = mvc.perform(builder);
        //匹配执行状态(是否预期值)
        //定义结果匹配器
        HeaderResultMatchers header = MockMvcResultMatchers.header();
        //定义预期执行结果
        ResultMatcher contentType = header.string("Content-Type", "application/json");
        //使用本次真实执行结果与预期结果进行比对
        action.andExpect(contentType);
    }
  • 如果请求头不是JSON对象,就会报错
    在这里插入图片描述
    在这里插入图片描述

4. 实际开发需求中使用

  • 分别对定义的 状态、请求头、响应体等 进行 比对
@Test
void testGetById(@Autowired MockMvc mvc) throws Exception {
    MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
    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("{\"id\":1,\"name\":\"springboot\",\"type\":\"教育\",\"description\":\"springboot cool!\"}");
    action.andExpect(result);
    
}
  • 一般使用 content 比较多点。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。