2016-08-26 109 views
2

我的大部分数据库测试都不使用Spring,因为这样它们的启动速度要快得多。但我也想运行实际运行整个Spring Boot应用程序的烟雾测试。在弹簧和非弹簧测试之间共享属性

我想在一个地方有数据库连接参数。要做到这一点,我想我有两个选择:

  1. 模拟/重复使用Spring的性能加载在我的非弹簧试验
  2. 注入我的属性在运行时计算的(注释以恒定的不是一个选项)到Spring配置在烟雾测试

任何想法如何实现这些?或者也许有一些更简单的方法?

回答

0

您可以将数据库连接参数导出为与您的application.properties中的属性完全相同的系统属性。由于Spring Boot处理外部化配置的方式,这些值将覆盖Spring配置中的属性(或YAML,无论使用哪个)文件中的值,然后您只需在非Spring测试中使用系统属性。

虽然我会建议让这些数据库测试成为Spring套件的一部分,但实际上只有在执行单个测试时才会获得速度;除非您有@DirtiesContext测试或使用不同@ActiveProfiles注释的测试,否则Spring将缓存应用程序上下文,并且仅在整个测试套件中对其进行初始化。

下面是the official documentation报价:

了Spring TestContext Framework提供了春天的ApplicationContexts和WebApplicationContexts一致的装载以及那些上下文的缓存机制。 支持加载上下文的缓存很重要,因为启动时间可能成为一个问题 - 不是因为Spring本身的开销,而是因为Spring容器实例化的对象需要时间来实例化。例如,一个包含50到100个Hibernate映射文件的项目可能需要10到20秒才能加载映射文件,并且在每个测试夹具中运行每个测试之前产生该成本会导致整体测试运行速度降低,从而降低开发人员的生产力。

默认情况下,一旦加载,为每个测试重新使用配置的ApplicationContext。因此,每个测试套件只需支付一次设置成本,并且后续的测试执行速度要快得多。在此上下文中,术语测试套件意味着所有测试都运行在同一个JVM中 - 例如,对于给定的项目或模块,所有测试都是从Ant,Maven或Gradle构建运行的。

+0

系统属性是丑陋的,但我承认,他们完成了工作。在接受你的答案之前,我会等待一些“微创”解决方案。将测试迁移到春天不是一个选择:每次200ms vs 5s。这对TDD – piotrek

+0

有很大的影响,但我没有看到更简单的方法。我自己一直首选[添加环境准备应用程序侦听器的方法](http://stackoverflow.com/a/38985183/4657798),但这对您的用例来说有点重量级。在你的情况下,你必须有一个静态的Map字段来保存你传递给侦听器的配置,所以我认为系统属性仍然是一种侵入性较弱的方法 –

0

您可以在专用的Java db.properties文件,您可以加载您的标准测试和春季启动测试存储你的数据库连接属性。

然后,您可以通过指定自定义spring.config.location来指示Spring Boot加载db.properties以及标准Spring Boot应用程序属性文件。

Spring Boot参考手册的Application property files部分提供了所有您需要的细节。