JUnit тестирование Кассандры со встроенным сервером
каков наилучший подход к написанию модульных тестов для кода, который сохраняет данные в хранилище данных nosql, в нашем случае cassandra?
=> мы используем встроенный серверный подход, используя утилиту из Git hub (https://github.com/hector-client/hector/blob/master/test/src/main/java/me/prettyprint/hector/testutils/EmbeddedServerHelper.java) - ... Однако я вижу некоторые проблемы с этим. 1) оно упорствует данные через множественные тестовые случаи делая его трудным для нас убеждаться данные отличаются в тестовых случаях тестового класса. Я попытался вызвать cleanUp @после каждого тестового случая, но это не похоже на очистку данных. 2) у нас заканчивается память, поскольку мы добавляем больше тестов, и это может быть из-за 1, но я еще не уверен в этом. В настоящее время у меня есть размер кучи 1G для запуска моей сборки.
=> другой подход, о котором я думал, - это издеваться над хранилищем Кассандры. Но это может привести к утечке некоторых проблем в схеме cassandra, поскольку мы часто находили вышеуказанный подход проблемы с тем, как данные хранятся в cassandra.
пожалуйста, дайте мне знать, что вы думаете об этом, и если кто-то использовал EmbeddedServerHelper и знакомы с проблемами, которые я упомянул.
просто обновление. Я смог решить 2) Проблема с кучи java при запуске сборок, изменив параметр in_memory_compaction_limit_in_mb на 32 в cassandra.yaml используется тестовым встроенным сервером. Ссылка ниже помогла мне http://www.datastax.com/docs/0.7/configuration/storage_configuration#in-memory-compaction-limit-in-mb - ... Было 64 и начало терпеть неудачу последовательно во время уплотнения.
6 ответов
мы используем встроенный сервер cassandra, и я думаю, что это лучший подход при тестировании cassandra, издевательство над API cassandra слишком подвержено ошибкам.
EmbeddedServerHelper.cleanup () просто удаляет файлы из файловой системы, но данные могут все еще существовать в памяти.
в EmbeddedServerHelper есть метод teardown (), но я не уверен, насколько это эффективно, поскольку у cassandra есть много статических синглетов, состояние которых не очищается teardown ()
У нас есть метод, который вызывает усечь на каждом семействе столбцов между тестами. Это удалит все данные.
Я думаю, вы можете взглянуть на Кассандру-unit:https://github.com/jsevellec/cassandra-unit/wiki
Я использую Моджо Кассандра 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>
мне удалось получить встроенный вспомогательный класс сервера Гектора, который может быть очень полезен, однако я столкнулся с конфликтами classloader из-за эта ошибка.
вы не можете перезапустить экземпляр Cassandra в одной виртуальной машине-Cassandra имеет "выключение на политику убийства" из-за сингелтонов, которые они используют.
вам также не нужно перезапускать Casandra, просто удалите все семейства столбцов (CFs). Чтобы удалить CF, вам нужно сначала очистить данные, сжать их, а после этого, наконец, вы можете удалить их.
этот код подключится к встроенной Кассандре и выполнит требуемый 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]);
}
Теперь выполните CLI drop CF сценарий:
CliMain.main(new String[] { "-host", host, "-port", Integer.toString(rpcPort), "-f", "/my/script/path/script.txt","-username", "myUser", "-password", "123456" });
и скрипт.txt мог бы:
use ExampleTestSpace;
drop column family ExampleCF;
под "похоже, не очищает данные" что именно Вы имеете в виду? Что вы все еще видите свои данные в базе данных?
эта проблема может быть связана с Кассандрой, которая не удаляет "значения" мгновенно, но только после gc_grace_seconds
проходят секунды (обычно по умолчанию 10 дней). Кассандра помечает удаляемые значения.
в дополнение к тому, что было опубликовано, есть случаи, когда вы хотите проверить обработку ошибок - как ваше приложение ведет себя при сбое запроса Cassandra.
есть несколько библиотек, которые могут помочь вам с этим:
Я автор cassandra-spy и написал ему, чтобы помочь мне проверить эти случаи.