【问题标题】:How to simulate slow SQL database in test?如何在测试中模拟慢速 SQL 数据库?
【发布时间】:2016-09-07 12:57:43
【问题描述】:

我有一个错误,它仅在数据库运行缓慢时才会出现。它适用于最简单的数据库操作(选择等)。

我想创建测试,我强制我的数据库变慢。如何做到这一点?
我使用 Spring Boot、Spring Data、Hibernate、MariaDB。

理想情况下,我希望“慢速数据库”部分完全包含在我的 java 应用程序中的测试代码中。这样,测试将完全自动化且独立。

我只想为一项测试减慢数据库访问速度(而不是全局,所有访问)。

有人建议我引入带睡眠的数据库触发器(BEFORE SELECT)

但这并不灵活,因为它会减慢每次访问,而不是仅针对一次测试的访问。

【问题讨论】:

  • 简单的答案是编写一个测试存储库类,其中嵌入了 Thread.sleep。
  • @duffymo 使用 Thread.sleep 似乎是个坏主意,几乎就像故意放慢速度但不知道要放慢多少。
  • 坏主意?这是一个测试——这就是我理解的整个想法。如果您愿意,可以将其设为一个范围内的随机值。关键是与失败相关的缓慢程度是已知的。
  • Thread.sleep 仅用于测试对我来说已经足够了。简单,做需要做的事。
  • this question 的一些答案可能很有趣。

标签: java spring hibernate jdbc


【解决方案1】:

我看到了这个问题的四种可能的解决方案。

  1. 您不必创建慢速数据库,您可以创建与数据库的慢速连接。如果您在不同的(虚拟)机器上运行数据库,有些系统会通过随机延迟网络响应来帮助模拟糟糕的互联网连接。

  2. 您可以使用数据库提供的 sleep(10) 函数,这需要将其“注入”到 SQL 查询或覆盖方法中以进行测试,并将 SELECT 替换为 SELECT SLEEP(10)

  3. 如果您使用 mysql,请使用 mysqlslap 模拟数据库压力测试。

  4. 另一种解决方案,有点愚蠢,您可以使用spring-aop 并在DAO 方法执行之前和之后附加一个延迟方面,并随机小睡眠。这样您就可以控制它,不必修改现有代码,让 spring 完成延迟工作,而无需集成到实际系统中。毕竟没那么傻。这个很灵活,我想我会去的。最容易设置。

如果它很愚蠢,但它有效,那么它并不愚蠢。

【讨论】:

  • 我最喜欢 spring-aop 解决方案。仅仅为了测试就很容易做到这一点。其他解决方案更复杂,需要手动设置的移动部件更多。我不介意写几行代码——如果我的“慢速数据库”测试将完全自动化。
  • @BartoszBilicki 根据您所说的一项测试是什么意思,我认为解决方案 4 易于设置且灵活。如果您的测试是在 selemium 上或端到端测试某些东西,它可能不是最好的,但绝对是最简单的。
  • 对,解决方案 4 适用于 junit 测试,它模拟部分应用程序。是否不适用于端到端测试。
【解决方案2】:

在 SQL Server 数据库上进行开发时,我也有类似的需求。

您可以使用模拟慢速查询(但这是特定于 SQL Server):

select * from TABLE
WAITFOR DELAY '00:00:45'--to simulate 45 seconds of delay

【讨论】:

    【解决方案3】:

    如果你想写一个Spring Boot Test,也许你可以使用@SpyBean注解

       @SpyBean
       SomeBeanCallingTheDatabase someBeanCallingTheDatabase;
    
       //...
       // in the test method
    
       doAnswer(answer-> {
                    Thread.sleep(300L); //any value here
                    return answer.callRealMethod();
                })
        .when(someBeanCallingTheDatabase)
                    .find(any());
    
       // call the service using the bean above
    

    【讨论】:

      【解决方案4】:

      简单的答案是编写一个嵌入了Thread.sleep 的测试存储库类。

      学分:这个答案是由https://stackoverflow.com/users/37213/duffymo 在评论中提供的。

      【讨论】:

        猜你喜欢
        • 2011-08-16
        • 2010-09-23
        • 1970-01-01
        • 2020-09-19
        • 1970-01-01
        • 1970-01-01
        • 2012-05-09
        • 2010-10-30
        • 1970-01-01
        相关资源
        最近更新 更多