Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用嵌入式Cassandra加速Spring MockMvc集成测试_Java_Junit_Cassandra_Spring Test - Fatal编程技术网

Java 使用嵌入式Cassandra加速Spring MockMvc集成测试

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框架使用JUnit测试Spring控制器。控制器返回一个
差异结果

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执行请求并在另一个线程中等待响应来断言结果,或者其他任何好的加速方法


谢谢

您是否正在执行以下操作

  • 作为“Spring集成测试”运行?e、 g

  • 是否使用@BeforeClass/@AfterClass`注释启动和停止嵌入式Casandra服务器?e、 g

    @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