Cucumber和SpringBoot的每个测试的数据源

Cucumber和SpringBoot的每个测试的数据源,spring,junit,cucumber,datasource,h2,Spring,Junit,Cucumber,Datasource,H2,我有一个黄瓜测试设置与春季开机。有大量的集成测试需要一段时间才能运行。因为它们共享一个数据库,Cucumber4+中的新线程模式无法正常工作(如预期) 理想情况下,这也适用于Junit 对于每个测试,我希望创建一个动态数据源,其中包含一个新的数据库/数据源实例,该测试可以独立于其他实例使用,从而允许它运行多线程(并使用我提供的12个内核) 我在DataSource bean上尝试了@Scope(“cucumber glue”)和@Scope(“prototype”),但结果是org.spring

我有一个黄瓜测试设置与春季开机。有大量的集成测试需要一段时间才能运行。因为它们共享一个数据库,Cucumber4+中的新线程模式无法正常工作(如预期)

理想情况下,这也适用于Junit

对于每个测试,我希望创建一个动态数据源,其中包含一个新的数据库/数据源实例,该测试可以独立于其他实例使用,从而允许它运行多线程(并使用我提供的12个内核)

我在DataSource bean上尝试了
@Scope(“cucumber glue”)
@Scope(“prototype”)
,但结果是
org.springframework.beans.factory.beancurrentlyIncremarationException:创建名为“DataSource”的bean时出错:请求的bean当前正在创建中:是否存在无法解析的循环引用?

如果我使用prototype作用域,每次都会调用bean创建方法,但会出现此错误,glue作用域也是如此

我还向类和方法添加了
@DirtiesContext(classMode=DirtiesContext.classMode.BEFORE\u EACH\u TEST\u METHOD)
,没有范围,但这似乎没有任何作用

我有没有办法: 1.为每个测试创建一个新的数据源,并让hibernate创建表? 2.汇集一组可供测试使用的数据源? 3.是否相应地填充/重新初始化上下文

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

@Configuration
public class H2DynamicDataSource {

@Autowired
private Environment env;

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

}
干杯
希望你已经解决了这个问题。 我只是浏览了一些类似的东西,想在SlackOverflow周围转转,看看是否有人在做类似的事情(或者询问如何做类似的事情),然后看到了这篇文章。我想这是一个很好的地方放下这些信息,以防其他人试图走这条路

我认为你提出了两个问题:

  • 如何使用Cucumber和Junit Cucumber实现多线程?

    多线程工作得很好,但是您被限制在一条通道内 如果您使用
    cumber
    SpringJUnit4ClassRunner
    runner junit runner类。(我怀疑这就是@CucumberOptions不包含线程参数的原因。对于当前的Cucumber runner实现来说,它是无用的。)

    为了让这个工作,我必须写我自己的测试运行程序 将整个测试执行延迟到Cucumbers
    运行时
    对象我使用了一个定制的cucumber插件来缓存结果和 然后,当被要求“运行”测试时,将这些结果转发给junit 个别测试。黄瓜在方向盘后面,我可以允许 任意数量的线程用于我的测试

  • 如何确保每个测试都有一个新的spring数据源?

    如果你不熟悉SpringCache的测试上下文,你应该浏览一下这里的文档,但是tl;dr:Spring的
    TestContextManager
    (这是Springs-junit-runner引擎盖下的内容)将创建一个Spring上下文,并将其存储在由测试配置键入的映射中。DirtiesContext将强制重新加载上下文。。但在其他方面,具有相同父类的两个测试可以有效地保证在相同的测试上下文中执行。如果您的数据源是在引导期间初始化的spring数据源。。您肯定需要在测试之间刷新此上下文

  • 把这两个概念放在一起。。Cucumber Spring提供了一种为每个测试创建新上下文(与cucumbers每个测试设计的新“世界”一致)的方法,但它忽略了其中包含的任何现有Spring上下文或数据。如果您可以信任Cucumber Spring为您正确地建立数据源,那么这实际上可能会对您有所帮助。。但在我的情况下,我们在使用这个假上下文时遇到了一系列问题,并且确实需要从默认的spring上下文中提取对象。在我的例子中,我必须将Springs
    TestContextManager
    合并到我的自定义插件中,并编写我自己的Cucumber
    BackendSupplier
    实现来劫持Cucumbers依赖项注入机制(有效地取代Cucumber Spring)


    总之,你想做的是一件大事,我希望黄瓜人能在某个时候让这件事变得容易些。。但是你想做的是绝对可能的。希望你能成功

    谢谢,这是一个很好的崩溃。事实证明,我的问题与我认为的不同。当我非常高兴地从cucumber访问db时,我通过一个mq更新它,它在另一个事务中运行,因此不允许我正确地回滚。最后我用手拆了下来。希望这对别人有帮助