如何在测试中模拟慢速SQL数据库?

时间:2016-09-07 12:57:43

标签: java spring hibernate jdbc

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

我想创建测试,我强制我的数据库很慢。怎么做?
我使用Spring Boot,Spring Data,Hibernate,MariaDB。

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

我想减慢一次测试的数据库访问速度(对于所有访问,不是全局访问)。

我被建议引入数据库触发器(BEFORE SELECT)和sleep

但这并不灵活,因为它会降低每次访问的速度,而不是只进行一次测试。

4 个答案:

答案 0 :(得分:4)

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

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

  2. 您可以使用数据库提供的sleep(10)函数,这需要"注入"它用于SQL查询或覆盖方法,用于测试并用SELECT替换SELECT SLEEP(10)

  3. 如果您使用mysql,请使用mysqlslap对数据库进行压力测试。

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

  5. 如果它很愚蠢,但它有效,那就不傻了。

答案 1 :(得分:2)

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

您可以使用模拟慢速查询(但这仅适用于SQL Server):

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

答案 2 :(得分:1)

如果要编写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

答案 3 :(得分:-2)

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

credit:此答案由https://stackoverflow.com/users/37213/duffymo在评论中提供。