首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Coding
V2EX  ›  问与答

Spring Boot 写测试对 MySQL, Redis 操作的一些测试,大家是怎么做的?

  •  
  •   salamanderMH · 22 天前 · 1103 次点击

    问题

    有些方法是要用到 MySQL 和 Redis 的,然后想断言一下,代码类似:

    @Autowired
    private RedisTemplate<String, String> redisTemplate;
    
    @Test
    public void TestSetString() {
        String key = "foo";
        String value = "value";
        redisTemplate.opsForValue().set(key, value);
        Assert.assertEquals(value, redisTemplate.opsForValue().get(key));
    }
    

    我想到的是用 Docker 起个测试服务,每次启动擦掉之前的数据。

    16 回复  |  直到 2019-11-22 10:33:13 +08:00
        1
    Guozi1989   22 天前
    Mock
        2
    Solace202   22 天前
    @salamanderMH 楼主能说下你头像是哪个电影的人吗?看着很熟悉但是总是想不起来。。。
        3
    ningmengmao   22 天前 via Android
    @Solace202 美国往事
        4
    salamanderMH   22 天前
    @Solace202 美国往事里的小时候的黛博拉。
        5
    gabon   22 天前 via Android
    @before @after 呢,或者 h3 内存数据库
        6
    hyrepo   22 天前 via iPhone
    redis 的话有个东西叫 mockredis(还是 redismock 来着),其它关系型数据库用 h2,放内存里的,测完就没了,不要用 docker,太重了,而且你怎么自动化?

    参考 https://hyrepo.com/tech/h2-unit-test/
        7
    iyaozhen   22 天前 via Android
    @hyrepo 涨姿势了,感谢
        8
    hdbzsgm   21 天前
    用 docker compose 起坏境跑测试 其实并不重 我们就这么用的
        9
    ArtIsPatrick   21 天前 via iPhone
    搞个开发环境的数据库啊
        10
    zjp   21 天前
    @hyrepo 用到数据库产品的某个特性时就跪了...
    当时的做法是测试用不同的库,测试前清空重建表。就是耗时有点长
        11
    optional   21 天前 via Android
    crud 测试 mock 太艰难了。docker init db 再销毁。
        12
    daveze   21 天前 via iPhone
    @hyrepo 好像有语法不支持,例如 zset
        13
    ebingtel   21 天前
    我是测试前 脚本 dump mysql 数据库、执行测试用例、测完再删除数据库
        14
    passerbytiny   21 天前
    标准做法,适用一切数据库:@before(类级别或方法级别,需要 junit5 或特殊处理的 junit4)初始化数据,@after 清理数据。
    关系型数据库专有用法:@roolback=true,方法中值初始化数据,无需清理数据。

    以上是在用例范围上的做法,后面的方法是全局范围处理或工具,可以作为辅助:使用 H2 内存数据库,这样用完就扔; Spring Test 提供了一种方式,让你可以给一个 SQL 脚本在测试开始前集中执行;完全使用 Spring Data Jpa,这样你在初始化和清理数据的时候可以使用纯 Java 代码,并且无需考虑 H2 数据库与真实数据库的兼容性处理。
        15
    qyvlik   21 天前
    同意 @hdbzsgm #8,用 docker 或者 docker-compose,在跑 spring-boot 的测试用例之前,用 docker 初始化好 MySQL 或者 redis 就行了。
    @hyrepo #6 而且 docker 也不算重,在 Windows 和 Mac 下安装还算方便,在 Linux 下安装的步骤算不上繁琐。常用命令不超过 10 个,如果学会使用 docker-compose,常用命令就不超过 3 个了( pull, up, down ),配置好的 docker-compose.yml 也不用经常修改。
        16
    hyrepo   21 天前
    @hdbzsgm
    @qyvlik
    说重是相对 mock 的方案而言的,用 mockredis 或者 h2 只需要 gradle 里面引入几个依赖就可以跑起来,跑测试的步骤也和普通的测试一样,完全不需要对外部系统的配置,但是如果用了 docker 那么每个人跑测试之前都要 docker-compose up 一下,放到 CI 上之后也需要处理这个问题,没有 docker 的话还需要装个 docker。测试数据的准备可以参考 @passerbytiny 的回复,用 @before 来导入数据,我能想到唯一应该使用 docker 来起的场景就是 @zjp 说的,有一些数据库的特性没有 mock 框架支持的时候
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2456 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 27ms · UTC 12:33 · PVG 20:33 · LAX 04:33 · JFK 07:33
    ♥ Do have faith in what you're doing.