【问题标题】:Starting an embedded Cassandra instance for Unit tests为单元测试启动嵌入式 Cassandra 实例
【发布时间】:2017-05-19 01:00:51
【问题描述】:

我需要启动一个嵌入式 cassandra 实例,以通过单元测试对 Cassandra 键空间执行一些操作。编程语言是Java。启动嵌入式 cassandra 的选项有哪些?

我使用了 mojo maven 插件,但是在使用以下命令启动实例后,我没有看到 cassandra 实例在 localhost 的默认端口 9042 处启动。 插件:http://www.mojohaus.org/cassandra-maven-plugin/usage.html 启动命令:mvn cassandra:run -Dcassandra.nativeTransportPort=9042

在使用方面是否缺少某些东西,或者我需要使用不同的东西?

谢谢 乔提

【问题讨论】:

    标签: unit-testing testing cassandra


    【解决方案1】:

    这取决于您要测试的内容。 Cassandra Maven 插件(我是其中的原作者之一)和 Cassandra Unit 都做了一些非常相似的事情,因为它们启动了一个 Cassandra 的 JVM 实例。

    如果您只想在集成测试中进行一些 CRUD 操作,这非常有用,但如果您想测试一致性级别故障和面对各种故障情况时的重试等场景,尤其是对于多个数据中心而言,这真的无济于事。 Cassandra 在这一点上只是一头野兽,所以这意味着您需要 大量 内存来运行测试。

    要真正验证上述内容,我建议使用 Simulacron: https://github.com/datastax/simulacron/blob/master/doc/java_api/README.md

    还有一个集成示例: https://github.com/datastax/java-driver/blob/9f0d89799a8a1e4cd1022dd7c43333924c36a648/integration-tests/src/test/java/com/datastax/oss/driver/api/core/ProtocolVersionMixedClusterIT.java

    这是驱动程序团队用来测试行为场景的方法,尽管他们仍然依赖 CCM 测试桥(也是一个选项)来进行很多拦截和处理工作。对于这两者,它在该项目中嵌入 maven 的方式应该用作最佳实践的示例:

    https://github.com/datastax/java-driver/blob/3.x/pom.xml#L749-L816

    以及此类的配置文件切换: https://github.com/datastax/java-driver/blob/3.x/pom.xml#L925-L947

    并使用配置文件: https://github.com/datastax/java-driver/blob/3.x/driver-core/src/test/java/com/datastax/driver/core/PreparedStatementTest.java#L146

    要真正了解它,我建议拉下驱动程序项目并将其拆开,看看它们是如何组合在一起的。可能最大的胜利是整个项目对 Cassandra 代码没有任何依赖。

    【讨论】:

    • 我说的是“in-JVM”,但很确定两者都可以/确实 fork 一个 JVM(我已经很久没有看过了)。无论哪种方式,您都仅限于单个实例或非常小的集群,如果您只想排除一些故障案例,则不值得在基础设施上进行测试。 tl,dr:将 Simulacron 用于单节点或多节点。如果您只想做一些单实例粗加工,请选择其他之一。
    【解决方案2】:

    我们使用Cassandra unit 进行单元测试。这个库提供了有用的帮助,并允许从代码非常容易地启动 Embedded Cassandra

    EmbeddedCassandraServerHelper.startEmbeddedCassandra();
    

    【讨论】:

    • 您能否通过在 localhost/9042 上连接到此实例来验证这一点?通过 CQL?
    • 是的,我们通过 DataStax Java Driver Session 实例连接并执行 CQL 查询。
    【解决方案3】:

    你也可以看看https://github.com/nosan/embedded-cassandra/wiki

    例如如果您想使用JUnit4 启动Cassandra,您可以在一行中执行此操作:

    public class CassandraRuleTests {
    
        @ClassRule
        public static final CassandraRule cassandra = new CassandraRule(CqlScript.classpath("init.cql"));
    
        @Test
        public void testMe() {
    
        }
    
    }
    
    

    Cassandra 将是 forked 作为一个单独的进程。如果您使用java 9 或更高版本,您还可以通过javaHome 属性设置JAVA_HOME 8 的路径。

    【讨论】:

      【解决方案4】:

      您需要向 cassandra-maven-plugin 提供以下配置以启动本机传输端口 (9042)

      <startNativeTransport>true</startNativeTransport>

      所以你的插件看起来像

                  <plugin>
                      <groupId>org.codehaus.mojo</groupId>
                      <artifactId>cassandra-maven-plugin</artifactId>
                      <version>3.6</version>
                      <configuration>
                          <startNativeTransport>true</startNativeTransport>
                      </configuration>
                  </plugin>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-15
        • 2011-02-18
        • 1970-01-01
        • 2013-12-22
        • 1970-01-01
        • 2018-08-06
        相关资源
        最近更新 更多