我有一个只在数据库运行缓慢时出现的错误。它适用于最简单的数据库操作(选择等)。
我想创建测试,我强制我的数据库很慢。怎么做?
我使用Spring Boot,Spring Data,Hibernate,MariaDB。
理想情况下,我想要慢速数据库'在我的java应用程序中,部分完全包含在测试代码中。这样,测试将完全自动化并且独立。
我想减慢一次测试的数据库访问速度(对于所有访问,不是全局访问)。
我被建议引入数据库触发器(BEFORE SELECT)和sleep
但这并不灵活,因为它会降低每次访问的速度,而不是只进行一次测试。
答案 0 :(得分:4)
我看到了这个问题的四种可能的解决方案。
您不必创建慢速数据库,可以创建与数据库的慢速连接。如果您在另一台(虚拟)计算机上运行数据库,则有些系统可以通过随机延迟网络响应来帮助模拟糟糕的Internet连接。
您可以使用数据库提供的sleep(10)函数,这需要"注入"它用于SQL查询或覆盖方法,用于测试并用SELECT
替换SELECT SLEEP(10)
。
如果您使用mysql,请使用mysqlslap对数据库进行压力测试。
另一个解决方案,有点愚蠢,您可以使用spring-aop并在DAO方法执行之前和之后使用随机小睡眠附加延迟方面。通过这种方式,您可以控制它,不必修改现有代码,让spring完成延迟工作,而无需集成到实际系统中。毕竟不是那么愚蠢。这个很灵活,我想我会配合它。最容易设置。
如果它很愚蠢,但它有效,那就不傻了。
答案 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在评论中提供。