JUnit Testing Cassandra со встроенным сервером - PullRequest
18 голосов
/ 07 июля 2011

Каков наилучший подход для написания модульных тестов для кода, который сохраняет данные в хранилище данных 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 ]

9 голосов
/ 09 июля 2011

Мы используем встроенный сервер Cassandra, и я думаю, что это лучший подход при тестировании Cassandra, так как насмешка над API Cassandra слишком подвержена ошибкам.

EmbeddedServerHelper.cleanup() просто удаляет файлы из файловой системы, но данныеможет все еще существовать в памяти.

В EmbeddedServerHelper есть метод teardown(), но я не уверен, насколько он эффективен, поскольку в Кассандре много статических синглетонов, состояние которых не очищается teardown()

У нас есть метод, который вызывает усечение для каждого семейства столбцов между тестами.Это удалит все данные.

7 голосов
/ 13 октября 2011

Я думаю, вы можете взглянуть на кассандру: https://github.com/jsevellec/cassandra-unit/wiki

3 голосов
/ 01 декабря 2012

Я использую плагин 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-сервера, который может быть очень полезным, однако я столкнулся с конфликтами загрузчиков классов из-за этой ошибки .

2 голосов
/ 30 ноября 2011

Вы не можете перезапустить экземпляр Cassandra в пределах одной виртуальной машины - у Cassandra есть «политика отключения при уничтожении» из-за используемых им отдельных кнопок.

Вам также не нужно перезапускать Casandra, просто удалите все семейства столбцов (КФ).Чтобы удалить 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;
0 голосов
/ 02 августа 2017

В дополнение к тому, что было опубликовано, бывают случаи, когда вы хотите протестировать обработку ошибок - как ваше приложение ведет себя при сбое запроса Cassandra.

Есть несколько библиотек, которые могут помочь вам в этом:

Я автор cassandra-spy и написал ему, чтобы помочь мне проверить эти случаи.

0 голосов
/ 08 июля 2011

Под «не очищает данные», что именно вы имеете в виду? Что вы до сих пор видите ваши данные в базе данных?

Эта проблема может быть связана с тем, что Cassandra не удаляет «значения» мгновенно, а только после прохождения gc_grace_seconds секунд (обычно по умолчанию это 10 дней). Кассандра отмечает значения, которые будут удалены.

...