IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> SpringBoot集成Mock进行接口测试 -> 正文阅读

[开发测试]SpringBoot集成Mock进行接口测试

一、前言


1、遇到的问题:

????????为确保功能稳定在线上运行,功能上线前必须要进行覆盖性单元测试,但由于接口测试需要通过PostMan或者Swagger进行调用,才能进行集成测试。而且通过PostMan或者Swagger进行测试后,测试用例无法进行保存,进而无法确保测试用例是否全面覆盖,而且测试用例无法留存。

2、解决方案:????????

????????通过SpringBootTest注入Mock的方式,来进行接口调用单元测试。

二、功能代码


@RestController("/user")
public class UserController {

? ? @Autowired
? ? private UserService userService;

? ? @GetMapping("/list")
? ? public ResponseEntity<List<User>> list() {
? ? ?? ?return new ResponseEntity(list, HttpStatus.OK);
? ? }

?? ?/**
?? ? * user中存放筛选过滤条件
?? ? */
?? ?@PostMapping("/list2")
? ? public ResponseEntity<List<User>> list(User user, 
        @RequestParam(name = "current", defaultValue = "1") Integer current,
? ? ? ? @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
? ? ?? ?return new ResponseEntity(list, HttpStatus.OK);
? ? }

? ? @PostMapping("/add")
? ? public ResponseEntity<String> add(@RequestBody User user){
? ? ? ? userService.add(user);
? ? ? ? return new ResponseEntity("成功", HttpStatus.OK);
? ? }
}

三、集成Mock


1、导入SpringBoot的测试依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>

2、创建一个测试用例

(1)@RunWith和@SpringBootTest:表示是一个可以启动容器的测试类。
(2)@WebAppConfiguration:表示测试环境使用的ApplicationContext将是WebApplicationContext类型的。
(3)@AutoConfigureMockMvc:表示是一个可以通过Mock方式进行单元测试的类。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@WebAppConfiguration
// @AutoConfigureMockMvc是用于自动配置MockMvc
@AutoConfigureMockMvc
public class UserController01Test {

? ? @Autowired
? ? private WebApplicationContext webApplicationContext;

? ? @Autowired
? ? private MockMvc mockMvc;

? ? @Before()
? ? public void setup () {
? ? ? ? mockMvc = MockMvcBuilders.webAppContextSetup(this.webApplicationContext).build();
? ? }

? ? @Test
? ? public void test () {
? ? ?? ?// test方法中具体编写接口调用逻辑即可,主要是填入模拟接口入参调用。
? ? }

? ? @Test
? ? public void demo () {
?? ??? ?// 添加调用的接口路径
? ? ?? ?MockHttpServletRequestBuilder postRequestBuilder = MockMvcRequestBuilders.post("/user/add");
? ? ?? ?// 标识数据提交方式
? ? ? ? postRequestBuilder.contentType(MediaType.APPLICATION_JSON);
? ? ? ? // 参数
? ? ? ? postRequestBuilder.param("name", "张三");
        postRequestBuilder.param("age", "18");

? ? ? ? // mock调用
? ? ? ? ResultActions resultActions = mockMvc.perform(postRequestBuilder);

? ? ? ? // 执行一个期望 在调用成功后,执行什么
? ? ? ? resultActions.andExpect(MockMvcResultMatchers.status().isOk());
        // 执行一般操作,输出调用结果
? ? ? ? resultActions.andDo(MockMvcResultHandlers.print());
? ? ? ? // 获取返回结果信息
? ? ? ? MvcResult response = resultActions.andReturn();

? ? ? ? System.out.println("result:"+response.getResponse().getContentAsString());
? ? }

}

四、深入剖析

1、MockMvcRequestBuilders

?(1)MockHttpServletRequestBuilder支持http所有请求(get、post、head、put、delete等)

?(2)调用时需要指定请求方式(一般场景即get、post)和接口路径(如:/demo/test),然后获取到MockHttpServletRequestBuilder。

2、MockHttpServletRequestBuilder的装配过程

