测试类中发送请求


在测试中对表现层功能进行测试需要一个基础和一个功能。所谓的一个基础是运行测试程序时,必须启动web环境,不然没法测试web功能。一个功能是必须在测试程序中具备发送web请求的能力,不然无法实现web功能的测试。所以在测试用例中测试表现层接口这项工作就转换成了两件事,一,如何在测试类中启动web测试,二,如何在测试类中发送web请求。下面一件事一件事进行,先说第一个

测试类中启动web环境

​ 每一个springboot的测试类上方都会标准@SpringBootTest注解,而注解带有一个属性,叫做webEnvironment。通过该属性就可以设置在测试用例中启动web环境,具体如下:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class WebTest {	
}

测试类中启动web环境时,可以指定启动的Web环境对应的端口,springboot提供了4种设置值,分别如下:

  • MOCK:根据当前设置确认是否启动web环境,例如使用了Servlet的API就启动web环境,属于适配性的配置
  • DEFINED_PORT:使用自定义的端口作为web服务器端口
  • RANDOM_PORT:使用随机端口作为web服务器端口
  • NONE:不启动web环境

步骤①:在测试类中开启web虚拟调用功能,通过注解@AutoConfigureMockMvc实现此功能的开启

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
//开启虚拟MVC调用
@AutoConfigureMockMvc
public class WebTest {
}

步骤②:定义发起虚拟调用的对象MockMVC,通过自动装配的形式初始化对象

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
//开启虚拟MVC调用
@AutoConfigureMockMvc
public class WebTest {

@Test
void testWeb(@Autowired MockMvc mvc) {
}
}

步骤③:创建一个虚拟请求对象,封装请求的路径,并使用MockMVC对象发送对应请求

@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环境,无需指定,仅指定请求的具体路径即可。

总结

  1. 在测试类中测试web层接口要保障测试类启动时启动web容器,使用@SpringBootTest注解的webEnvironment属性可以虚拟web环境用于测试
  2. 为测试方法注入MockMvc对象,通过MockMvc对象可以发送虚拟请求,模拟web请求调用过程

1.响应状态匹配

@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);
}

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

@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);

}

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

@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);
}

4.响应头信息匹配

@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);

}

5.测试一个 GET 请求的响应是否符合预期。通过执行该请求,并对响应的状态、头信息和体内容进行断言,来判断返回的结果是否正确。

  @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);

    }

你可能感兴趣的:(java,spring,boot)