TA的每日心情 | 无聊 前天 09:05 |
---|
签到天数: 1050 天 连续签到: 1 天 [LV.10]测试总司令
|
mock 模拟mvc请求
mock ,意为 模仿、模拟。
当我们需要在web环境下进行接口测试时,一种是直接启动启动,使用postman 或者 apipost 这种工具进行测试,但无法进行自动化。今天我们使用springTest 提供的 mock 功能进行模拟测试。
主要分为四个步骤:
创建 web 测试环境
·使用 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 开启测试功能 ,并同时设置 web 环境
·使用 @AutoConfigureMockMvc 开启mockMvc 自动配置
- @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
- @AutoConfigureMockMvc
- class ZssmpApplicationTests {
- }
复制代码 注入mockMvc 对象
·以成员变量的方式注入 mockMvc
- @Autoeired
- private MockMvc mockMvc;
复制代码 · 以方法参数的形式注入
- @SpringBootTest
- @AutoConfigureMockMvc
- class ZssmpApplicationTests {
- @Resource
- private BookDao bookDao;
- //测试mvc
- @Test
- void testMvc(@Autowired MockMvc mockMvc) throws Exception {
-
- }
复制代码 发起虚拟请求
//创建虚拟请求
MockHttpServletRequestBuilder mockHttpServletRequestBuilder = MockMvcRequestBuilders.get("/books");
//执行请求
ResultActions actions = mockMvc.perform(mockHttpServletRequestBuilder);
断言测试结果
匹配响应状态
//1. 定义执行状态匹配器
StatusResultMatchers matchers = MockMvcResultMatchers.status();
//2. 定义预期执行状态
ResultMatcher ok = matchers.isOk();
//3.使用本次真实执行结果 与 预期结果 进行比较 ,会自动断言
actions.andExpect(ok);
匹配响应体
ContentResultMatchers content = MockMvcResultMatchers.content();
ResultMatcher contentMatcher = content.string("springboot return");
actions.andExpect(contentMatcher);
匹配json响应
ContentResultMatchers content1 = MockMvcResultMatchers.content();
ResultMatcher jsonMatcher = content.json("{"id":1,"type":"spring学习非常有趣0","name":"spring学习非常有趣0","description":"spring学习非常有趣0"}");
actions.andExpect(jsonMatcher);
匹配响应头
HeaderResultMatchers header = MockMvcResultMatchers.header();
ResultMatcher contentType = header.string("Content-Type", "application/json");
actions.andExpect(contentType);
业务层的测试回滚
在测试过程中不可避免地会产生一些脏数据,这时候我们可以使用事务管理来解决这个问题。
当 @Transactional 与 @SpringBootTest 组合使用时,springBootTest 会识别到该测试类的事务默认都进行回滚。因此,我们只需要像下面这样,即可实现完成测试过程,又不会将测试结果持久化到数据库中。
- @SpringBootTest
- @Transactional
- class ZssmpApplicationTests {
- }
复制代码 这时候有人会问,在测试过程中某个方法我需要将结果持久化到数据库。这时候,我们只需要在指定的方法上添加 @Rollback(false) 即可实现事务不回滚。
- @Test
- @Rollback(false)
- void save() {
- Book book = new Book();
- book.setName("test");
- book.setType("测试type2");
- bookDao.insert(book);
- }
复制代码 生成随机测试数据
当我们需要生成一些测试数据时, 我们可以使用如下的方式即可。
- testcase:
- bookcase:
- id: ${random.int}
- name: 测试名称${random.value}
- uuid: ${random.uuid}
- time: ${random.long}
- lessThanInt: ${random.int(10)}
- rangInt: ${random.int(100,200)}
- @Data
- @Component
- @ConfigurationProperties(prefix = "testcase.bookcase")
- public class BookCase {
- private int id;
- private String name;
- private String uuid;
- private Long time;
- private int lessThanInt;
- private int rangInt;
- }
复制代码 生成的随机数据结果如下:
- {
- "id": -742894216,
- "name": "测试名称2b671f9730797d91c179561b2aa4d068",
- "uuid": "935319f6-d8f0-4ff7-b614-b99bf44b50b6",
- "time": 1855781803752693206,
- "lessThanInt": 6,
- "rangInt": 141
- }
复制代码
|
|