Интеграционное тестирование с Redis

Я начал использовать Redis в своем проекте с помощью библиотеки джедаев. Все работает нормально, но теперь у меня есть проблема, что мои функциональные тесты требуют Redis, который я хочу избежать в моей непрерывной интеграции. Как лучше всего это сделать?

5 ответов


вот несколько вариантов функционального / интеграционного тестирования:

  1. просто запустите экземпляр redis на сервере CI. Все тесты будут отвечать за правильную очистку после выполнения.
  2. попробуйте как-то контролировать процесс redis, т. е. иметь некоторый сценарий оболочки или задание на сервере CI, чтобы запустить/остановить его до/после запуска тестов. По крайней мере, часть нагрузки установки/очистки удаляется из тестов, так как для каждой независимой сборки у вас будет независимый redis установка.
  3. управление redis далее, используя некоторое решение в памяти, как тот, который вы упомянули для Кассандры (если он существует).

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

вот аналогичный вопрос о mongodb ответ имеет ссылку на проект, который работает для второго варианта(контролирует процесс mongodb) если вы следуете некоторым связанным ссылкам на странице проекта, есть также что-то под названием nosql-unit. Этот, я думаю, пытается охватить третий вариант. Я не использовал его, но похоже, что у него есть что-то для Рэдис тоже.


я реализовал простой Redis embedded runner для Java: https://github.com/kstyrc/embedded-redis

В настоящее время он использует redis 2.6.14 для*nix и https://github.com/MSOpenTech/redis для Windows. Однако вы можете использовать класс RedisServer для запуска собственного сценария запуска.

Я планирую расширить реализацию для поддержки RedisConf (bind, slaveof, port, dbfilename и т. д.). После этого я загружу jar в clojars для mvn deps.


вы можете запустить сервер Redis на произвольном порту через командную строку:redis-server --port 7777. Поэтому для целей интеграционного тестирования вы можете начать Redis на доступном (или случайном) порту, убедившись, что Jedis настроен на использование этого порта.

таким образом, у вас есть "свежий" экземпляр Redis, который, как вы знаете, не будет конфликтовать с любыми другими процессами, включая другие тестовые прогоны, происходящие одновременно. Это так близко, как я могу думать об аналоге запуска in-memory / embedded database для интеграционного тестирования.

для предварительной загрузки Redis с "консервированными данными" используйте --dbfilename <file> переключатель: redis-server --port 7777 --dbfilename test.rdb.


попробовать nosql-unit. Он поддерживает модульный тест redis с java.

Я попробовал EmbeddedRedis и обнаружил, что многие интерфейсы Jedis не поддерживаются. Следовательно, использование EmbbededRedis не является хорошей идеей, особенно когда вы используете некоторую продвинутую функцию redis, такую как"конвейер".

Я предлагаю использовать ManagedRedis для модульного теста:

  1. загрузите исходный код redis из редис.Ио в ваш тестовый ресурс
  2. построить redis-сервер в $(your-redis-dir)/src
  3. напишите модульный тест с ManagedRedis, вот пример. Обратите внимание, что" REDIS_HOME " -это каталог, где ваш код redis загружен, ManagedRedis найдет redis-сервер в ${REDIS_HOME}/src
  4. запустите модульный тест.

как @ksytrc упоминается в ответ Я в основном использовал его решения. Он работал в этот проект.Вам просто нужно добавить зависимость embedded-redis.

        <dependency>
            <groupId>com.github.kstyrc</groupId>
            <artifactId>embedded-redis</artifactId>
            <version>0.6</version>
            <scope>test</scope>
        </dependency>

затем в тестовом классе определите redisServer

RedisServer redisServer;

    @Before
    public void setUp() throws IOException {
        redisServer = new RedisServer();
        redisServer.start();
    }

и определить application.yml С ниже учетных данных.

spring:
  redis:
    host: localhost
    port: 6379