[gogf/gf]单元测试中如何mock数据库操作

2024-07-09 566 views
7
场景

service单元测试,需要mock其中的数据库操作。

现有方案
  1. 在dao层增加interface,并对orm方法进行封装,最终暴露出这个interface给service层调用。这部分代码可以由gf-cli来生成。
  2. 单元测试中,对dao层接口进行mock即可。
更好的方案

想了解下各位一般都用什么方式mock数据库操作?

另外能否在框架支持,比如gdb.Model作为interface来使用,这样通过mock Model,即可替换到dao层实例进行单测 @gqcn

回答

8

试过对gdb.DB接口进行mock,但由于tx没有interface,所以事务操作,就没法mock了

个人觉得对gdb.DB进行mock其实更好,可以更细的粒度去做单测,甚至可以去判断经过service逻辑后执行的sql是否正确

8

@qinyuguang mock很有用,不过要根据具体项目衡量成本和可落地性,我是使用独立的真实数据库单测,虽然增加了外部数据库依赖,但是代码设计上更简单一些。有利有弊,各自权衡。

6

我们service单元测试时使用go-sqlmock来mock数据库操作,但是实践下来存在以下问题:

  1. 测试service时会有调用层级过深的问题。只想测试service的接口,却需要mock到sql语句,中间层级过多,很多不是想测试的东西。
  2. 测试用例编写复杂。service可能很简单,但是如果有相对较多的数据库操作,mock这些操作都是不小的工作量。数据库操作由goframe的gdb模块提供的,通过model生成的最终sql语句其实并不确定,特别field字段顺序不是稳定的,要mock特别具体的数据库操作不好处理。还有就是gdb会有类似"SHOW FULL COLUMNS FROM tbl_user"的sql查询,如果不了解的话容易踩坑,这些在准备测试环境时都需要考虑到。

目前打算改造一下,倾向于封装dao层,对外提供接口,这样测试service时只需要mock dao层接口即可,只关注本层业务,不用考虑更底层的细节,底层框架的功能稳定性交给框架开发者维护。 前面在社区文档上看到有关于Dao及Service层接口设计方案的讨论,倒是比较期待。

4

请问有没有使用独立数据库单测的项目例子参考下,考虑每次单测使用docker启动一个干净的环境