首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >单元测试之差强人意的embedded-redis

单元测试之差强人意的embedded-redis

作者头像
Antony
发布2020-12-01 09:55:05
发布2020-12-01 09:55:05
4.4K0
举报

作为Key-Value型的内存数据库,redis已经是Spring开发的标配。在单元测试/集成测试时,如果有一个带有redis服务的独享环境,对于保障测试用例执行的可靠性来说还是有所帮助的,也免除了很多由于环境冲突所导致的问题。当然,嵌入式redis主要还是完成数据的读写等基础的功能,如果涉及到高可用/同步等redis的高级特性,还是建议采用同生产上使用的redis。

嵌入式redis

基本上最Popular的嵌入式redis是以下这个项目 https://github.com/kstyrc/embedded-redis

但这个项目也存在维护不力的问题。 1) 大量缺陷未修复。在笔者写下此文时,这个项目上未关闭的缺陷issues 有33个。并且CI 显示目前这个版本在windows上的构建是失败的。

  1. 缺少更新。这个项目的最近一次更新在2016年6月。

经过试用之后,笔者发现,以下这个案例能够顺利通过。

代码语言:javascript
复制
package redis.embedded;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import static org.junit.Assert.assertEquals;

public class RedisServerClusterTest {

    private RedisServer redisServer1;
    private RedisServer redisServer2;

    @Before
    public void setUp() throws Exception {
        redisServer1 = RedisServer.builder()
                .port()
                .build();

        redisServer2 = RedisServer.builder()
                .port()
                .slaveOf("localhost", )
                .build();

        redisServer1.start();
        redisServer2.start();
    }

    @Test
    public void testSimpleOperationsAfterRun() throws Exception {
        JedisPool pool = null;
        Jedis jedis = null;
        try {
            pool = new JedisPool("localhost", );
            jedis = pool.getResource();
            jedis.mset("abc", "1", "def", "2");

            assertEquals("1", jedis.mget("abc").get());
            assertEquals("2", jedis.mget("def").get());
            assertEquals(null, jedis.mget("xyz").get());
        } finally {
            if (jedis != null)
                pool.returnResource(jedis);
        }
    }


    @After
    public void tearDown() throws Exception {
        redisServer1.stop();
        redisServer2.stop();
    }
}

但是在用例执行完之后, 程序似乎留下了一些未关闭的进程,可能会导致资源泄露和可能的端口冲突。因此,可能需要去优化redisServer的stop方法,或者干脆通过在@After方法中手工去杀进程的方式将运行环境清理干净。

redis_firewall.JPG

redis_process_detail.JPG

redis_process_list.JPG

无论如何,这个redis实现也算是解决了从0到1的问题,能接受这些问题的话,就勉强用用吧 。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 软件测试那些事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档