这是Go语言单元测试从零到溜系列教程的第2篇,介绍了如何使用go-sqlmock和miniredis工具进行MySQL和Redis的mock测试。 go-sqlmock sqlmock 是一个实现 sql/driver 的mock库。它不需要建立真正的数据库连接就可以在测试中模拟任何 sql 驱动程序的行为。 安装 go get github.com/DATA-DOG/go-sqlmock 使用示例 这里使用的是go-sqlmock官方文档中提供的基础示例代码。 在很多使用ORM工具的场景下,也可以使用go-sqlmock库mock数据库操作进行测试。 miniredis 除了经常用到MySQL外,Redis在日常开发中也会经常用到。 总结 在日常工作开发中为代码编写单元测试时如何处理数据库的依赖是最常见的问题,本文介绍了如何使用go-sqlmock和miniredis工具mock相关依赖。
h2non/gock.v1" 具体案例可以查看如下地址,这里就不写其他例子了: https://pkg.go.dev/gopkg.in/h2non/gock.v1#readme-examples go-sqlmock mock mysql 工具 看到工具名称,我们就可以知道,这个是来 mock 数据库的,当我们没有环境或者数据库没有办法正常使用的时候,我们就可以使用 go-sqlmock 工具,用起来非常方便 go get github.com/DATA-DOG/go-sqlmock 代码中 import "github.com/DATA-DOG/go-sqlmock" 案例地址:https://github.com /DATA-DOG/go-sqlmock miniredis mock redis 的工具 同理,这是一个 redis 的 mock 工具,我们可以查看地址,来进行查看案例: https://github.com
我们这里采用的是第三个流派,用 sqlmock 方式来做数据库Dao的单元测试,本节的内容大纲主要如下: 这里我们会用到DataDog家开发的go-sqlmock这个工具,先来安装一下它: github.com /DATA-DOG/go-sqlmock 安装过程如下: 单元测试入口TestMain的设置 我们计划在 UserDao 和 OrderDao 中找几个典型的方法来做单元测试的实战,这里我们先在新建test 在TestMain方法中初始化go-sqlmock ,这样整个dao下的测试用例就都能使用它了,TestMain是在当前package下最先运行的一个函数,无论你运行哪个测试用例TestMain都会先被 dao2.SetDBMasterConn(dbMasterConn) dao2.SetDBSlaveConn(dbSlaveConn) os.Exit(m.Run()) } 这里我们创建一个 go-sqlmock
二、安装 go get github.com/DATA-DOG/go-sqlmock 三、基本用法 使用 sqlmock 进行 MySQL 数据库集成测试的基本步骤如下: 创建模拟 DB 连接: import ( "database/sql" "testing" "github.com/DATA-DOG/go-sqlmock" ) func TestMyDBFunction(t * int64 } 接着我们用编写测试用例 package dao import ( "context" "database/sql" "errors" "github.com/DATA-DOG/go-sqlmock
4.go-sqlmock 还有一种比较常见的场景就是和数据库的交互场景,go-sqlmock是sql模拟(Mock)驱动器,主要用于测试数据库的交互,go-sqlmock提供了完整的事务的执行测试框架, = nil { t.Errorf("not implements: %s", err) } } 更多例子和详情,请查看官网:DATA-DOG/go-sqlmock 介绍了这么多框架
"github.com/smartystreets/goconvey/convey""github.com/DATA-DOG/go-sqlmock""github.com/jinzhu/gorm"bench
在 Go 单元测试这个系列的第二部分 数据库的Mock测试 中我们介绍了用 go-sqlmock 给数据库的 CRUD 操作做Mock 测试的方法,不过里面只是讲解了一下怎么对原生的database/sql 在很多使用ORM工具的场景下,也可以使用go-sqlmock库 Mock数据库操作进行测试,今天这篇内容我就以 GORM 为例,讲解怎么给项目中的 ORM 数据库操作做单元测试。 , userId).Updates(updated).Error return } 接下来我们就用 go-sqlmock 工具给这几个 DAO 函数做一下 Mock 测试。
go-sqlmock 本质是一个实现了 sql/driver 接口的 mock 库,它的设计目标是支持在测试中,模拟任何 sql driver 的行为,而不需要一个真正的数据库连接。 controllerimport ( "fmt" "testing" "gorm.io/driver/mysql" "gorm.io/gorm" "github.com/DATA-DOG/go-sqlmock controllerimport ( "fmt" "testing" "gorm.io/driver/mysql" "gorm.io/gorm" "github.com/DATA-DOG/go-sqlmock
二、使用sqlmock来mock数据库 官网链接:https://github.com/DATA-DOG/go-sqlmock 实际业务中query语句用的比较多,下面以query语句为例详细介绍sqlmock
stretchr/testify Sonyflake: https://github.com/sony/sonyflake Gocron: https://github.com/go-co-op/gocron Go-sqlmock : https://github.com/DATA-DOG/go-sqlmock Gomock: https://github.com/golang/mock 简洁的分层架构 Nunu采用了经典的分层架构
给出正向、反向的反馈,总结经验 • 刚开始不要求单测覆盖率一定达到多少,先把流程跑起来 • 后期大家都接受并且认可之后,根据团队情况,规定合适的单测覆盖度 其他常见的 mock 库 数据库相关操作采用 go-sqlmock go-sqlmock 本质是一个实现了 sql/driver 接口的 mock 库,它的设计目标是支持在测试中,模拟任何 sql driver 的行为,而不需要一个真正的数据库连接。 因为这个可能会对数据库造成一些压力甚至是脏数据,尤其是写操作;再者,直连数据库会导致单测耗时较长; 使用起来也比较简单,示例如下,详细的可以参考 https://github.com/DATA-DOG/go-sqlmock 里面的详细使用: import ( "fmt" "testing" "github.com/DATA-DOG/go-sqlmock" ) // a successful case
在很多使用ORM工具的场景下,也可以使用go-sqlmock库 Mock数据库操作进行测试,今天这篇内容我就以 GORM 为例,讲解怎么给项目中的 ORM 数据库操作做单元测试。 , userId).Updates(updated).Error return } 接下来我们就用 go-sqlmock 工具给这几个 DAO 函数做一下 Mock 测试。
ListUsers写一个单测package models import ( "database/sql" "strconv" "testing" "github.com/DATA-DOG/go-sqlmock
mysql:go-sqlmock sqlmock 是一个实现 sql/driver 的mock库。它不需要建立真正的数据库连接就可以在测试中模拟任何 sql 驱动程序的行为。 安装 go get github.com/DATA-DOG/go-sqlmock 使用示例: 这里使用的是go-sqlmock官方文档中提供的基础示例代码。 return err } ./02_testing/test07/test07_test.go package main import ( "fmt" "github.com/DATA-DOG/go-sqlmock 在很多使用ORM工具的场景下,也可以使用go-sqlmock库mock数据库操作进行测试。 redis:miniredis 除了经常用到MySQL外,Redis在日常开发中也会经常用到。
LanguageMode", }) fmt.Println(languageMode)}go.modmodule platformgo 1.18require ( github.com/DATA-DOG/go-sqlmock
; repo 层:对于这一层来说,由于我们使用了 mysql 数据库,那么我们需要 mock mysql,这样即使不用连mysql 也可以正常测试,我这里使用 github.com/DATA-DOG/go-sqlmock repo 层测试 在项目中,由于我们用了 gorm 来作为我们的 orm库,所以我们需要使用 github.com/DATA-DOG/go-sqlmock 结合 gorm 来进行 mock: func
编译时生成代码,运行时无额外开销✅灵活查询:支持链式查询构建器✅数据库多样:支持PostgreSQL、MySQL、SQLite等⚠️注意:已进入维护模式,但稳定可用,新项目可以使用gormDATA-DOG/go-sqlmock
在上一篇《Go单测系列3—数据库测试》中,我们介绍了如何使用go-sqlmock和miniredis工具进行数据库测试。 除了网络和数据库等外部依赖之外,我们在开发中也会经常用到各种各样的接口类型。
我们需要先启动MySQL数据库,才能对其进行测试(除非使用诸如go-sqlmock之类的替代方法)。尽管集成测试很有帮助,但它并不总是我们想要的。
其他 mock 工具 在验证数据库读写操作逻辑正确性的测试中,使用了 go-sqlmock 来 mock sql driver 的行为。