19

データを nosql データ ストア (この場合は cassandra) に永続化するコードの単体テストを作成する最善の方法は何ですか?

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

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

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


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

4

6 に答える 6

10

組み込みの cassandra サーバーを使用しています。cassandra をテストする場合は、それが最善のアプローチだと思います。cassandra API をモックするのはエラーが発生しやすいためです。

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

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

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

于 2011-07-09T14:31:00.353 に答える
7

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

于 2011-10-13T18:39:08.560 に答える
3

Mojo Cassandra maven pluginを使用しています。

以下は、単体テストで使用する 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 の組み込みサーバー ヘルパー クラスを動作させることができましたが、このバグが原因でクラスローダーの競合が発生しました。

于 2012-12-01T16:10:20.573 に答える
2

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

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;
于 2011-11-30T15:26:26.350 に答える
0

「データをクリーンアップしていないようです」とは、正確にはどういう意味ですか? データベースにまだデータが表示されていますか?

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

于 2011-07-08T12:55:33.480 に答える