目录

  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. python列表自动扩容机制

    问题引入:在对比列表与元组的优缺点时,百度答案为:列表是可变的,可以随时进行增加.修改.删除操作,可以进行动态扩容,动态扩容是以牺牲性能损耗的为代价的,于是我搜索了一下列表的动态扩容 当在创建一个列表 ...

  2. 【Flink 日常踩坑】Could not find ExecutorFactory in classpath

    Description 一段简单的 FlinkSQL 程序,在 IDE 中运行没问题,但是 maven 打包后发布到终端启动却报错了. import org.apache.flink.configur ...

  3. 深入解析Apache Mina源码(1)——Mina的过滤器机制实现

    1.深入解析Apache Mina源码(1)--Mina的过滤器机制实现 2.深入解析Apache Mina源码(2)--Mina的事件模型 3.深入解析Apache Mina源码(3)--Mina的 ...

  4. 服务器间文件实时双向同步(rsync+inotify)

    场景: 主从服务器项目文件实时双向同步(参考:http://www.xcx1024.com/ArtInfo/3026389.html) 一.rsync安装 yum在线: yum install -y ...

  5. Prime1_解法一:cms渗透 & 内核漏洞提权

    Prime1_解法一:cms渗透 & 内核漏洞提权 目录 Prime1_解法一:cms渗透 & 内核漏洞提权 信息收集 主机发现 nmap扫描 tcp扫描 tcp详细扫描22,80端口 ...

  6. Tailwind CSS样式优先级控制

    前情 Tailwind CSS 是一个原子类 CSS 框架,它将基础的 CSS 全部拆分为原子级别,能达到最小化项目CSS.它的工作原理是扫描所有 HTML 文件.JavaScript 组件以及任何模 ...

  7. 前端每日一知之css隐藏页面元素

    脑图在线链接 本文内容依据[js每日一题]公众号精彩文章总结而来

  8. ArkTs布局入门02——弹性布局(Flex)

    1.概述 弹性布局(Flex)提供更加有效的方式对容器中的子元素进行排列.对齐和分配剩余空间.容器默认存在主轴与交叉轴,子元素默认沿主轴排列,子元素在主轴方向的尺寸称为主轴尺寸,在交叉轴方向的尺寸称为 ...

  9. codeforces 1978 D. Elections

    题目链接 https://codeforces.com/problemset/problem/1978/D 题意 对于每个测试用例,共有 \(n\) 个人,每个人的号码分别是 \(1,2,...,n\ ...

  10. 小程序,用户授权手机号,node需要检验和解析

    1. 第一步需要先在小程序api文档中下载对应语言的解密算法,解压之后就可以看到 https://developers.weixin.qq.com/miniprogram/dev/framework/ ...