web-dev-qa-db-ja.com

JUnitテストCassandra組み込みサーバーを使用

データをnosqlデータストア(この場合はcassandra)に永続化するコードの単体テストを作成するための最良のアプローチは何ですか?

=> gitハブのユーティリティを使用した組み込みサーバーアプローチを使用しています( https://github.com/hector-client/hector/blob/master/test/src/main/Java/me/prettyprint/hector /testutils/EmbeddedServerHelper.Java )。しかし、私はこれに関していくつかの問題を見てきました。 1)複数のテストケースにわたってデータを保持するため、テストクラスのテストケースでデータが異なることを確認するのが困難です。各テストケースの後にcleanUp @を呼び出してみましたが、データがクリーンアップされていないようです。 2)テストを追加するため、メモリが不足しています。これは1が原因である可能性がありますが、まだわかりません。現在、ビルドを実行するための1Gヒープサイズがあります。

=>私が考えていたもう1つのアプローチは、cassandraストレージをモックすることです。しかし、上記でよく見られるように、cassandraスキーマでいくつかの問題がリークする可能性があります。データがcassandraに格納される方法に関する問題をキャッチするアプローチ。

これについての考えと、EmbeddedServerHelperを使用したことがあり、私が言及した問題に精通している人がいる場合は、お知らせください。


ただの更新。 2)テスト組み込みサーバーで使用されるcassandra.yamlのin_memory_compaction_limit_in_mbパラメーターを32に変更することで、ビルドの実行時にJavaヒープスペースの問題が不足する)を解決できました。以下のリンクが役に立ちました。 http://www.datastax.com/docs/0.7/configuration/storage_configuration#in-memory-compaction-limit-in-mb 。64であり、圧縮中に一貫して失敗し始めました。

19
bobbypavan

組み込みのcassandraサーバーを使用します。これは、cassandraをテストする場合の最良のアプローチであり、cassandra APIはエラーが発生しやすいためです。

EmbeddedServerHelper.cleanup()はファイルシステムからファイルを削除するだけですが、データはまだメモリに存在している可能性があります。

EmbeddedServerHelperにはteardown()メソッドがありますが、cassandraには、状態がない静的シングルトンがたくさんあるため、それがどれほど効果的かはわかりません。 teardown()によってクリーンアップされました

テストの合間に各列ファミリーで truncate を呼び出すメソッドがあります。これにより、すべてのデータが削除されます。

9
sbridges

私はあなたがcassandra-unitを見ることができると思います: https://github.com/jsevellec/cassandra-unit/wiki

7
jeremy

Mojo Cassandra mavenプラグイン を使用します。

単体テストで使用するために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>

Hectorの組み込みサーバーヘルパークラスを機能させることができました。これは非常に便利ですが、 このバグ が原因でクラスローダーの競合が発生しました。

3
janstenpickle

1つのインスタンス内でCassandraインスタンスを再起動することはできませんVM-Cassandraは、シングルトンが原因で「シャットダウンポリシー」がありますを使用します。

また、Casandraを再起動する必要はなく、すべての列ファミリー(CF)を削除するだけです。 CFを削除するには、最初にデータをフラッシュして圧縮し、その後最後にドロップする必要があります。

このコードは、埋め込みCassandraに接続し、必要なクリープを実行します。

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]);
}

ここで、CLIドロップCFスクリプトを実行します。

CliMain.main(new String[] { "-Host", Host, "-port", Integer.toString(rpcPort), "-f", "/my/script/path/script.txt","-username", "myUser", "-password", "123456" });

およびscript.txtには次のものがあります。

use ExampleTestSpace;
drop column family ExampleCF;
2
Maciej Miklas

投稿された内容に加えて、エラー処理をテストしたい場合があります-Cassandraクエリが失敗した場合のアプリの動作。

これを支援できるライブラリがいくつかあります。

私はcassandra-spyの作者であり、これらのケースをテストするのに役立つように書いています。

0
Andrejs

「データをクリーンアップしていないようです」とは、正確にはどういう意味ですか?あなたはまだデータベースにあなたのデータを見ていますか?

この問題は、Cassandraが「値」を即座に削除しないが、gc_grace_seconds秒が経過した後(通常はデフォルトで10日)にのみ発生することが原因である可能性があります。 Cassandraは、削除する値をマークします。

0
Milo Casagrande