使用Cucumber和SpringBoot进行的每个测试的数据源

时间:2018-11-30 11:42:11

标签: spring junit cucumber datasource h2

我有一个带有弹簧靴的黄瓜测试装置。有许多集成测试需要一段时间才能运行。因为他们共享一个数据库,所以黄瓜4+中的新线程模式不起作用(按预期方式)。

理想情况下,这在Junit中也适用。

对于每个测试,我想使用一个新的数据库/数据源实例创建一个动态数据源,该测试可以独立于其他实例使用,从而使其可以运行多线程(并使用我现有的12个内核)。

我在DataSource bean上尝试了@Scope("cucumber-glue")@Scope("prototype"),但这导致了org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'dataSource': Requested bean is currently in creation: Is there an unresolvable circular reference?

如果我使用原型作用域,则每次创建bean创建方法都会调用一次,但是会产生此错误,粘合范围也是如此。

我还向类和方法中添加了@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD),没有范围,但这似乎无济于事。

有没有一种方法可以: 1.为每个测试创建一个新的数据源,并让休眠创建表? 2.合并一组可以由测试使用的数据源? 3.相应地填充/重新初始化上下文?

这样做的一个副作用是,我不认为在其他范围界定实例的测试之间可以正确地重新创建我的上下文。

@Configuration
public class H2DynamicDataSource {

@Autowired
private Environment env;

@Bean
@Scope("prototype")
public DataSource dataSource() {
    return new EmbeddedDatabaseBuilder()
            .setType(EmbeddedDatabaseType.H2)
            .build();
}

}

欢呼 R

1 个答案:

答案 0 :(得分:0)

希望您已经解决了这个问题。 我只是经历了类似的事情,感觉就像在SlackOverflow周围巡游,看是否有人在做类似的事情(或者问如何做这样的事情)并看到了这篇文章。认为这是丢弃此信息的好地方,以防其他任何人尝试走这条路。

我想你问两个问题:

  1. 如何使多线程与Cucumber和Junit Cucumber一起使用?

    多线程效果很好,但是您只能使用一个通道 如果您使用CucumberSpringJUnit4ClassRunner运动员junit运动员课程。 (我怀疑这就是@CucumberOptions不包含线程arg的原因。它与当前的CucumberRunner实现无关。)

    为了使它正常工作,我必须编写自己的测试运行程序 会将整个测试执行推迟到黄瓜Runtime 宾语。我使用了自定义的黄瓜插件来缓存结果, 然后在要求“运行” 个别测试。有了黄瓜,我才得以允许 用于测试的任意数量的线程。

  2. 如何为每次测试确保新的spring数据源?

    如果您不熟悉Spring缓存的测试环境,则应该在https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#testcontext-ctx-management-caching处浏览一下文档,但是tl; dr:Spring的TestContextManager(这就是Springs的含义junitRunner)将在您的测试配置作为键的映射中创建并存储spring上下文。 DirtiesContext将强制重新加载上下文。.否则,有效保证具有相同父类的两个测试可以在同一测试上下文中执行。如果您的数据源是在引导过程中初始化的spring数据源,那么您肯定需要在测试之间刷新此上下文。

将这两个概念放在一起。Cucumber-Spring提供了一种为每个测试创建新上下文(与每个测试设计的黄瓜新的“世界”相一致)的方法,但是通过忽略现有的任何Spring上下文或其中包含的数据来实现。如果您可以信任Cucumber-Spring为您正确地建立数据源,那么这实际上可能对您有所帮助。但是在我的情况下,使用此伪造上下文存在很多问题,确实需要从默认的Spring上下文中提取对象。就我而言,我必须将Springs TestContextManager合并到自定义插件中,并编写自己的Cucumber BackendSupplier实现以劫持Cucumbers依赖项注入机制(有效替代Cucumber-Spring)

总而言之,您尝试做的是主要的PITA,我希望黄瓜的人们在某个时候使此变得容易。.但是您尝试做的事情绝对是可能的。希望你能正常工作!