Unit testing JUnit使用嵌入式服务器测试Cassandra

Unit testing JUnit使用嵌入式服务器测试Cassandra,unit-testing,testing,junit,cassandra,hector,Unit Testing,Testing,Junit,Cassandra,Hector,在我们的案例cassandra中,为将数据持久化到nosql数据存储的代码编写单元测试的最佳方法是什么 =>我们使用来自git hub()的实用程序使用嵌入式服务器方法。然而,我发现这方面存在一些问题。1) 它跨多个测试用例保存数据,这使得我们很难确保一个测试类的测试用例中的数据是不同的。我试着在每个测试用例之后调用cleanUp@,但这似乎不能清理数据。2) 我们正在运行的内存,因为我们添加了更多的测试,这可能是因为1,但我不确定这一点。我目前有1G的堆大小来运行我的构建 =>我一直在考虑的另

在我们的案例cassandra中,为将数据持久化到nosql数据存储的代码编写单元测试的最佳方法是什么

=>我们使用来自git hub()的实用程序使用嵌入式服务器方法。然而,我发现这方面存在一些问题。1) 它跨多个测试用例保存数据,这使得我们很难确保一个测试类的测试用例中的数据是不同的。我试着在每个测试用例之后调用cleanUp@,但这似乎不能清理数据。2) 我们正在运行的内存,因为我们添加了更多的测试,这可能是因为1,但我不确定这一点。我目前有1G的堆大小来运行我的构建

=>我一直在考虑的另一种方法是模拟cassandra存储。但这可能会泄露cassandra模式中的一些问题,因为我们经常发现上面的方法会发现数据存储到cassandra中的方式存在问题

请告诉我您对此的想法,以及是否有人使用过EmbeddedServerHelper并且熟悉我提到的问题


只是更新一下。通过将测试嵌入式服务器使用的cassandra.yaml中的in_memory_compression_limit_in_mb参数更改为32,我能够解决运行构建时java堆空间不足的问题。下面的链接帮助了我。它是64,并且在压缩过程中开始持续失败。

所说的“似乎没有清理数据”到底是什么意思?你还在数据库中看到你的数据吗


这个问题可能是由于Cassandra没有立即删除“值”,但只有在
gc\u grace\u秒
秒过去之后(通常默认为10天)。Cassandra标记要删除的值

我们使用嵌入式cassandra服务器,我认为这是测试cassandra的最佳方法,模拟cassandra API太容易出错

EmbeddedServerHelper.cleanup()
只是从文件系统中删除文件,但数据可能仍然存在于内存中

EmbeddedServerHelper
中有一个
teardown()
方法,但我不确定它有多有效,因为cassandra有很多静态单例,它们的状态没有被
teardown()清除


我们要做的是,我们有一个方法,在测试之间调用每个列族。这将删除所有数据。

我想您可以查看一下cassandra单元:

您不能在一个VM内重新启动cassandra实例-cassandra由于使用的是单子,所以具有“每杀死一次关机策略”

您也不需要重新启动Casandra,只需删除所有柱族(CFs)。为了删除CF,首先需要刷新数据,压缩数据,然后再删除数据

此代码将连接到嵌入式Cassandra并执行所需的cleaup:

private void cleanAndCompact() throws Exception {
    MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
    ObjectName ssn = new ObjectName("org.apache.cassandra.db:type=StorageService");
    StorageServiceMBean ssmb = JMX.newMBeanProxy(mbs, ssn, StorageServiceMBean.class);

    List<String> keyspaces = ssmb.getKeyspaces();
    if (keyspaces == null) {
        LOG.info("No keysaces to cleanup");
        return;
    }

    for (String keyspace : keyspaces) {
        if (keyspace.equalsIgnoreCase("system")) {
            continue;
        }
        execCleanup(ssmb, keyspace);
    }

}

private void execCleanup(StorageServiceMBean ssmb, String keyspace) throws Exception {
    LOG.info("Cleaning up keyspace: " + keyspace);

    ssmb.invalidateKeyCaches(keyspace, new String[0]);
    ssmb.invalidateRowCaches(keyspace, new String[0]);
    ssmb.forceTableFlush(keyspace, new String[0]);
    ssmb.forceTableCompaction(keyspace, new String[0]);
    ssmb.forceTableCleanup(keyspace, new String[0]);
}
和script.txt可能有:

use ExampleTestSpace;
drop column family ExampleCF;
我用这个

下面是一个示例插件配置,我使用它来启动Cassandra服务器,供我的单元测试使用:

 <build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>cassandra-maven-plugin</artifactId>
            <version>1.1.0-1</version>
            <executions>
                <execution>
                    <goals>
                        <goal>start</goal>
                        <goal>flush</goal>
                        <goal>cleanup</goal>
                    </goals>
                    <phase>compile</phase>
                </execution>
            </executions>
        </plugin>
     <plugins>
  <build>

org.codehaus.mojo

.

除了发布的内容之外,您还需要测试错误处理—当Cassandra查询失败时,您的应用程序将如何运行

有几个库可以帮助您做到这一点:


我是cassandra spy的作者,写信给它帮助我测试这些案例。

我错误地解释了清理,删除了在测试案例中创建的数据。但是清理只意味着做一些内务处理,并删除由嵌入式cassandra进程创建的所有提交日志和数据目录。如果没有清理,您将无法删除CF-drop请求将什么也不做,create请求将抛出CF已存在的异常,我们在这里的想法是一样的,即在每次测试后截断列族。谢谢。请在你的回答中透露你的从属关系。有关这方面的政策,请参阅。太好了-感谢您撰写和分享这篇文章。到目前为止,Cassandra单元运行良好。考虑到Cassandra单元是根据许可证获得许可的。@Marcin,仅供参考,我要求开发人员获得许可证(不同的项目文件之间存在一些不一致),他们确认它是LGPLv3。什么是.net的等价物?我很想听听您最近使用内存中功能进行测试的经验:
 <build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>cassandra-maven-plugin</artifactId>
            <version>1.1.0-1</version>
            <executions>
                <execution>
                    <goals>
                        <goal>start</goal>
                        <goal>flush</goal>
                        <goal>cleanup</goal>
                    </goals>
                    <phase>compile</phase>
                </execution>
            </executions>
        </plugin>
     <plugins>
  <build>