在测试中对表现层功能进行测试需要一个基础和一个功能。所谓的一个基础是运行测试程序时,必须启动web环境,不然没法测试web功能。一个功能是必须在测试程序中具备发送web请求的能力,不然无法实现web功能的测试。所以在测试用例中测试表现层接口这项工作就转换成了两件事,一,如何在测试类中启动web测试,二,如何在测试类中发送web请求。下面一件事一件事进行,先说第一个
测试类中启动web环境
每一个springboot的测试类上方都会标准@SpringBootTest注解,而注解带有一个属性,叫做webEnvironment。通过该属性就可以设置在测试用例中启动web环境,具体如下:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class WebTest {
}
测试类中启动web环境时,可以指定启动的Web环境对应的端口,springboot提供了4种设置值,分别如下:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
//开启虚拟MVC调用
@AutoConfigureMockMvc
public class WebTest {
}
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
//开启虚拟MVC调用
@AutoConfigureMockMvc
public class WebTest {
@Test
void testWeb(@Autowired MockMvc mvc) {
}
}
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
//开启虚拟MVC调用
@AutoConfigureMockMvc
public class WebTest {
@Test
void testRandomPort(){
}
/*模拟一个 GET 请求*/`
@Test
void testWeb(@Autowired MockMvc mvc) throws Exception {
// http://localhost:8080/books
//创建虚拟请求,当前访问/books
/*
MockHttpServletRequestBuilder是Spring MVC Test框架提供的一个用于构建MockHttpServletRequest的工具类。
它可以帮助您创建虚拟的HTTP请求,以便在测试中模拟用户的请求。
MockHttpServletRequestBuilder提供了一系列静态方法来构建不同类型的请求,例如GET、POST、PUT、DELETE等。
您可以使用这些方法来设置请求的URL、请求参数、请求头、请求体等。*/
MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
//执行对应的请求
mvc.perform(builder);
}
执行测试程序,现在就可以正常的发送/books对应的请求了,注意访问路径不要写http://localhost:8080/books,因为前面的服务器IP地址和端口使用的是当前虚拟的web环境,无需指定,仅指定请求的具体路径即可。
总结
@Test
void testStatus(@Autowired MockMvc mvc) throws Exception {
MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
/*
ResultActions是Spring MVC Test框架提供的一个用于处理和验证控制器响应的对象。它是在执行MockMvc的perform方法后返回的。
ResultActions提供了一系列方法来验证控制器的响应,例如验证状态码、验证响应内容、验证响应头等。*/
ResultActions action = mvc.perform(builder);
//设定预期值 与真实值进行比较,成功测试通过,失败测试失败
//定义本次调用的预期值
/*StatusResultMatchers是Spring MVC Test框架提供的一个用于验证控制器响应状态码的对象。
它提供了一系列静态方法,用于验证响应的状态码是否与预期相符。*/
StatusResultMatchers status = MockMvcResultMatchers.status();
//预计本次调用时成功的:状态200
/*ResultMatcher是Spring MVC Test框架提供的一个用于验证控制器响应的对象。它是用于实现自定义的验证逻辑的接口。*/
ResultMatcher ok = status.isOk();
//添加预计值到本次调用过程中进行匹配
action.andExpect(ok);
}
@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);
}
@Test
void testJson(@Autowired MockMvc mvc) throws Exception {
MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
ResultActions action = mvc.perform(builder);
//设定预期值 与真实值进行比较,成功测试通过,失败测试失败
//定义本次调用的预期值
/*ContentResultMatchers是Spring MVC Test框架提供的一个用于验证控制器响应内容的对象。
它提供了一系列静态方法,用于验证响应内容的类型、值、属性等。*/
ContentResultMatchers content = MockMvcResultMatchers.content();
ResultMatcher result = content.json("{\"id\":1,\"name\":\"springboot2\"," +
"\"type\":\"springboot\",\"description\":\"springboot\"}");
//添加预计值到本次调用过程中进行匹配
action.andExpect(result);
}
@Test
void testContentType(@Autowired MockMvc mvc) throws Exception {
MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
ResultActions action = mvc.perform(builder);
//设定预期值 与真实值进行比较,成功测试通过,失败测试失败
//定义本次调用的预期值
/*HeaderResultMatchers是Spring MVC Test框架提供的一个用于验证控制器响应头的对象。
它提供了一系列静态方法,用于验证响应头是否包含指定的值。*/
HeaderResultMatchers header = MockMvcResultMatchers.header();
ResultMatcher contentType = header.string("Content-Type", "application/json");
//添加预计值到本次调用过程中进行匹配
action.andExpect(contentType);
}
@Test
void testGetById(@Autowired MockMvc mvc) throws Exception {
/*1.创建虚拟请求,请求这个HTTP地址*/
MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
ResultActions action = mvc.perform(builder);
/*2.响应状态是否成功*/
StatusResultMatchers status = MockMvcResultMatchers.status();
ResultMatcher ok = status.isOk();
action.andExpect(ok);
/*3.响应头信息匹配*/
HeaderResultMatchers header = MockMvcResultMatchers.header();
ResultMatcher contentType = header.string("Content-Type", "application/json");
action.andExpect(contentType);
/*4.响应体匹配(json数据格式,开发中的主流使用方式)*/
ContentResultMatchers content = MockMvcResultMatchers.content();
ResultMatcher result = content.json("{\"id\":1,\"name\":\"springboot\",\"type\":\"springboot\",\"description\":\"springboot\"}");
action.andExpect(result);
}