千家信息网

spring boot集成测试的方法

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍"spring boot集成测试的方法",在日常操作中,相信很多人在spring boot集成测试的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"s
千家信息网最后更新 2026年11月01日spring boot集成测试的方法

这篇文章主要介绍"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集成测试的方法"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

数据 测试 方法 情况 端口 学习 验证 对象 环境 问题 运行 配置 代码 序列 怎么办 数据库 方式 更多 组件 结果 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技园 中智农互联网科技 广东猪兼强互联网科技有限公司 互联网养老 桔豆科技 互联网科技公司做什么 北京三清互联网科技 西藏七维空间互联网科技有限公司 南平创想时代互联网科技有限公司 青岛科技大学互联网大赛研究生 华夏互联网科技业 坤平互联网科技 互联网科技研发水平 乌鲁木齐新华智原互联网科技学校 深圳市罗太互联网科技有限公司 卓翼科技产业互联网合作 江苏苏星互联网科技有限公司 半导体是互联网高科技吗 陕西云淼互联网科技公司 万物互联网智能科技 科技和互联网行业的特点 互联网科技图片 广东万易互联网科技有限公司惠州分公司 江苏根荣互联网科技 科技制造互联网公司 互联网金融 金融科技 互联网科技排名 深圳前海聚择互联网科技有限公司 科技互联网海报 唐山双旺合互联网科技产业园 互联网的黑科技实验室
0