Интеграционное тестирование с Redis
Я начал использовать Redis в своем проекте с помощью библиотеки джедаев. Все работает нормально, но теперь у меня есть проблема, что мои функциональные тесты требуют Redis, который я хочу избежать в моей непрерывной интеграции. Как лучше всего это сделать?
5 ответов
вот несколько вариантов функционального / интеграционного тестирования:
- просто запустите экземпляр redis на сервере CI. Все тесты будут отвечать за правильную очистку после выполнения.
- попробуйте как-то контролировать процесс redis, т. е. иметь некоторый сценарий оболочки или задание на сервере CI, чтобы запустить/остановить его до/после запуска тестов. По крайней мере, часть нагрузки установки/очистки удаляется из тестов, так как для каждой независимой сборки у вас будет независимый redis установка.
- управление 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 для модульного теста:
- загрузите исходный код redis из редис.Ио в ваш тестовый ресурс
- построить redis-сервер в $(your-redis-dir)/src
- напишите модульный тест с ManagedRedis, вот пример. Обратите внимание, что" REDIS_HOME " -это каталог, где ваш код redis загружен, ManagedRedis найдет redis-сервер в ${REDIS_HOME}/src
- запустите модульный тест.
как @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