目录

  1. 简介
  2. 版本及依赖引入
    1. springboot版本
    2. 项目部分依赖
  3. 直接使用SpringBootTest方式
    1. 代码示例
    2. 场景及优劣
  4. 最小化依赖方案
    1. 代码
    2. 思路及步骤
    3. 最小化依赖方案的优点
  5. 结论

简介

想要代码跑的稳, 集成测试还是必不可少的, 不然出现开发环境正常, 集成环境各种问题就坑爹了。

当前项目对外提供各种rest接口, 通过RestTemplate做接口测试, 同时需要注入一些SpringBean, 如何使用SpringBootTest又不需要启动整个容器?

版本及依赖引入

springboot版本

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

项目部分依赖

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

直接使用SpringBootTest方式

代码示例

@RunWith(SpringRunner.class)
// 默认启动容器
@SpringBootTest
public class BdgResourceITest { @Autowired
@Qualifier(value = "iTestRestTemplate")
private RestTemplate restTemplate; @Test
public void testPull() throws URISyntaxException { // /pull/{mof_div_code}/{fiscal_year}/{agency_code}
String url = "/api/pull/340000000/2022/001001";
final ResponseEntity<ResponseData> exchange = restTemplate.exchange(
RequestEntity.get(new URI(url)).build(), ResponseData.class); Assert.isTrue(exchange.getStatusCode().equals(HttpStatus.OK), "本单位数据获取异常");
}
}

场景及优劣

优势

如果是测试类中大量引入了依赖, 这种情况下直接启动容器比较方便, 不过集成测试个人感觉从入口访问即可, 这种嵌套比较深的建议使用单元测试

劣势

当前项目中测试代码需要依赖很少, 极端情况下只用restTemplate即可, 根本没必要启动容器, 而且启动容器占用了大量时间

项目中使用了ehcache3.x作为本地缓存, 启动容器后因为文件锁无法测试, 如果单独指定ehcache.xml配置, 又会产生新的垃圾, 所以果断减少依赖

最小化依赖方案

代码

@RunWith(SpringRunner.class)
// 指定class就不启动容器了
@SpringBootTest(classes = BdgResourceITest.class)
@Import(value = {ITestRestTemplateConfigurer.class})
// 激活 main 中resources下的test profile
//@ActiveProfiles("dev")
// 加载测试目录resources下的application.yml文件
//@TestPropertySource(properties = {"spring.config.location=classpath:application.yml"})
public class BdgResourceITest { @Autowired
@Qualifier(value = "iTestRestTemplate")
private RestTemplate restTemplate; @Test
public void testPull() throws URISyntaxException { // /pull/{mof_div_code}/{fiscal_year}/{agency_code}
String url = "/api/pull/340000000/2022/001001";
final ResponseEntity<ResponseData> exchange = restTemplate.exchange(
RequestEntity.get(new URI(url)).build(), ResponseData.class); Assert.isTrue(exchange.getStatusCode().equals(HttpStatus.OK), "本单位数据获取异常");
}
}

思路及步骤

通过指定SpringBootTest的classes, 只启动当前类,如果需要注入其它bean, 则使用@import进行引入

如果import内部的类也也需要引入其它类, 同理根据需要使用@Import注解, 这样产生的代码更加聚合, 所然在当前类可以全部@Import, 但是看着头疼

对于需要引入yml配置信息的,可以配合@EnableConfigurationProperties读取测试目录下的application.yml文件

最小化依赖方案的优点

减少了容器启动时间, 对于当前项目更加符合实际的使用场景, 毕竟第三方使用不可能启动你自己的容器:D

更加优雅的解决了ehcache同时被容器扫描启动, 本地文件锁导致测试无法运行, 实际测试代码根本不需要缓存, 项目服务有就行

测试代码也更加简单优雅, 可以直接提供第三方公司作为接口请求示例代码

结论

如果集成测试的场景类似当前项目情况, 全部测试都从rest接口入手, 建议采用最小容器依赖方案

