データを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であり、圧縮中に一貫して失敗し始めました。
組み込みのcassandraサーバーを使用します。これは、cassandraをテストする場合の最良のアプローチであり、cassandra APIはエラーが発生しやすいためです。
EmbeddedServerHelper.cleanup()
はファイルシステムからファイルを削除するだけですが、データはまだメモリに存在している可能性があります。
EmbeddedServerHelper
にはteardown()
メソッドがありますが、cassandraには、状態がない静的シングルトンがたくさんあるため、それがどれほど効果的かはわかりません。 teardown()
によってクリーンアップされました
テストの合間に各列ファミリーで truncate を呼び出すメソッドがあります。これにより、すべてのデータが削除されます。
私はあなたがcassandra-unitを見ることができると思います: https://github.com/jsevellec/cassandra-unit/wiki
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の組み込みサーバーヘルパークラスを機能させることができました。これは非常に便利ですが、 このバグ が原因でクラスローダーの競合が発生しました。
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;
「データをクリーンアップしていないようです」とは、正確にはどういう意味ですか?あなたはまだデータベースにあなたのデータを見ていますか?
この問題は、Cassandraが「値」を即座に削除しないが、gc_grace_seconds
秒が経過した後(通常はデフォルトで10日)にのみ発生することが原因である可能性があります。 Cassandraは、削除する値をマークします。