广告
返回顶部
首页 > 资讯 > 前端开发 > html >spring boot集成测试的方法
  • 381
分享到

spring boot集成测试的方法

2024-04-02 19:04:59 381人浏览 安东尼
摘要

这篇文章主要介绍“Spring Boot集成测试的方法”,在日常操作中,相信很多人在spring boot集成测试的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”spri

这篇文章主要介绍“Spring Boot集成测试的方法”,在日常操作中,相信很多人在spring boot集成测试的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”spring boot集成测试的方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

如果希望很方便针对api进行测试,并且方便的集成到CI中验证每次的提交,那么spring boot自带的IT绝对是不二选择。

迅速编写一个测试Case

@RunWith(SpringRunner.class)

@SpringBootTest(WEBEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)

@ActiveProfiles({Profiles.ENV_IT})

public class DemoIntegrationTest {

 @Autowired

 private FooService fooService;

 @Test

 public void test() {

 System.out.println("tested");

 }

}

其中SpringBootTest定义了跑IT时的一些配置,上述代码是用了随机端口,当然也可以预定义端口,像这样

1

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT, properties = {"server.port=9990"})

ActiveProfiles强制使用了IT的Profile,从最佳实践上来说IT Profile所配置的数据库或者其他资源组件的地址,应该是与开发或者Staging环境隔离的。因为当一个IT跑完之后很多情况下我们需要清除测试数据。

你能够发现这样的Case可以使用Autowired注入任何想要的Service。这是因为spring将整个上下文都加载了起来,与实际运行的环境是一样的,包含了数据库缓存等等组件。如果觉得测试时不需要全部的资源,那么在profile删除对应的配置就可以了。这就是一个完整的运行环境,唯一的区别是当用例跑完会自动shutdown。

测试一个Rest API

强烈推荐一个库,加入到gradle中

testCompile 'io.rest-assured:rest-assured:3.0.3'

支持JSONPath,十分好用,具体文档戳这里

@sql(scripts = "/testdata/users.sql")

@Test

public void test001Login() {

 String username = "demo@demo.com";

 String passWord = "demo";

 JwtAuthenticationRequest request = new JwtAuthenticationRequest(username, password);

 Response response = given().contentType(ContentType.jsON).body(request)

 .when().post("/auth/login").then()

 .statusCode(httpstatus.OK.value())

 .extract()

 .response();

 assertThat(response.path("token"), is(IsNull.notNullValue()));

 assertThat(response.path("expiration"), is(IsNull.notNullValue()));

}

@Sql用于在测试前执行sql插入测试数据。注意given().body()中传入的是一个java对象JwtAuthenticationRequest,因为rest-assured会自动帮你用jackson将对象序列化成json字符串。当然也可以将转换好的json放到body,效果是一样的。

返回结果被一个Response接住,之后就可以用JsonPath获取其中数据进行验证。当然还有一种更直观的办法,可以通过response.asString()获取完整的response,再反序列化成java对象进行验证。

至此,最基本的IT就完成了。 在jenkins增加一个stepgradle test就可以实现每次提交代码都进行一次测试。

一些复杂的情况

数据混杂

这是最容易发生,一个项目有很多dev,每个dev都会写自己的IT case,那么如果数据之间产生了影响怎么办。很容易理解,比如一个测试批量写的场景,最后验证方式是看写的数据量是不是10w行。那么另外一个dev写了其他的case恰好也新增了一条数据到这张表,结果变成了10w+1行,那么批量写的case就跑不过了。

为了杜绝这种情况,我们采用每次跑完一个测试Class就将数据清空。既然是基于类的操作,可以写一个基类解决。

@RunWith(SpringRunner.class)

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)

@ActiveProfiles({Profiles.ENV_IT})

public abstract class BaseIntegrationTest {

 private static JdbcTemplate jdbcTemplate;

 @Autowired

 public void setDataSource(DataSource dataSource) {

 jdbcTemplate = new JdbcTemplate(dataSource);

 }