springboot集成测试最小化依赖实践的更多相关文章

  1. ASP.NET Core在CentOS上的最小化部署实践

    引言        本文从Linux小白的视角, 在CentOS 7.x服务器上搭建一个Nginx-Powered AspNet Core Web准生产应用. 在开始之前,我们还是重温一下部署原理,正 ...

  2. CentOS 6.x 最小化安装推荐安装的依赖包和修改内核参数

    CentOS 6.x 最小化安装推荐安装的依赖包 我在日常工作中,新建的xenserver的虚拟机,CentOS release 6.9 (Final)操作系统,采用最小化安装,后续很多操作需要各种依 ...

  3. K-means的缺点(优化不仅仅是最小化误差)

    K-means的缺点(优化不仅仅是最小化误差) #转载时,请注明英文原作David Robinson,译者Ding Chao.# 我最近遇到一个交叉验证的问题,我认为这个给我提供了一个很好的机会去用“ ...

  4. 最小化 Java 镜像的常用技巧

    背景 随着容器技术的普及,越来越多的应用被容器化.人们使用容器的频率越来越高,但常常忽略一个基本但又非常重要的问题 - 容器镜像的体积.本文将介绍精简容器镜像的必要性并以基于 spring boot ...

  5. 最小化安装debian10&gnome最小化安装

    直到后面配置网络源之前都是断网安装,因为debian security好像总是要去总源找点东西,所以即便你选择国内源甚至不选择网络源安装,依然会莫名 的失败. I. 最小化安装debian10(用ro ...

  6. (MTT)连续能量函数最小化方法

    (MTT)连续能量函数最小化方法 Multitarget tracking Multi-object tracking 连续能量函数 读"A.Milan,S. Roth, K. Schind ...

  7. VC++ 如何使窗体最大化或是最小化

    最大化最小的使得的函数是 ShowWindow函数 ShowWindow(SW_SHOWMINIMIZED);//最小化 ShowWindow(SW_SHOWMAXIMIZED);//最大化 Show ...

  8. 手把手教你搭建SpringMVC——最小化配置

    为什么需要Spring MVC 最开始接触网页的时候,是纯的html/css页面,那个时候还是用Dreamweaver来绘制页面. 随着网站开发的深入,开始学习servlet开发,记得最痛苦的就是se ...

  9. 实现iOS图片等资源文件的热更新化(四): 一个最小化的补丁更新逻辑

    简介 以前写过一个补丁更新的文章,此处会做一个更精简的最小化实现,以便于集成.为了使逻辑具有通用性,将剥离对AFNetworking和ReativeCocoa的依赖.原来的文章,可以先看这里: htt ...

  10. CentOS 7 最小化安装的网络配置

    默认的最小化安装CentOS 7系统以后,是没有ipconfig这个命令的,依赖于net-tools工具包. 一.nmtui 这是一个类似于图形化的命令(和setup类似) 通过这个组件窗口可以设置各 ...

随机推荐

  1. Emoji表情字符大全增强你的表达能力-记事本也可以有情感,总有一个您用得上,复制粘贴即可,赶紧收藏关注!!!

    这是手绘的吗?不,它是Emoji表情字符,就是普通的文本,你不相信? ️️️️️️ 上面的内容,你看得见吗?尝试选中复制一下,再粘贴到其它地方? 我在PC上和Android手机上操作都是正常的 这是记 ...

  2. 【一步步开发AI运动小程序】五、帧图像人体识别

    随着人工智能技术的不断发展,阿里体育等IT大厂,推出的"乐动力"."天天跳绳"AI运动APP,让云上运动会.线上运动会.健身打卡.AI体育指导等概念空前火热.那 ...

  3. 国产数据库oceanBbase,达梦,金仓与mysql数据库的性能对比 一、比对方法和结果

    最近调研了三款国产化数据库与mysql做对比,调研主要性能指标是大数据写入速度.大数据读取速度以及是否支持分表. 一.测试结果 测试结果与预期的差别很大     1.先说oceanBase社区版这款数 ...

  4. CodeForces - 1398C Good Subarrays

    CodeForces - 1398C 挺简单的题目,但是没有想到还是整理一下 方法1 把每个元素都减1,那么满足题意的就是一段和的值是0,然后维护前缀和,如果发现这个前缀和之前出现过,就说明有满足题意 ...

  5. Spring常见面试问题

    Spring 1.  Spring工作机制及为什么要用? Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.Spring既是一个AOP框架,也是一IOC容器. SpringFra ...

  6. 轻松使用线程: 不共享有时是最好的——利用 ThreadLocal 提高可伸缩性

    Brian Goetz (brian@quiotix.com), 软件顾问 简介: ThreadLocal 类是悄悄地出现在 Java 平台版本 1.2 中的.虽然支持线程局部变量早就是许多线程工具( ...

  7. vue表格轮播插件

    1.前言 需求:制作大屏看板时,经常要展示表格数据,通常一页时放不下的,表格需要自动滚动,并维持表头固定 为何自己封装:网上的滚动组件有2类,一种传入json数据进行滚动(DataV),优点是可以做到 ...

  8. Redis应用—5.Redis相关解决方案

    大纲 1.数据库与缓存一致性方案 2.热key探测系统处理热key问题 3.缓存大value监控和切分处理方案 4.Redis内存不足强制回收监控告警方案 5.Redis集群缓存雪崩自动探测 + 限流 ...

  9. 数据万象推出智能检索MetaInsight,现已开启限时公测

    海量文件的分析统计一直是对象存储COS的热点需求,伴随AIGC飞速迭代发展,在众多不同模态素材的海洋中,用户也急需更高效地管理和利用多媒体内容,打破传统搜索的桎梏. 数据万象推出的智能检索 MetaI ...

  10. Flutter 滑动组件互相嵌套问题

    滑动组件互相嵌套问题 如果listview/singlechildscrollview 嵌套gridview,将两个组件的shrinkwrap设置为true,并且gridview无法滚动 physic ...