Go Generate 代替 Makefile使用方法详解
作者:小马别过河 发布时间:2024-04-27 15:28:18
介绍
图灵完备性(Turing completeness)是通用计算机的一个属性,它表示一个程序可以写另一个程序。比如 go test
命令:它会扫描被测试的包,写一个包含测试内容的程序,然后编译运行。
可能你听得比较多的是元编程(meta-program)。这里不细究他们的区别。我们重点是,用程序生成另一个程序的场景,越来越广泛了。比如:
protobufs: 根据 pb 文件(.proto)生成 go 代码文件(.pb.go)
yacc: 根据 yacc 文件(.y)生成 go 代码文件
bindata: 二进制文件(如 JPEG)转成 go 的 bytes 数组
mockery: 根据 go 的 interface 生成 Mock 对象(依赖
stretchr/testify/mock
包)。
自动生成代码的命令,该如何集成进项目里面?一般来说,我们可以借助外部的工具,如 Make
。使用 Go 1.4 新增的 go generate
命令,就可以避免外部工具了。
Mockery
我们以 mockery 为例,关于 mockery 生成的 Mock 对象,我之前的文章有介绍过:Go 库:单元测试利器 testify。
比如我们定义了 Greeter
接口,作为 Hello
的参数(代码本身无意义,仅做示例):
// greet.go 文件
package greet
type Greeter interface {
Greet() string
}
// 加上"hello"前缀
func Hello(g Greeter) string {
return "hello " + g.Greet()
}
我们要给 Hello
函数写单元测试的话,就需要为 Greeter
写一个 Mock 对象。我们可以使用 mockery 来生成。
安装 mockery:
go install github.com/vektra/mockery/v2@latest
为当前包下的所有 interface 生成 mock 对象,输出到 mocks 目录。
mockery --output mocks/ --dir . --all
我们查看目录文件:
➜ tree
.
├── greet.go
└── mocks // mockery 生成的 mock 对象
└── Greeter.go
1 directory, 2 files
关于 mockery 的说明,我们可以查看仓库:github.com/vektra/mock…。现在,我们可以为 Hello
写单元测试了:
// greet_test.go 文件
package greet
import (
"example/greet/mocks"
"testing"
"github.com/stretchr/testify/assert"
)
func TestHello(t *testing.T) {
// 实例化 mock 对象
greeter := new(mocks.Greeter)
// 设置预期,当请求 greeter.Greet() 时,返回 "world"
greeter.On("Greet").Return("world")
want := "hello world"
got := Hello(greeter)
// 断言相等
assert.Equal(t, want, got)
}
Go Generate
我们接下来的问题是,Mockery 命令需要集成到项目里,我们可以写 shell 脚本、或者 Make 文件,但这些都不是 go tool 的工具。
用法
go generate 非常方便使用,只要当前目录的 .go 文件(如 greet.go 文件),加上备注:
//go:generate mockery --output mocks/ --dir . --all
我们先把刚刚生成的 mocks 目录删除,当前目录结构是:
➜ tree
.
├── greet.go
└── greet_test.go
0 directories, 2 files
然后进入 greet 包,执行 go generate
:
➜ go generate
01 Dec 22 20:06 CST INF Starting mockery dry-run=false version=v2.10.0
01 Dec 22 20:06 CST INF Walking dry-run=false version=v2.10.0
01 Dec 22 20:06 CST INF Generating mock dry-run=false interface=Greeter qualified-name=example/greet version=v2.10.0
打印目录结构,会发现 mocks 对象又生成了:
➜ tree
.
├── greet.go
├── greet_test.go
└── mocks
└── Greeter.go
1 directory, 3 files
go.dev/blog/genera…
go.googlesource.com/proposal/+/…
来源:https://juejin.cn/post/7172159704674598925
猜你喜欢
- 最近在为公司做一个门户网站,项目并不咋D,可规划却不小.在做的过程中就发现修改占了很大的工作量.于是就开始想了想如何使前端修改轻松一些.这个
- 这篇文章不谈大道理,只谈细节。关于facebook的大道理,大家可以去海内网的帖子《谁去救救麦田老师吧》讨论。那里有很多IT评论高手,谈的很
- 本文主要介绍了一个获取SQL Server数据字典的经典SQL语句,大家可以根据各自的实际情况对这段语句进行相应的修改。SELECT sys
- Installing mysql (2.8.1) with native extensions /usr/local/lib/ruby/si
- 一、增强的可扩展性 Oracle9i Real Application Clusters是Oracle的下一代并行服务器系列产品。Oracl
- 基本操作图片的基本读取与保存。读取图片读取和文件读取类似,需要先获取流:注册图片的解码器(如:jpg则import _ "imag
- Python2.7: 使用Pyhook模块监听鼠标键盘事件-获取坐标。因该模块对Python3 有兼容性问题,故采用python2.7解释器
- 1.什么是并发编程并发编程是实现多任务协同处理,改善系统性能的方式。Python中实现并发编程主要依靠进程(Process):进程是计算机中
- 窗口标题pygame.display.set_caption(title, icontitle=None)'''•
- 最近有一个需求:将日志以json格式输出, 并且有些字段是logging模块没有的.看了很多源码和资料, 终于搞定, 抽取精华分享出来, 一
- 昨天在写“同IP站点查询”工具的时候,需要先用ASP获取查询域名的IP,本来是用WSHSHELL组件,代码如下:<%@LANGUAGE
- 二分类问题可能是应用最广泛的机器学习问题。今天我们将学习根据电影评论的文字内容将其划分为正面或负面。一、数据集来源我们使用的是IMDB数据集
- 一、效果展示在介绍代码之前,先来看下本文的实现效果。可以参考下面步骤把Python文件转化成exe,发给未安装Python的他/她。Pins
- 最近工作中需要写SQLserver的存储过程,第一次使用,简单记录下,以防遗忘。在SQLserver可视化工具中编写,我的工具如下图:首先点
- 基本概念 定义: 二进制日志包含了所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的所有语句。 作用: 1。二
- 若对于同一数据库实例中的两个数据库进行同步则直接对数据库表创建Trigger。SQL Server 2005的联机帮助:Trigger on
- 本文实例讲述了Python面向对象之继承原理与用法。分享给大家供大家参考,具体如下:目标单继承多继承面向对象三大特性封装 根据 职责 将 属
- 本文为大家分享了windows下pycharm安装、创建文件、配置默认模板的具体步骤,供大家参考,具体内容如下步骤: 下包 —->安装
- 有框计算器这个计算器我们用到了Python自带的Tkinter库# 导入tkinter库import tkinter我们要对窗口进行一些基本
- 1、简介APScheduler是一个 Python 定时任务框架,使用起来十分方便。提供了基于日期、固定时间间隔以及 crontab 类型的