首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring引导-测试类在完成后不会释放数据库连接

Spring引导-测试类在完成后不会释放数据库连接
EN

Stack Overflow用户
提问于 2020-09-11 08:14:19
回答 1查看 819关注 0票数 0

我有一个Spring应用程序,需要测试所有东西。我遇到了这个问题。

当我启动我的测试(例如来自Gitlab管道)时,测试从一开始就运行得很快。但是测试越多,测试的速度就越慢。为另一个测试类加载Spring应用程序上下文的速度越来越慢。我还发现,在测试期间,数据库连接保持活动的,应用程序在所有测试都完成之后释放它们--尽管大多数类很久以前就已经完成了。有没有人遇到过这个问题,并找到了解决办法?

我在测试中使用的注释:

代码语言:javascript
运行
复制
// Service test class example
@ExtendWith(SpringExtension.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@Import({SomeService.class})
@Sql("classpath:testdata/some_test_data.sql")
public class SomeServiceTest {
代码语言:javascript
运行
复制
// Controller test class example
@ComponentScan(basePackages = {"some.package.with.tests"})
@ExtendWith(SpringExtension.class)
@AutoConfigureMockMvc
@SpringBootTest
@Transactional
@Sql("classpath:testdata/some_test_data.sql")
public class SomeControllerTest {
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-16 13:36:09

我用两个步骤解决了这个问题:

步骤1: DirtiesContext注释-在完成来自特定类的测试后发布的DB连接,所以如果我设置了maximum-pool-size: 5,它现在将只使用这5个连接。

用法:

代码语言:javascript
运行
复制
@DirtiesContext(classMode = ClassMode.AFTER_CLASS)

步骤2:增加测试内存,-我还必须增加单元测试的内存,这样就不会得到OutOfMemoryExceptionMAVEN_OPTS不适合我,所以我不得不在pom.xml中使用并配置插件。

代码语言:javascript
运行
复制
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>3.0.0-M5</version>
  <configuration>
    <argLine>-Xmx2048m</argLine>
  </configuration>
</plugin>

在此之后,我的测试管道时间要快得多。从之前的20分钟到30分钟,现在花了8分钟.

“非常感谢”安迪·威尔金森给出的好建议。

编辑!之后,我的测试在Sonar上得到了0%的报道。经过一段时间的搜索,我也找到了解决办法:

步骤3:定义属性sonar.surefire.argLine

代码语言:javascript
运行
复制
<properties>
  ...
  <sonar.surefire.argLine>-Xmx2048m</sonar.surefire.argLine>
</properties>

步骤4:重写插件

代码语言:javascript
运行
复制
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>3.0.0-M5</version>
  <configuration>
    <argLine>@{argLine} ${sonar.surefire.argLine}</argLine>
  </configuration>
</plugin>

这里的问题是,jacoco插件需要访问surefire的argLine,但是在手动添加它之后,它就不可能了。这就是为什么我必须添加@{argLine}的原因,jacoco使用了@{argLine}${sonar.surefire.argLine}只是为了更好的代码外观,所以我可以与其他定义的属性进行-Xmx2048m争论。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63843274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档