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

2019-11-21 17:59:42 +08:00
 salamanderMH

问题

有些方法是要用到 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 起个测试服务,每次启动擦掉之前的数据。

2576 次点击
所在节点    问与答
16 条回复
Guozi1989
2019-11-21 18:00:28 +08:00
Mock
Solace202
2019-11-21 18:53:21 +08:00
@salamanderMH 楼主能说下你头像是哪个电影的人吗?看着很熟悉但是总是想不起来。。。
ningmengmao
2019-11-21 18:57:11 +08:00
@Solace202 美国往事
salamanderMH
2019-11-21 19:38:23 +08:00
@Solace202 美国往事里的小时候的黛博拉。
gabon
2019-11-21 20:13:51 +08:00
@before @after 呢,或者 h3 内存数据库
hyrepo
2019-11-21 20:18:49 +08:00
redis 的话有个东西叫 mockredis(还是 redismock 来着),其它关系型数据库用 h2,放内存里的,测完就没了,不要用 docker,太重了,而且你怎么自动化?

参考 https://hyrepo.com/tech/h2-unit-test/
iyaozhen
2019-11-21 20:21:03 +08:00
@hyrepo 涨姿势了,感谢
hdbzsgm
2019-11-21 22:49:29 +08:00
用 docker compose 起坏境跑测试 其实并不重 我们就这么用的
ArtIsPatrick
2019-11-21 23:30:57 +08:00
搞个开发环境的数据库啊
zjp
2019-11-22 00:09:22 +08:00
@hyrepo 用到数据库产品的某个特性时就跪了...
当时的做法是测试用不同的库,测试前清空重建表。就是耗时有点长
optional
2019-11-22 02:37:18 +08:00
crud 测试 mock 太艰难了。docker init db 再销毁。
daveze
2019-11-22 08:02:13 +08:00
@hyrepo 好像有语法不支持,例如 zset
ebingtel
2019-11-22 08:38:40 +08:00
我是测试前 脚本 dump mysql 数据库、执行测试用例、测完再删除数据库
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
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
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 框架支持的时候

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/621854

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX