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 и написал ему, чтобы помочь мне проверить эти случаи.