Java 使用嵌入式Cassandra加速Spring MockMvc集成测试
我们正在使用MockMvc框架使用JUnit测试Spring控制器。控制器返回一个Java 使用嵌入式Cassandra加速Spring MockMvc集成测试,java,junit,cassandra,spring-test,Java,Junit,Cassandra,Spring Test,我们正在使用MockMvc框架使用JUnit测试Spring控制器。控制器返回一个差异结果 mockmvc.perform看起来像下面这样 mockMvc.perform(post("/customer") .accept(APPLICATION_JSON) .header(AUTH_TOKEN_KEY, "xyz") .header(FROM_KEY, "email@gmail.com")
差异结果
mockmvc.perform
看起来像下面这样
mockMvc.perform(post("/customer")
.accept(APPLICATION_JSON)
.header(AUTH_TOKEN_KEY, "xyz")
.header(FROM_KEY, "email@gmail.com")
.content(json)
.contentType(APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(request().asyncStarted());
这需要很多时间我们使用嵌入式卡桑德拉,因此需要花费大量时间。
我也试过了,但都一样
MvcResult mvcResult = mockMvc.perform(post("/customer")
.accept(APPLICATION_JSON)
.header(AUTH_TOKEN_KEY, "xyz")
.header(FROM_KEY, "email@gmail.com")
.content(json)
.contentType(APPLICATION_JSON))
.andReturn();
mockMvc.perform(asyncDispatch(mvcResult))
.andExpect(status().isOk())
.andExpect(request().asyncStarted());
我有数百个测试,因为它们的构建过程非常缓慢
有没有一种方法,我可以说,使用JUnit执行请求并在另一个线程中等待响应来断言结果,或者其他任何好的加速方法
谢谢您是否正在执行以下操作
@BeforeClass
public static void startCassandraEmbedded() {
EmbeddedCassandraServerHelper.startEmbeddedCassandra();
Cluster cluster = Cluster.builder()
.addContactPoints("127.0.0.1").withPort(9142).build();
Session session = cluster.connect();
}
... and ...
@AfterClass
public static void stopCassandraEmbedded() {
EmbeddedCassandraServerHelper.cleanEmbeddedCassandra();
}
有关更多信息,请参见本测试是否确实需要应用程序的Cassandra/持久层 如果anser为否,或者答案为否,则可以在运行测试时注入另一个persistence repitory。要实现这一点,您可以使用Spring内置的
概要文件
功能,并相应地注释您的测试,例如:
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfile("StubPersistence")
public class WebLayerIntegrationTests {
...
}
然后,您可以为您的测试创建一个Cassanda存储库的存根版本,允许使用静态数据:
@Profiles("StubPersistence")
@Repository
public class StubCassandaRepository {
...
}
这个类可以由一个简单的数据结构来支持,比如HashSet
或类似的用例depdends。这种方法的可能性很大程度上取决于您的软件架构,因此,如果您不能删除您的Cassandra部门,那么它可能不可能实现
我还想知道您是否真的需要数百个测试,这些测试需要完整的应用程序,包括web层。当然,通过支持单元测试而不是集成测试,您可以显著加快测试速度,这样您就不需要初始化Spring上下文。也取决于您的应用程序和软件体系结构
Spring Boot 1.4中还将有一些测试改进,允许您专门初始化应用程序的单个部分进行测试(如持久性或Web层):
因此,我最好的建议是:
如果你想测试你的控制器,只测试你的控制器而不测试你的持久层,把它去掉。如果要测试持久层,请从持久层的接口开始,不要将控制器用作测试接口。正如我在问题中提到的,我们使用嵌入式cassandra,因此需要花费大量时间 我试图在
cassandra.yaml
文件中查找内容,并更改了下面的行
commitlog_sync_batch_window_in_ms: 90
到
仅此而已,构建时间从30分钟缩短为2分钟
来自cassandra.yaml的评论:-
在执行同步之前,对于其他写入,它最多将等待commitlog\u sync\u batch\u window\u(毫秒)
毫秒
缩短了这段时间后,等待时间缩短了,构建时间也缩短了。是的,我们正在运行它
Spring集成测试
,我们不会在每次上课前启动和停止cassandra,因为我认为cassandra服务器启动和运行迁移会增加时间。好的,很好,你确定慢度在哪里了吗?是否可能是延迟的结果?它当前是否在另一个线程上处理?不,实际上我们完成了所有任务,然后得到结果,将其包装在DeferredResult
中,并从方法返回。我认为获得答案的最佳方法是创建完整的端到端代码片段,例如,托管在某个GitHub页面上,这样人们就可以在某个地方拉下来玩一玩并查看性能统计数据。由于这种(集成测试)的性质,我怀疑您在不提供一些代码的情况下是否能得到准确和有用的答案。
commitlog_sync_batch_window_in_ms: 90
commitlog_sync_batch_window_in_ms: 1