热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

简便的单元测试,用SpringBoot来做啊~

SpringBoot提供的单元测试功能让测试更简单方便、无需关注整个业务流程。单元测试的灵魂三问是什么单元测试就是对项目中最小单元进行功能可行测试,Java中的

SpringBoot提供的单元测试功能让测试更简单方便、无需关注整个业务流程。

单元测试的灵魂三问

是什么

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

为什么

项目开发过程中想要验证开发的模块是否实现了相应功能,如果启动整个项目进行测试,不仅速度慢耗时久,并且验证流程需要从头开始,大大增加了验证成本。

而单元测试只需要关注代码中某个单元,输入参数后执行并返回结果,验证结果的正确性,以此来快速高效的测试代码功能。

使用JUnit单元测试时,可以使用其中提供的断言来验证期望值,便于查看测试结果。

怎么用

使用IDEA新建项目时如果使用spring initialize选项构建项目,则项目创建之后便会自动携带单元测试的相关依赖spring-boot-starter-test,项目的最基本依赖有两个,另一个是spring-boot-starter。

如果项目中没有引入单元测试依赖,还可以手动添加引入:

org.springframework.bootspring-boot-starter-testtest

依赖引入之后,使用单元测试的条件已经具备,就可以对代码单元进行测试了,在单元测试的使用过程中,需要注意:


  • 单元测试要简单明了,专心于某一项功能进行验证;

  • 每个单元测试独立存在,需要单独进行验证;

  • 针对每个功能的单元测试要覆盖成功、失败等多种情况。

单元测试的创建

单元测试约定

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)来开启事务并回滚测试数据。

//Junit5写法
@SpringBootTest
public class MyBatisTestMapperTest {@Autowiredprivate MybatisTestMapper mybatisTestMapper;@Testpublic void testQuery(){MybatisTest mybatisTest = mybatisTestMapper.queryById(1);Assertions.assertNotNull(mybatisTest);Assertions.assertEquals("tom",mybatisTest.getName(),"false");}@Test@Transactional@Rollbackpublic void testInsert(){MybatisTest mybatisTest = new MybatisTest();mybatisTest.setName("Lily");mybatisTest.setPhone("10011");mybatisTest.setEmail("1234455@qq.com");int n = mybatisTestMapper.insert(mybatisTest);Assertions.assertEquals(1,n);}
}

Service层

Service作为Mapper的上层,在Service中调用了Mapper方法来操作数据库,使用时同样只需要注入Service层的bean,然后直接调用其中功能方法即可。

//JUnit5写法
@SpringBootTest
public class MyBatisTestServiceTest {@Autowiredprivate MybatisTestService mybatisTestService;@Testpublic void testQueryById(){Assertions.assertNotNull(mybatisTestService.queryById(1));Assertions.assertEquals("tom",mybatisTestService.queryById(1).getName(),"false");}@Test@Transactional@Rollbackpublic void testInsert(){MybatisTest mybatisTest = new MybatisTest();mybatisTest.setName("Liar");mybatisTest.setPhone("1567890");mybatisTest.setEmail("1100099@163.com");int n = mybatisTestService.insert(mybatisTest);Assertions.assertEquals(1,n,"false");}
}

注意,如果Service层测试时引用了Mapper层文件并操作了数据库,为避免污染数据,也需要使用@Transactional和@Rollback注解。

Controller层

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

//JUnit5
@SpringBootTest
public class MybatisTestControllerTest {@Autowiredprivate MybatisTestController mybatisTestController;private MockMvc mockMvc;@BeforeEachpublic void initMock(){mockMvc = MockMvcBuilders.standaloneSetup(mybatisTestController).build();}@Testpublic void testGetMybatisInfo() throws Exception {String url = "/get";MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get(url)).andExpect(MockMvcResultMatchers.status().isOk()).andReturn();Assertions.assertNotNull(result);}
}


推荐阅读
  • C语言自带的快排和二分查找
    Author🚹:CofCaiEmail✉️:cai.dongjunnexuslink.cnQQ😙:1664866311personalPage&#x ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • 从批量eml文件中提取附件的Python代码实现方法
    本文介绍了使用Python代码从批量eml文件中提取附件的实现方法,包括获取eml附件信息、递归文件夹下所有文件、创建目的文件夹等步骤。通过该方法可以方便地提取eml文件中的附件,并保存到指定的文件夹中。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
author-avatar
明年夏天1314520
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有