 @Value("${local.server.port}")

 protected int port;

 @Before

 public void setupEnv() {

 RestAssured.port = port;

 RestAssured.basePath = "/api";

 RestAssured.baseURI = "Http://localhost";

 RestAssured.config = RestAssured.config().httpClient(HttpClientConfig.httpClientConfig().httpMultipartMode(HttpMultipartMode.BROWSER_COMPATIBLE));

 }

 public void tearDownEnv() {

 given().contentType(ContentType.JSON)

 .when().post("/auth/loGout");

 }

 @AfterClass

 public static void cleanDB() throws SQLException {

 Resource resource = new ClassPathResource("/testdata/CleanDB.sql");

 Connection connection = jdbcTemplate.getDataSource().getConnection();

 ScriptUtils.executeSqlScript(connection, resource);

 connection.close();

 }

}

@AfterClass中使用了jdbcTemplate执行了一个CleanDB.sql,通过这种方式清除所有测试数据。

@Value("${local.server.port}")也要提一下,因为端口是随机的,那么Rest-Assured不知道请求要发到losthost的哪个端口上,这里使用@Value获取当前的端口号并设置到RestAssured.port就解决了这个问题。

共有数据怎么处理

跑一次完整的IT,可能需要经历数十个Class,数百个method,那么如果一些数据是所有case都需要的,只有在所有case都跑完才需要清除怎么办?换句话说,这种数据清理不是基于类的,而是基于一次运行。比如初始用户数据,城市库等等

我们耍了个小聪明,借助了flyway

@Configuration

@ConditionalOnClass({DataSource.class})

public class UpgradeAutoConfiguration {

 public static final String FLYWAY = "flyway";

 @Bean(name = FLYWAY)

 @Profile({ENV_IT})

 public UpgradeService cleanAndUpgradeService(DataSource dataSource) {

 UpgradeService upgradeService = new FlywayUpgradeService(dataSource);

 try {

 upgradeService.cleanAndUpgrade();

 } catch (Exception ex) {

 LOGGER.error("Flyway failed!", ex);

 }

 return upgradeService;

 }

}

可以看到当Profile是IT的情况下,flyway会drop掉所有表并重新依次执行每次的upgrade脚本,由此创建完整的数据表,当然都是空的。在项目的test路径下,增加一个版本极大的sql,这样就可以让flyway在最后插入共用的测试数据,例如src/test/resources/db/migration/V999.0.1__Insert_Users.sql ,完美的解决各种数据问题。

到此,关于“spring boot集成测试的方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: spring boot集成测试的方法