(1)headers()方法:添加头信息。


(2)contentType()方法:指定请求的contentType头信息。


(3)content()方法:指定请求Body体内容。(直接和String字符串的方式都是可以支持的)


(4)param()/params()方法:设置接口参数值。?

???注意??:主要讲述当前用到的核心方法,其他在这里不详细讲述。cookie和session也是可以模拟的,有需要的可以看参考中的开涛的博客文章,有详细讲解使用方法。

3、MockMvc的调用过程

(1)perform()方法:执行一个RequestBuilder请求,会自动执行SpringMVC的流程并映射到相应的控制器执行处理。


(2)andExpect()方法:添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确。添加验证断言来判断执行请求后的结果是否是预期的。
(3)andDo()方法:添加ResultHandler结果处理器,用于对验证成功后执行的动作,比如调试时打印结果到控制台。
(4)andReturn()方法:最后返回相应的MvcResult;然后进行自定义验证/进行下一步的异步处理。

五、请求示例

1、Get请求 -?无参数

(1)代码示例

public void testGet () throws Exception {
    MockHttpServletRequestBuilder postRequestBuilder = MockMvcRequestBuilders
            .get("/user/list")
            .contentType(MediaType.APPLICATION_JSON);

    MvcResult response = mockMvc.perform(postRequestBuilder)
            .andExpect(MockMvcResultMatchers.status().isOk())
            .andDo(MockMvcResultHandlers.print())
            .andReturn();

    System.out.println("result:"+response.getResponse().getContentAsString());
}

(2)Request请求体

?(3)Response返回结果?

?2、Get请求 -?有参数

(1)代码示例

public void testGet () throws Exception {
    MockHttpServletRequestBuilder postRequestBuilder = MockMvcRequestBuilders
            .get("/user/list")
            .contentType(MediaType.APPLICATION_JSON)
            .param("biz_date", "2021-11-05")
            .param("operator_name", "张三");

    MvcResult response = mockMvc.perform(postRequestBuilder)
            .andExpect(MockMvcResultMatchers.status().isOk())
            .andDo(MockMvcResultHandlers.print())
            .andReturn();

    System.out.println("result:"+response.getResponse().getContentAsString());
}

(2)Request请求体

(3)Response返回结果

3、Post请求 - Paramter形式

(1)代码示例

public void testPost () throws Exception {
    MockHttpServletRequestBuilder postRequestBuilder = MockMvcRequestBuilders
            .post("/user/add")
            .contentType(MediaType.APPLICATION_JSON)
            .param("name", "张三")
            .param("age", "18");

    MvcResult response = mockMvc.perform(postRequestBuilder)
            .andExpect(MockMvcResultMatchers.status().isOk())
            .andDo(MockMvcResultHandlers.print())
            .andReturn();

    System.out.println("result:"+response.getResponse().getContentAsString());
}

(2)Request请求体

(3)Response返回结果

?4、Post请求 - RequestBody content形式

(1)代码示例

public void testPost () throws Exception {
    Map<String, String> paramMap = new HashMap<>();
    paramMap.put("name", "张三");
    paramMap.put("age", "18");
        
    MockHttpServletRequestBuilder postRequestBuilder = MockMvcRequestBuilders
            .post("/user/add")
            .contentType(MediaType.APPLICATION_JSON)
            .content(JSON.toJSON(paramMap).toString());

    MvcResult response = mockMvc.perform(postRequestBuilder)
            .andExpect(MockMvcResultMatchers.status().isOk())
            .andDo(MockMvcResultHandlers.print())
            .andReturn();

    System.out.println("result:"+response.getResponse().getContentAsString());
}

(2)Request请求体

(3)Response返回结果

? ? ? ?以上是对SpringBoot集成Mock进行接口单元测试的整体流程,小伙伴有问题请及时跟我沟通交流,感谢大家!!!

?

参考资料

Spring官网测试用例
Spring MVC测试框架详解——服务端测试

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-11-12 19:53:35  更:2021-11-12 19:55:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 2:31:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码