2013-04-15 127 views
12

我已经在Jedis库的帮助下,在我的项目中开始使用Redis。所有工作正常,但现在我有一个问题,即我的功能测试需要Redis在我的持续集成中想要避免的问题。做这个的最好方式是什么?使用Redis进行集成测试

+3

你可以将所有的jedis调用包装在DAO中以抽象redis?然后,当你运行你的单元测试时,注入一个DAO的测试实现,返回某种类型的fixture数据。 – Adam

+1

是抽象是我想要做的事情,对于单元测试我没有问题嘲笑与Redis的连接,但对于集成测试,我正在寻找解决方案。例如。 cassandra有一些我们使用的嵌入式cassandra。 –

+0

啊有趣 - 不确定Redis是否有类似的东西。 对于我的集成测试,我们使用特定于我们的CI环境的redis实例和特定的配置覆盖来指示测试应该针对该虚拟redis实例运行。 – Adam

回答

8

这里有你有几个选项的功能/集成测试:

  1. 你CI服务器上刚开始的Redis的一个实例。所有测试将在执行后负责进行适当的清理。
  2. 尝试以某种方式控制redis进程,即在CI服务器上运行一些shell脚本或作业,以在运行测试之前/之后启动/停止它。至少有一些安装/清理的负担会从测试中删除,因为对于每个独立的版本,您将拥有独立的redis设置。
  3. 通过使用一些内存中的解决方案来进一步控制redis,就像您提到的cassandra(如果存在)。

有一件事要提的是,集成测试不应该取代单元测试。单元测试可能应该是首选,他们可以覆盖更多的案例,而集成测试可以用来检查应用程序的所有部分在一起玩的很好。我认为这就是很多人选择第一选择的原因。

这里有一个类似的问题about mongodb答案有一个链接到该工程第二个选项(控制MongoDB的过程),如果按照项目页面上的一些相关的链接这里还有一些所谓nosql-unit项目。这一个我认为试图涵盖选项三。我没有使用它,但看起来它也有一些redis

1

您可以通过命令行在任意端口上启动Redis服务器:redis-server --port 7777。因此,为了进行集成测试,您可以在可用(或随机)端口上启动Redis,确保将Jedis配置为使用该端口。

通过这种方式,您已知道Redis的“新鲜”实例,您知道它不会与任何其他进程(包括同时发生的其他测试运行)发生冲突。这与我认为运行内存/嵌入式数据库进行集成测试的模拟结果非常接近。

要使用“canned data”预加载Redis,请使用--dbfilename <file>开关:redis-server --port 7777 --dbfilename test.rdb

16

我实现了嵌入式亚军为一个简单的Java Redis的: https://github.com/kstyrc/embedded-redis

目前,它使用的Redis 2.6.14在* nix和https://github.com/MSOpenTech/redis为Windows。但是,您可以使用RedisServer类来运行您自己的运行脚本。

我打算扩展实现以支持RedisConf(bind,slaveof,port,dbfilename等)。在此之后,我会将jar上传到mvn deps的clojars。

+0

当我在您的README.md中指出的pom.xml中添加依赖片段时,它说它无法找到依赖关系。我还添加了存储库代码片段。 您的代码在哪里被托管到现在为止? –

+0

我试图用你的嵌入式redis项目无济于事:这里是一篇关于我的悲哀的帖子:http://stackoverflow.com/questions/29059794 – balteo

+0

@NishantKelkar也许你应该刷新maven?神器出现在这里:https://clojars.org/repo/redis/embedded/embedded-redis/0.5/ – kstyrc

0

尝试nosql-unit。它支持使用java的redis单元测试。

我试过了EmbeddedRedis,发现不支持很多Jedis接口。因此使用EmbbededRedis并不是一个好主意,特别是当你使用一些高级的redis函数时,比如“pipeline”。

我建议使用单元测试ManagedRedis:

  1. 下载从redis.io一个Redis的源代码到您的测试资源
  2. 建立在$ a Redis的服务器(你-Redis的-DIR)/ src目录
  3. 用ManagedRedis编写单元测试,这里是example。请注意,“REDIS_HOME”是您的redis代码下载的目录,ManagedRedis将在$ {REDIS_HOME}/src中找到redis服务器运行您的单元测试。
+1

如果你推荐一个图书馆,那么习惯性地显示它可以应用。请在答案中添加一些示例代码。 –

0

由于@ksytrc在his answer中提到,我基本上使用他的解决方案。它在this project中工作。您只需添加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 
相关问题