本文链接: https://www.lsjlt.com/news/93645.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • spring boot集成测试的方法
    这篇文章主要介绍“spring boot集成测试的方法”,在日常操作中,相信很多人在spring boot集成测试的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”spri...
    99+
    2022-10-19
  • spring boot集成redisson的方法
    本文小编为大家详细介绍“spring boot集成redisson的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“spring boot集成redisson的方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入...
    99+
    2023-06-29
  • Spring Boot 集成PageHelper的使用方法
    目录前言:一、基本集成引入jar包Yml配置文件中添加相关配置封装相关分页方法示例代码前段传入参数执行结果二、分页中的排序字段如何防止SQL注入问题三、复杂的SQL分页语句四、分页失...
    99+
    2022-11-13
  • Spring Boot 集成 Kafkad的实现方法
    本篇内容介绍了“Spring Boot 集成 Kafkad的实现方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Spring Boot 作...
    99+
    2023-06-14
  • 【Spring Boot丨(11 )】json的集成
    集成JSON 概述JacksonGsonJSON-B 主页传送门:📀 传送 概述 Spring boot 提供了三种json库的集成: GsonJacksonJSON-B 上述三种库提供了将Jav...
    99+
    2023-08-19
    spring boot json java 后端
  • Spring Boot集成springfox-swagger2构建restful API的方法教程
    前言之前跟大家分享了Spring MVC集成springfox-swagger2构建restful API,简单写了如何在springmvc中集成swagger2。这边记录下在springboot中如何集成swagger2。其实使用基本相同...
    99+
    2023-05-31
    springboot springfox-swagger2 restful
  • 开发脚手架集成Spring Boot Actuator监控的方法
    今天小编给大家分享一下开发脚手架集成Spring Boot Actuator监控的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获...
    99+
    2023-06-30
  • SpringBoot2 集成测试组件的七种方法
    目录一、背景描述 二、PostMan工具 三、Swagger文档 四、TestRestTemplate类 五、Http请求模式 六、Service层测试 七、MockMvc方式 八、...
    99+
    2022-11-12
  • Spring Boot 项目集成Redis的方式详解
    集成方式 使用Jedis Jedis是Redis官方推荐的面向Java的操作Redis的客户端,是对服务端直连后进行操作。如果直接使用Jedis进行连接,多线程环境下是非线程安全的...
    99+
    2022-11-12
  • Spring Boot集成redis,key自定义生成方式
    一)自定义redis key生成策略 @Configuration:表示当前类属于一个配置类,类似于一个spring.cfg.xml。 @EnableCaching:表示支持启用缓存...
    99+
    2022-11-12
  • 详解Spring Boot集成MyBatis(注解方式)
    MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。spring Boot是能支持快速创建Spring应用的Java框架。本文通过一个例子来学习Spring B...
    99+
    2023-05-31
    spring boot mybatis
  • 新鲜速递:Spring Boot 3 项目快速集成 Spring Security 6的方法
    准备 Spring Boot 3正式版本已发版了半个月,Spring Security6也一并更新,但是网络上的相关中文文档较少,盲目进行集成容易出错,所以本文讲如何快速集成。这里不再赘述Spring Boot3和Spring Securi...
    99+
    2023-08-25
    spring spring boot java
  • Spring Boot集成Shiro并使用SHA-256加密密码的方法
    这篇文章主要介绍“Spring Boot集成Shiro并使用SHA-256加密密码的方法”,在日常操作中,相信很多人在Spring Boot集成Shiro并使用SHA-256加密密码的方法问题上存在疑惑,小...
    99+
    2022-10-19
  • 教你在Spring Boot微服务中集成gRPC通讯的方法
    一、首先声明gRPC接口 这里引入的是最新的gRpc-core 1.37版本, 采用的grcp-spring-boot-starter封装的版本进行实现,github地址: http...
    99+
    2022-11-12
  • Spring Boot使用注解集成Redis缓存的方法是什么
    这篇文章主要介绍“Spring Boot使用注解集成Redis缓存的方法是什么”,在日常操作中,相信很多人在Spring Boot使用注解集成Redis缓存的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家...
    99+
    2023-06-04
  • Sprint Boot 集成MongoDB的操作方法
    mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多。由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置漏洞被攻击,数据被删,引起了人们的注意,...
    99+
    2023-05-30
    spring boot mongodb
  • spring boot集成p6spy的最佳实践
    目录前言p6spy-spring-boot-starter快速集成第一步:导入依赖第二步:配置application.properties配置智能提示兼容原生所有配置项 前言 P6S...
    99+
    2022-11-13
  • Spring Boot 集成 Kafkad的实现示例
    目录前言 为什么使用kafka?业务场景基本架构 常用术语 代码演示 外部依赖:配置文件:发送消息:消费消息:演示工程代码 Spring Boot 作为主流微服务框架,拥有成熟的社区...
    99+
    2022-11-12
  • spring boot集成shiro的示例分析
    小编给大家分享一下spring boot集成shiro的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!spring boot提供了一个自带的认证框架,同时...
    99+
    2023-05-30
  • spring boot集成rabbitmq的示例分析
    这篇文章主要为大家展示了“spring boot集成rabbitmq的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“spring boot集成rabbitmq的示例分析”这篇文章吧。一、...
    99+
    2023-05-30
    springboot rabbitmq
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作