是在当前package下,最先运行的一个函数,常用于初始化 func TestMain(m *testing.M) { //把匹配器设置成相等匹配器,不设置默认使用正则匹配 db, mock, err..., err) } 因为 sqlmock 使用的是 QueryMatcherEqual 匹配器,所以,预期会执行的 SQL 语句必须精确匹配要执行的SQL(包括符号和空格)。...WillReturnRows( // 这里要跟结果集包含的列匹配,因为查询是 SELECT * 所以表的字段都要列出来 sqlmock.NewRows([]string{"id", "username...WillReturnResult(sqlmock.NewResult(1, 1)) mock.ExpectCommit() 这个方法是sqlmock提供的用来断言匹配任意字段值的一个特殊的类型。...还有一点重要的原因是,在公司里做项目,使用的数据库账号一般不授予 DELETE 权限,为什么不让做 DELETE 操作?领导故意难为你出一堆规范?
是在当前package下,最先运行的一个函数,常用于初始化 func TestMain(m *testing.M) { //把匹配器设置成相等匹配器,不设置默认使用正则匹配 db, mock, err...让sqlmock 使用 QueryMatcherEqual 匹配器,该匹配器把mock.ExpectQuery 和 mock.ExpectExec 的参数作为预期要执行的SQL语句跟实际要执行的SQL进行相等比较..., err) } 因为 sqlmock 使用的是 QueryMatcherEqual 匹配器,所以,预期会执行的 SQL 语句必须精确匹配要执行的SQL(包括符号和空格)。...Get 操作的Mock测试 GORM 的查询操作的Mock测试跟Create类似。...WillReturnRows( // 这里要跟结果集包含的列匹配,因为查询是 SELECT * 所以表的字段都要列出来 sqlmock.NewRows([]string{"id", "username
err error // gorm sqlDB, sqlMock, err = sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherRegexp...ListUsers(gormDB) assert.Equal(t, 1, len(users)) }) } } 单测总体也比较简单,主要看TestListUsers方法,在这个方法里 定义了一个查询...SQL的返回结果 定义了一个重复2次的循环 在每个循环里,创建sql.DB, sqlmocck, gorm.DB 对查询进行mock 执行ListUsers方法 检查返回结果==1 由于我们的ListUsers...就是一个简单的Selct,所以ExpectQuery一定匹配上 预期在2个循环周期内,ListUsers都返回第一步定位的rows,断言成功 但是实际上,第一次断言成功,第二次失败 /usr/local...pos的位置,返回rows里的row 结论 sqlmock.Rows对象不要复用,每次都需要重现创建一个
,此处梳理了了基本的单元测试用到的方式和第三方库的使用方式,用到的时候,可以来这里查询 mock 第三方库的地址和基本用法,欢迎收藏 基本的单元测试 Golang 单元测试文件名 xxx_test.go...可以直接看到执行结果是通过,还是失败 go test -v 可以查看到每一个单测函数的执行情况 go test -run=xx run=[支持正则的字符串] , go test 会去匹配 run 后面的字符串.../stretchr/testify/assert - Go Packages ,这里有更详细的用法,本文是为了帮助查询和索引 httptest 网络测试工具 httptest 这个工具,见名知意,是一个测试网络接口的工具...,使用它,我们就可以在不启动具体 web 服务的情况下去测试 web 接口 httptest 是标准库 net 包中的模块,代码中这样导入: import "net/http/httptest" 基本的使用方式和案例可以查看...mock mysql 工具 看到工具名称,我们就可以知道,这个是来 mock 数据库的,当我们没有环境或者数据库没有办法正常使用的时候,我们就可以使用 go-sqlmock 工具,用起来非常方便 go
场景当前golang开发人员,在编写完成代码后,通常会写对应的单测来保证代码的健壮。对于很多大厂来说,编写单测已经是代码规范的一部分。...go-sqlmock 本质是一个实现了 sql/driver 接口的 mock 库,它的设计目标是支持在测试中,模拟任何 sql driver 的行为,而不需要一个真正的数据库连接。...层代码,这里是按照gorm的使用规范,定义了Tag表的结构信息。..., 1)) mock.ExpectCommit()}其中sqlmock.AnyArg() 跳过对参数的匹配校验,但是.WithArgs()方法要求,对参数的数量需要一致。...目前网上搜索到的示例大多数都是旧版本的实现方式,本文中的示例,是基于gorm.io/gorm v1.25.5版本实现的。
Error return } 2.引入sqlmock到测试代码 sqlmock是检查数据库最常用的工具,我们先不管它使用起来的复杂性,先来看看怎么实现对应的测试代码: // 注意,我们使用的是gorm...2.0,网上很多例子其实是针对1.0的 var ( DB *gorm.DB mock sqlmock.Sqlmock ) // TestMain是在当前package下,最先运行的一个函数,...= nil { panic(err) } // m.Run 是真正调用下面各个Test函数的入口 os.Exit(m.Run()) } /* sqlmock 对语法限制比较大,下面的sql...查询和更新采用了一个新的结构体OrderFields,是用里面的fields声明了order中哪个字段生效 GORM框架的进一步扩展 通过这一次对GORM数据库相关代码的迭代,还是可以发现有些不足:...对复杂SQL的支持不足:如group by、子查询等语句 对field这块限制不好,id, name, price,容易发生误填字段的问题 没有串联日志模块 接下来的模块,我会逐渐对2、3两点进行补充,
目录 一、 sqlmock介绍 二、安装 三、基本用法 四、一个小案例 五、Gorm 初始化注意点 一、 sqlmock介绍 sqlmock 是一个用于测试数据库交互的 Go 模拟库。...它可以模拟 SQL 查询、插入、更新等操作,并且可以验证 SQL 语句的执行情况,非常适合用于单元测试中。...// db 可以传递给被测试的函数进行测试 } 设置模拟 SQL 查询和预期结果: // 模拟 SQL 查询并设置预期结果 rows := sqlmock.NewRows([]string{"...// 因为你这里是 sqlmock,不是 gomock mock func(t *testing.T) *sql.DB ctx context.Context user User...() res := sqlmock.NewResult(3, 1) // 这边预期的是正则表达式 // 这个写法的意思就是,只要是 INSERT 到 users 的语句
单元测试是用来测试包或者程序的一部分代码或者一组代码的函数。测试的目的是确认目标 代码在给定的场景下,有没有按照期望工作。 ...测试的目的自然是确认代码是否正常工作,例如测试代码是否可以成功地向数据库中 插入一条记录,这种测试叫作“正向路径”测试,就是在正常执行的情况下,保证代码不产生错误的测试 另外一种情况是测试代码是否会产生预期的错误...,例如程序对数据库进行查询时没有找到任何结果,或者对数据库做了无效的更新,那么应该返回一个可以控制的错误,而不是导致程序崩渍,这种测试即为“负向路径”的测试场景,保证代码不仅会产生错误,而 且是预期的错误...mysql:go-sqlmock sqlmock 是一个实现 sql/driver 的mock库。它不需要建立真正的数据库连接就可以在测试中模拟任何 sql 驱动程序的行为。...安装 go get github.com/DATA-DOG/go-sqlmock 使用示例: 这里使用的是go-sqlmock官方文档中提供的基础示例代码。
go-sqlmock sqlmock 是一个实现 sql/driver 的mock库。它不需要建立真正的数据库连接就可以在测试中模拟任何 sql 驱动程序的行为。...安装 go get github.com/DATA-DOG/go-sqlmock 使用示例 这里使用的是go-sqlmock官方文档中提供的基础示例代码。...= nil { t.Errorf("error was not expected while updating stats: %s", err) } // 确保期望的结果都满足 if err...它是一个简单易用的、基于内存的redis替代品,它具有真正的TCP接口,你可以把它当成是redis版本的net/http/httptest。...总结 在日常工作开发中为代码编写单元测试时如何处理数据库的依赖是最常见的问题,本文介绍了如何使用go-sqlmock和miniredis工具mock相关依赖。
Table Driven 表驱动测试方法,就是把测试的输入和和期望的输出都写在一起组成一个 struct 数组,数组中的每条记录都是一个含有输入和期望值的完整测试用例,这种方式可以使我们的测试更加清晰和简练...go-sqlmock 这个 mock 库 针对数据库的操作,推荐我们使用 sqlmock 这个库来进行 mock。...go-sqlmock 本质是一个实现了 sql/driver 接口的 mock 库,它的设计目标是支持在测试中,模拟任何 sql driver 的行为,而不需要一个真正的数据库连接。...,尤其是写操作;再者,直连数据库会导致单测耗时较长; 使用起来也比较简单,示例如下,详细的可以参考 https://github.com/DATA-DOG/go-sqlmock 里面的详细使用: import...但是,这个方式其实是不推荐的,因为,我们针对单测,还有一个非常重要的关键点,那就是单测的执行要尽可能的快,因此不要在单测里面 sleep。 那么针对 go 出去的逻辑,要怎么单测呢?
在上一篇《Go单测系列3—数据库测试》中,我们介绍了如何使用go-sqlmock和miniredis工具进行数据库测试。 除了网络和数据库等外部依赖之外,我们在开发中也会经常用到各种各样的接口类型。...CI流水线中安装,则需要安装与你的CI环境匹配的合适版本。...-destination:生成的源代码写入的文件。如果不设置此项,代码将打印到标准输出。 -package:用于生成的模拟类源代码的包名。如果不设置此项包名默认在原包名前添加mock_前缀。...假设有查询MySQL数据库的业务代码如下,其中DB是一个自定义的接口类型: // db.go // DB 数据接口 type DB interface { Get(key string)(int,...error) Add(key string, value int) error } // GetFromDB 根据key从DB查询数据的函数 func GetFromDB(db DB, key string
外圆是战术实现机制,内圆的是战略核心策略。 对于我们的项目来说,代码依赖应该由外向内,单向单层依赖,这种依赖包含代码名称,或类的函数,变量或任何其他命名软件实体。...需要注意的是,这里不包含任何的业务逻辑代码,很多同学喜欢将业务逻辑也放到这里。...如果使用 ORM,那么这里放入的ORM操作相关的代码;如果使用微服务,那么这里放的是其他服务请求的代码; service 这里是业务逻辑层,所有的业务过程处理代码都应该放在这里。...例如我们想要将所有文章查询出来,那么可以在 repo 提供这样的接口: package repo import ( "context" "my-clean-rchitecture/models"...,比如说当我们想要 mysql 来作为存储查询,那么只需要提供一个这样的基类: type mysqlArticleRepository struct { DB *gorm.DB } // NewMysqlArticleRepository
:简化持久层开发; 【掌握】使用MyBatis框架时需要添加的依赖; 【认识】使用MyBatis框架时必要的配置; 【掌握】抽象方法的设计原则: 返回值:如果是增、删、改类型的操作...,使用Integer作为返回值类型;如果是查询类型的操作,可以使用期望的类型作为返回值类型,只要能把查询结果封装进去就行; 方法名称:自定义,但是不允许重载; 参数列表:根据需要执行的SQL语句中的参数来设计抽象方法的参数列表...【理解】#{}和${}格式的占位符的区别; 【掌握】解决查询时,查询结果中的列名与封装结果的类的属性名不一致的问题: 在SQL语句中指定列的别名,使得查询结果中的列名能与类的属性名匹配; 配置...的配置与使用; 【理解】在处理查询时,什么时候需要自定义别名: 在设计SQL语句中,不使用星号(*)表示字段列表,且存在名称不匹配的问题时,例如实现1对1的关联查询时; 在关联查询时,查询结果中出现了名称完全相同的列名时...【理解】在处理查询时,什么时候需要配置: 在SQL语句中使用了星号(*)表示字段列表,且存在名称不匹配的问题时,配置便于应用到多个不同的查询中; 需要实现
问题越早发现,解决的难度和成本就越低。 保证重构正确性。随着功能的增加,重构(修改老代码)几乎是无法避免的。很多时候我们不敢重构的原因,就是担心其它模块因为依赖它而不工作。...mock 生态系统的顶层控制,它定义了 mock 对象的作用域和生命周期,以及它们的期望。...多个协程同时调用控制器的方法是安全的。当用例结束后,控制器会检查所有剩余期望的调用是否满足条件。...Monkey 提供给用户用于函数打桩的 API: 第一个参数是目标函数的函数名 第二个参数是桩函数的函数名,习惯用法是匿名函数或闭包 返回值是一个 PatchGuard 对象指针,主要用于在测试结束时删除当前的补丁...开发过程中遇到的场景肯定不局限于本文所讨论的范围,有关更丰富的最佳实践案例可以参照: go-sqlmock go-mock 六、结语 1.
如果最后不指定接口名的话,会生成所有接口或者可以指定要生成的接口,多个用逗号连接。 ...我这里总结了两种办法: 首先是sqlmock:https://github.com/DATA-DOG/go-sqlmock。...() convey.So(err, convey.ShouldBeNil) dbMock.ExpectBegin() // sql支持正则匹配 dbMock.ExpectQuery("select...问题不会很大,我目前遇到的和 mysql 不兼容的就是create table a like b这种 sql。...你一定听过这些不太标准的技术圈发音... 系统如何设计才能更快地查询到数据? 前以色列国防军安全技术成员教你做好 Serverless 追踪 替代Docker,登上顶刊,这款开源沙箱牛在哪里? ?
在 MySQL 数据库中,UTF-8 及其变体是最常用的字符集。...默认情况下,utf8_general_ci 和 utf8mb4_general_ci 在搜索时是不区分大小写的。...MySQL 大小写搜索问题当 MySQL 表的字符集设置为 utf8_general_ci 或 utf8mb4_general_ci 时,使用 LIKE 或 = 进行查询时,默认是不区分大小写的。...使用 BINARY 关键字SELECT * FROM users WHERE BINARY username = 'admin';这样 admin 只会匹配完全相同的字符串,而不会匹配 Admin、ADMIN..., ['%admin%']) ->select();这种方法可以避免默认的大小写不敏感查询,让 MySQL 进行更严格的匹配。
,每个元素是一条搜索到的文档信息 _index:索引库 _type:文档类型 _id:文档id _score:文档得分 _source:文档的源数据 3.1.2 匹配查询(match) 我们先加入一条数据...,而且与小米相关的都会查询到,多个词之间是or的关系。...3.1.4 词条匹配(term) term 查询被用于精确值 匹配,这些精确值可能是数字、时间、布尔或者那些未分词的字符串 GET /heima/_search { "query":{...无查询条件,直接过滤 如果一次查询只有过滤,没有查询条件,不希望进行评分,我们可以使用constant_score取代只有 filter 语句的 bool 查询。...在性能上是完全相同的,但对于提高查询简洁性和清晰度有很大帮助。
一是基于字符串匹配,加入一些启发式的方法将其匹配,时间复杂度为O(n) 二是基于机器学习的分词 问题:如何应用文本相似的度量–常见的是推荐算法 推荐算法分为两种:基于内容,协同过滤 基于内容的推荐容易理解...第一种是方案是查找待查询文本的64位simhash code的所有3位以内变化的组合,大约需要四万多次的查询,参考下图: 另一种方案是预生成库中所有样本simhash code的3位变化以内的组合,大约需要占据...假设我们要寻找海明距离3以内的数值,根据抽屉原理,只要我们将整个64位的二进制串划分为4块,无论如何,匹配的两个simhash code之间至少有一块区域是完全相同的,如下图所示: 由于我们无法事先得知完全相同的是哪一块区域...优化的方法就是”抽屉原理“,因为2个simhash相似的标准是的差异,所以如果我们把64比特的simhash切成4段,每一段16比特,那么不同的3比特最多散落在3段中,至少有1段是完全相同的。...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
简单总结一下,单元测试的缺失不仅会意味着较低的工程质量,而且意味着重构的难以进行,一个有单元测试的项目尚且不能够保证重构前后的逻辑完全相同,一个没有单元测试的项目很可能本身的项目质量就堪忧,更不用说如何在不丢失业务逻辑的情况下进行重构了...、Context 是在一个独立行为中的多个不同上下文,最后的 It 用于描述期望的行为,这些代码块最终都构成了类似『描述……,当……时,它应该……』的句式帮助我们快速地理解测试代码。...SQL 另一个项目中比较常见的依赖其实就是数据库,在遇到数据库的依赖时,我们一般都会使用 sqlmock 来模拟数据库的连接,当我们使用 sqlmock 时会写出如下所示的单元测试: func (s *...ExpectQuery 和 ExpectExec,前者主要用于模拟 SQL 的查询语句,后者用于模拟 SQL 的增删,从上面的实例中我们可以看到这个这两种方法的使用方式,建议各位先阅读相关的 文档 再尝试使用...HTTP HTTP 请求也是我们在项目中经常会遇到的依赖,httpmock 就是一个用于 Mock 所有 HTTP 依赖的包,它使用模式匹配的方式匹配 HTTP 请求的 URL,在匹配到特定的请求时就会返回预先设置好的响应
简单总结一下,单元测试的缺失不仅会意味着较低的工程质量,而且意味着重构的难以进行,一个有单元测试的项目尚且不能够保证重构前后的逻辑完全相同,一个没有单元测试的项目很可能本身的项目质量就堪忧,更不用说如何在不丢失业务逻辑的情况下进行重构了...、Context 是在一个独立行为中的多个不同上下文,最后的 It 用于描述期望的行为,这些代码块最终都构成了类似『描述.........SQL 另一个项目中比较常见的依赖其实就是数据库,在遇到数据库的依赖时,我们一般都会使用 sqlmock 来模拟数据库的连接,当我们使用 sqlmock 时会写出如下所示的单元测试: func (s *...ExpectQuery 和 ExpectExec,前者主要用于模拟 SQL 的查询语句,后者用于模拟 SQL 的增删,从上面的实例中我们可以看到这个这两种方法的使用方式,建议各位先阅读相关的 文档 再尝试使用...HTTP HTTP 请求也是我们在项目中经常会遇到的依赖,httpmock 就是一个用于 Mock 所有 HTTP 依赖的包,它使用模式匹配的方式匹配 HTTP 请求的 URL,在匹配到特定的请求时就会返回预先设置好的响应
领取专属 10元无门槛券
手把手带您无忧上云