Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
438 views
in Technique[技术] by (71.8m points)

请问单元测试验证数据库时 , "推荐使用 docker 建立数据库 + 临时表方式吗?"

像是 java Mockito 会直接定义id=3,回传user id=3,name=mock 3的bean

Mockito.when(userDao.getUserById(3)).thenReturn(new User(3, "mock 3"));

只需要在之后 equal 验证是否id=3,name=mock 3 就好,因為是預設好的假資料,等于直接把结果写好,所以一定会验证OK

但跟我们公司做法不一样 , 我们会在本机安装 docker 建立 sql server 跟 mysql、pgsql

并类似开源专案 dapper使用"建立临时表"方式建立测试资料来做验证
image.png

另外 pull reqeust 时会在 CI 建立 docker + 建立数据库再做一次验证
image.png

公司前辈说法 : 这样比起纯 bean 更能验证各数据库的SQL是否正确


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

看你们要测的层到底是哪个.

如果是非数据层比如 Service,那直接 Mock 就好,因为这里不操心数据库,甚至都不用知道数据库的存在(你后面挂的存储是数据库还是 redis 还是个文本对这一层而言都无所谓).

如果是数据层比如 RepositoryDAO 等等, 上这一套方法是可以的,这里开始关心数据库的存在.

CI 集成时是全部测试都要跑一遍那按规范制度来就行;至于本机上,其实多数时候只是关心 SQL 结构、跑一些语句的问题,那么有几种办法:

  • 不关心方言,比如使用 HQL、JPQL 的情况下,可以用 H2 内存数据库跑测试;
  • 关心方言,测试环境配个数据库大家一起用,担心表冲突可以在本地配置相关的表名策略,比如 SpringPhysicalNamingStrategy 给每个人的表名后面加个后缀,配个 update 策略随应用结束自动删表就行. ( Spring Boot 测试环境的配置是可以独立的
  • 如果是其他技术栈,我就不太清楚,可能只能用你们现在已经成熟的这套东西,但是我个人觉得每个人都装 docker 环境还是比较浪费资源的.

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...