51Testing软件测试论坛

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

QQ登录

只需一步,快速开始

微信登录,快人一步

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

[转贴] 简便的单元测试,用SpringBoot来做啊~

[复制链接]
  • TA的每日心情
    无聊
    14 小时前
  • 签到天数: 933 天

    连续签到: 5 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2022-5-30 10:24:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    SpringBoot提供的单元测试功能让测试更简单方便、无需关注整个业务流程。

      单元测试的灵魂三问
      是什么
      单元测试就是对项目中最小单元进行功能可行测试,Java中的最小单元即一个类、方法、代码片段。

      为什么
      项目开发过程中想要验证开发的模块是否实现了相应功能,如果启动整个项目进行测试,不仅速度慢耗时久,并且验证流程需要从头开始,大大增加了验证成本。
      而单元测试只需要关注代码中某个单元,输入参数后执行并返回结果,验证结果的正确性,以此来快速高效的测试代码功能。
      使用JUnit单元测试时,可以使用其中提供的断言来验证期望值,便于查看测试结果。

      怎么用
      使用IDEA新建项目时如果使用spring initialize选项构建项目,则项目创建之后便会自动携带单元测试的相关依赖spring-boot-starter-test,项目的最基本依赖有两个,另一个是spring-boot-starter。
      如果项目中没有引入单元测试依赖,还可以手动添加引入:
    1. <dependency>
    2.    <groupId>org.springframework.boot</groupId>
    3.    <artifactId>spring-boot-starter-test</artifactId>
    4.    <scope>test</scope>
    5. </dependency>
    复制代码
    依赖引入之后,使用单元测试的条件已经具备,就可以对代码单元进行测试了,在单元测试的使用过程中,需要注意:
      单元测试要简单明了,专心于某一项功能进行验证;
      每个单元测试独立存在,需要单独进行验证;
      针对每个功能的单元测试要覆盖成功、失败等多种情况。

      单元测试的创建
      单元测试约定
      SpringBoot项目中的测试类默认放于项目的src/test包中,对比src/main包中项目实际结构来创建对应测试类,测试创建常用规则:
      测试类的包结构和项目相同,且为项目中每个类提供一个对应测试类;
      测试类一般命名为xxTest的形式,保证直观可认,并使用@SpringBootTest注解标注;
      测试类中的方法命名以test开头,并使用@Test注解标注。

      常用注解
      SpringBoot中使用注解来完成单元测试的相关功能:
      @SpringBootTest:标注一个类作为测试类,为SpringApplication创建上下文名支持SpringBoot
      @BeforeEach:在测试方法执行之前需要执行的方法
      @Test:注解标注一个方法为测试方法,注解中可以设置时间参数,代表方法测试超时时间
      @Transactional:声明事务管理
      @Rollback:设置值为true/false,指定是否数据回滚来保证测试数据不污染数据库

      不同层的单元测试
      由于SpringBoot项目多是MVC分层结构,开发过程中对不同层结构都需要实现一定的功能,可以在完成当前层功能后进行单元测试。

      Mapper(Dao)层
      Mapper层是直接操作数据库的层级,进行单元测试时,为避免测试数据污染数据库,可以对测试方法使用@Transactional和@Rollback(vaule=true)来开启事务并回滚测试数据。
    1. //Junit5写法
    2. @SpringBootTest
    3. public class MyBatisTestMapperTest {
    4.     @Autowired
    5.     private MybatisTestMapper mybatisTestMapper;

    6.     @Test
    7.     public void testQuery(){
    8.         MybatisTest mybatisTest = mybatisTestMapper.queryById(1);
    9.         Assertions.assertNotNull(mybatisTest);
    10.         Assertions.assertEquals("tom",mybatisTest.getName(),"false");
    11.     }

    12.     @Test
    13.     @Transactional
    14.     @Rollback
    15.     public void testInsert(){
    16.         MybatisTest mybatisTest = new MybatisTest();
    17.         mybatisTest.setName("Lily");
    18.         mybatisTest.setPhone("10011");
    19.         mybatisTest.setEmail("1234455@qq.com");
    20.         int n = mybatisTestMapper.insert(mybatisTest);
    21.         Assertions.assertEquals(1,n);
    22.     }
    23. }
    复制代码
     Service层
      Service作为Mapper的上层,在Service中调用了Mapper方法来操作数据库,使用时同样只需要注入Service层的bean,然后直接调用其中功能方法即可。
    1. //JUnit5写法
    2. @SpringBootTest
    3. public class MyBatisTestServiceTest {
    4.     @Autowired
    5.     private MybatisTestService mybatisTestService;

    6.     @Test
    7.     public void testQueryById(){
    8.         Assertions.assertNotNull(mybatisTestService.queryById(1));
    9.         Assertions.assertEquals("tom",mybatisTestService.queryById(1).getName(),"false");
    10.     }

    11.     @Test
    12.     @Transactional
    13.     @Rollback
    14.     public void testInsert(){
    15.         MybatisTest mybatisTest = new MybatisTest();
    16.         mybatisTest.setName("Liar");
    17.         mybatisTest.setPhone("1567890");
    18.         mybatisTest.setEmail("1100099@163.com");
    19.         int n = mybatisTestService.insert(mybatisTest);
    20.         Assertions.assertEquals(1,n,"false");
    21.     }
    22. }
    复制代码
    注意,如果Service层测试时引用了Mapper层文件并操作了数据库,为避免污染数据,也需要使用@Transactional和@Rollback注解。

      Controller层
      Controller层作为网络接口层,需要进行web请求测试,这就需要使用Spring测试框架提供的MockMvc对象。执行测试方法之前,需要创建mockMvc对象来执行网络请求,可以使用@Before注解实现初始化方法。
    1. //JUnit5
    2. @SpringBootTest
    3. public class MybatisTestControllerTest {

    4.     @Autowired
    5.     private MybatisTestController mybatisTestController;

    6.     private MockMvc mockMvc;

    7.     @BeforeEach
    8.     public void initMock(){
    9.         mockMvc = MockMvcBuilders.standaloneSetup(mybatisTestController).build();
    10.     }

    11.     @Test
    12.     public void testGetMybatisInfo() throws Exception {
    13.         String url = "/get";
    14.         MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get(url))
    15.                 .andExpect(MockMvcResultMatchers.status().isOk())
    16.                 .andReturn();
    17.         Assertions.assertNotNull(result);
    18.     }
    19. }
    复制代码






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

    使用道具 举报

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-19 23:47 , Processed in 0.067000 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

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