51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1013|回复: 0
打印 上一主题 下一主题

[转贴] SpringBootTest的Mock测试

[复制链接]
  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 962 天

    连续签到: 2 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2022-5-31 10:05:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    mock 模拟mvc请求
      mock ,意为 模仿、模拟。
      当我们需要在web环境下进行接口测试时,一种是直接启动启动,使用postman 或者 apipost 这种工具进行测试,但无法进行自动化。今天我们使用springTest 提供的 mock 功能进行模拟测试。
      主要分为四个步骤:
      创建 web 测试环境
      ·使用 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 开启测试功能 ,并同时设置 web 环境
      ·使用 @AutoConfigureMockMvc 开启mockMvc 自动配置
    1.  @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
    2.   @AutoConfigureMockMvc
    3.   class ZssmpApplicationTests {
    4.   }
    复制代码
     注入mockMvc 对象
      ·以成员变量的方式注入 mockMvc
    1. @Autoeired
    2.   private MockMvc mockMvc;
    复制代码
     · 以方法参数的形式注入
    1. @SpringBootTest
    2.   @AutoConfigureMockMvc
    3.   class ZssmpApplicationTests {
    4.      @Resource
    5.      private BookDao bookDao;
    6.      //测试mvc
    7.      @Test
    8.      void testMvc(@Autowired MockMvc mockMvc) throws Exception {
    9.        
    10.      }
    复制代码
    发起虚拟请求
     //创建虚拟请求
      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 会识别到该测试类的事务默认都进行回滚。因此,我们只需要像下面这样,即可实现完成测试过程,又不会将测试结果持久化到数据库中。
    1.   @SpringBootTest
    2.   @Transactional
    3.   class ZssmpApplicationTests {
    4.   }
    复制代码
    这时候有人会问,在测试过程中某个方法我需要将结果持久化到数据库。这时候,我们只需要在指定的方法上添加 @Rollback(false) 即可实现事务不回滚。

    1. @Test
    2.   @Rollback(false)
    3.   void save() {
    4.      Book book = new Book();
    5.      book.setName("test");
    6.      book.setType("测试type2");
    7.      bookDao.insert(book);
    8.   }
    复制代码
    生成随机测试数据
      当我们需要生成一些测试数据时, 我们可以使用如下的方式即可。
    1.  testcase:
    2.       bookcase:
    3.           id: ${random.int}
    4.           name: 测试名称${random.value}
    5.           uuid: ${random.uuid}
    6.           time: ${random.long}
    7.           lessThanInt: ${random.int(10)}
    8.           rangInt: ${random.int(100,200)}

    9.   @Data
    10.   @Component
    11.   @ConfigurationProperties(prefix = "testcase.bookcase")
    12.   public class BookCase {
    13.       private int id;
    14.       private String name;
    15.       private String uuid;
    16.       private Long time;
    17.       private int lessThanInt;
    18.       private int rangInt;
    19.   }
    复制代码
    生成的随机数据结果如下:
    1. {
    2.       "id": -742894216,
    3.       "name": "测试名称2b671f9730797d91c179561b2aa4d068",
    4.       "uuid": "935319f6-d8f0-4ff7-b614-b99bf44b50b6",
    5.       "time": 1855781803752693206,
    6.       "lessThanInt": 6,
    7.       "rangInt": 141
    8.   }
    复制代码







    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-6-9 09:58 , Processed in 0.069060 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表