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

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

  •  
  •   salamanderMH · 2019-11-21 17:59:42 +08:00 · 2546 次点击
    这是一个创建于 1832 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题

    有些方法是要用到 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
    Guozi1989
        1
    Guozi1989  
       2019-11-21 18:00:28 +08:00
    Mock
    Solace202
        2
    Solace202  
       2019-11-21 18:53:21 +08:00
    @salamanderMH 楼主能说下你头像是哪个电影的人吗?看着很熟悉但是总是想不起来。。。
    ningmengmao
        3
    ningmengmao  
       2019-11-21 18:57:11 +08:00 via Android
    @Solace202 美国往事
    salamanderMH
        4
    salamanderMH  
    OP
       2019-11-21 19:38:23 +08:00
    @Solace202 美国往事里的小时候的黛博拉。
    gabon
        5
    gabon  
       2019-11-21 20:13:51 +08:00 via Android
    @before @after 呢,或者 h3 内存数据库
    hyrepo
        6
    hyrepo  
       2019-11-21 20:18:49 +08:00 via iPhone
    redis 的话有个东西叫 mockredis(还是 redismock 来着),其它关系型数据库用 h2,放内存里的,测完就没了,不要用 docker,太重了,而且你怎么自动化?

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

    以上是在用例范围上的做法,后面的方法是全局范围处理或工具,可以作为辅助:使用 H2 内存数据库,这样用完就扔; Spring Test 提供了一种方式,让你可以给一个 SQL 脚本在测试开始前集中执行;完全使用 Spring Data Jpa,这样你在初始化和清理数据的时候可以使用纯 Java 代码,并且无需考虑 H2 数据库与真实数据库的兼容性处理。
    qyvlik
        15
    qyvlik  
       2019-11-22 09:03:34 +08:00
    同意 @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 也不用经常修改。
    hyrepo
        16
    hyrepo  
       2019-11-22 10:33:13 +08:00
    @hdbzsgm
    @qyvlik
    说重是相对 mock 的方案而言的,用 mockredis 或者 h2 只需要 gradle 里面引入几个依赖就可以跑起来,跑测试的步骤也和普通的测试一样,完全不需要对外部系统的配置,但是如果用了 docker 那么每个人跑测试之前都要 docker-compose up 一下,放到 CI 上之后也需要处理这个问题,没有 docker 的话还需要装个 docker。测试数据的准备可以参考 @passerbytiny 的回复,用 @before 来导入数据,我能想到唯一应该使用 docker 来起的场景就是 @zjp 说的,有一些数据库的特性没有 mock 框架支持的时候
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4205 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 57ms · UTC 05:25 · PVG 13:25 · LAX 21:25 · JFK 00:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.