go mockweb接口_golang 单元测试(gotests、mockery自动生成)
golang 单元测试
文件格式:go单元测试,有固定的名称格式,所有以_test.go为后缀名的源文件在执行go build 时不会被构建成包的一部分,他们是go test 测试的一部分。
测试函数
函数格式:每个测试函数是以Test为函数名称前缀。
每个测试函数必须导入testing包。
func TestName(t *testing.T) {
// ...
}
基准测试(benchmark)
函数格式:函数前缀名称Benchmark。
作用:用于衡量函数的性能。会多次运行基准函数,计算一个平均的执行时间。
示例函数
函数前缀名称Example
作用:提供一个由编译器保证正确性的示例文档。
命令介绍
参数-v可用于打印每个测试函数的名字和运行时间:
go test -v
2.-run 测试制定的函数名称
go test -v -run="函数名称"
3.-cover 查看测试覆盖率
go test -v -run="" -cover
go test -cover /model/test/list
4.最后统统执行一遍全部测试用例
go test
5.示例
go test -run '' # Run all tests.
go test -run Foo # Run top-level tests matching "Foo", such as "TestFooBar".
go test -run Foo/A= # For top-level tests matching "Foo", run subtests matching "A=".
go test -run /A=1 # For all top-level tests, run subtests matching "A=1".
表格驱动测试(自动生成)
安装gotests
执行下面命令
go get -u github.com/cweill/gotests
2.将下载的gotests目录,配置到PATH环境变量中
export PATH=$PATH:$GOBIN:$GOPATH:$MYSQLBIN
gotests使用
-all
generate tests for all functions and methods
为所有函数和方法生成go测试
-excl string
为没有匹配的函数和方法生成go测试
regexp. generate tests for functions and methods that don't match. Takes precedence over -only, -exported, and -all
-exported
为导出的函数和方法生成go测试。
generate tests for exported functions and methods. Takes precedence over -only and -all
-i
在错误消息中打印测试输入
print test inputs in error messages
-nosubtests
禁用子测试生成。仅适用于Go 1.7+
disable generating tests using the Go 1.7 subtests feature
-only string
正则表达式。生成仅匹配的函数和方法的测试。优先于-all
regexp. generate tests for functions and methods that match only. Takes precedence over -all
-template_dir string
可选的。包含自定义测试代码模板的目录的路径
optional. Path to a directory containing custom test code templates
-w
将输出写入(测试)文件而不是stdout
write output to (test) files instead of stdout
常用操作
1.进入对应的要被生成单元测试的目录
2.在该目录下执行命令
3.生成指定函数的单元测试,输出到命令行,然后复制粘贴到目标处。
gotests -only "函数名称" 文件名称.go
4.生成全部测试函数
gotests -all 文件名称.go
gotests -only " 方法名称" 文件名称
gotests -all -w origin.go, origin_test.go
会自动创建在当前目录下,并自动生成测试代码,只需要将不同的测试数据按照tests定义的结构写在//TODO:Add test cases下面,测试用例就完成了。
mock测试
参考文章
mock是单元测试中常用的一种测试手法,mock对象被定义,并能够替换掉真实的对象被测试的函数所调用。
而mock对象可以被开发人员很灵活的指定传入参数,调用次数,返回值和执行动作,来满足测试的各种情景假设。
使用场景
依赖的服务返回不确定的结果,如获取当前时间。
依赖的服务返回状态中有的难以重建或复现,比如模拟网络错误。
依赖的服务搭建环境代价高,速度慢,需要一定的成本,比如数据库,web服务
依赖的服务行为多变。
为了保证测试的轻量以及开发人员对测试数据的掌控,采用mock来斩断被测试代码中的依赖不失为一种好方法。
每种编程语言根据语言特点其所采用的mock实现有所不同。
mockery
安装
go get github.com/vektra/mockery/.../
使用
Run: mockery -name=Stringer生成的mock名称 and the following will be output to mocks/Stringer.go
1、生成mock文件,默认在./mocks目录下
mockery -name=Mocker接口名
2、生成mock输出到控制台
mockery -name=接口名 -print
代码处理:
1.业务接口
1.定义被mock的接口
2.定义类(实现接口)
3.定义个方法New(),返回该类对象
// 1.定义接口
type Driver interface {
Add(*ImportSet) (int64, error)
}
// 2.定义类,实现该接口
type driverImp struct{}
//3.定义方法,创建该类对象
func NewDriver() Driver {
return &driverImp{}
}
2.生成mock方法
mockery -name=接口名 -print
生成要被mock的方法
3.service层调用处
// 用创建对象的方法,获取对象,调用接口方法
NewDriver().QueryImportDetails(req.ImportUuid)
4.单元测试
func TestFunc(t *testing.T) {
//保存原来的对象helper.ListDrv就是newDrv()
oldFd := helper.ListDrv
//最后还原对象
defer func() {
helper.ListDrv = oldFd
}()
type args struct {
ctx context.Context
req
}
tests := []struct {
name string
args args
want *****
wantErr bool
//在表驱动中,写mock方法
mock func()
}{
{
name: "error",
args: args{
ctx: context.Background(),
req: **,
},
wantErr: false,
want: ***
mock: func() {
mfd := &listmock.Driver{}
mfd.On("QueryCount").Return(int64(0), nil)
mfd.On("QueryList", mock.Anything, mock.Anything).Return([]list.ImportList{{UUID: "xxx", Description: "ddddd"}}, nil)
//还原对象
helper.ListDrv = mfd
},
},
},
// 测试用例
for _, tt := range tests {
// 执行mock方法
tt.mock()
t.Run(tt.name, func(t *testing.T) {
里面的单元测试内容不变
}
常用命令
-v是显示出详细的测试结果,
-cover 显示出执行的测试用例的测试覆盖率
1 测试单个文件,一定要带上被测试的原文件
go test -v -cover file1_test.go file.go
2 测试单个函数方法
go test -v -cover -run TestFuncName
3 测试整个api包
在包统计目录下
go test -v -cover ./api/...
4、自动生成测试用例,为指定的函数生成单元测试,输出到控制台
gotests -only "函数名称" file(源文件名称).go
5、自动生成测试用例,为指定文件生成单元测试,输出到文件中
gotests -all -w origin.go, origin_test.go
6、生成mock
//输出到控制台
mockery -name=接口名 -print
//输出到./mocks/接口名.go文件中
mockery -name=接口名
go mockweb接口_golang 单元测试(gotests、mockery自动生成)相关推荐
- 实体类dao接口mysql_利用MyBatis生成器自动生成实体类、DAO接口和Mapping映射文件...
解决问题: 可利用MyBatis生成器自动生成实体类.DAO接口和Mapping映射文件. 测试环境准备: 新建一个mysql数据库,例如mungerzTest. 生成一张主键为自增ID的学生表: C ...
- 自动生成python接口文档_Django自动生成Swagger接口文档
Django自动生成Swagger接口文档 1. 前言 当接口开发完成,紧接着需要编写接口文档.传统的接口文档通常都是使用Word或者一些接口文档管理平台进行编写,但此类接口文档维护更新比较麻烦,每次 ...
- Django DRF 自动生成接口文档
文章目录 1. 引子 2. 自动生成接口文档 3. 文档描述说明的定义位置 1. 引子 前端请求的url由谁来写 url 主要有后台来写,写完给前端: 如果后台查询数据,需要借助查询条件才能查询前端需 ...
- Spring Boot项目利用MyBatis Generator进行数据层代码自动生成
概 述 MyBatis Generator (简称 MBG) 是一个用于 MyBatis和 iBATIS的代码生成器.它可以为 MyBatis的所有版本以及 2.2.0之后的 iBATIS版本自动生成 ...
- 使用 Source Generator 自动生成 WEB API
使用 Source Generator 自动生成 WEB API Intro 上次我们介绍了使用 Source Generator 的应用,有小伙伴留言说想要自动生成一套 ABP 相关的东西,我对 A ...
- RESTful之自动生成接口文档
REST framework可以自动帮助我们生成接口文档.[必须是继承自rest_framework才会自动生成文档] 接口文档以网页的方式呈现. 自动接口文档能生成的是继承自APIView及其子类的 ...
- IDEA-Java自动生成单元测试
最近在写单元测试,感觉写Mock写烦了,于是想看看有没有现成的spring项目的单元测试生成工具. 网上找到了一个Java单元测试回答的集合:Automatic generation of unit ...
- springboot 中文文档_比Swagger还好用的自动生成接口文档工具
JApiDocs是一个无需额外注解.开箱即用的SpringBoot接口文档生成工具. 编写和维护API文档这个事情,对于后端程序员来说,是一件恼人但又不得不做的事情,我们都不喜欢写文档,但除非项目前后 ...
- php怎么根据接口文档实现功能,CodeIgniter+swagger实现 PHP API接口文档自动生成功能...
一.安装swagger 1.首先需要有composer,没有的自行百度安装 2.下载swagger,打开网站https://packagist.org/packages/zircote/swagger ...
最新文章
- H5嵌入原生开发小结----兼容安卓与ios的填坑之路
- 代言男科、站台微商、变身神棍....这些科学家被捧了几十年,黑历史曝光后,让人三观尽毁......
- android 检测摇一摇
- MATLAB快速傅里叶变换(fft)函数详解
- android时间显示秒,MIUI 12桌面如何显示带秒时钟?
- Linux 修改环境变量设置的三种方式
- 3.8 main.js-常用配置【uni-app教程uniapp教程(黄菊华-跨平台开发系列教程)】
- java 大写中文金额 转 数字
- linux下学习db2
- Ajax 跨域请求详解
- MicrobiomeAnalyst:一款综合的可视化微生物组学数据分析网页工具
- Flask开发微电影网站(一)
- Linux操作命令符(基本)
- 图谱卷积预备知识1:拉普拉斯矩阵
- LeetCode - 1705 吃苹果的最大数目
- android setdata方法,Android intent.setData方法
- 蜡烛图plotly_可视化神器Plotly(5)---参数详解
- 做好URL路径优化,帮你快速实现网站排名
- 【嵌入式中的C】寄存器清零和置位操作
- 【TCP/IP详解】【pause】以太网(PAUSE)流量控制原理
热门文章
- 基于python+django学生信息管理系统设计与实现(含程序源码和毕业设计)
- 婚礼拍得像MV一样,好感动!(男的看了都想结婚了)
- Java Agent简介及使用Byte Buddy和AspectJ LTW监控方法执行耗时
- 学习C语言-学习指针
- bootstarp怎么使盒子到最右边_海美迪H7Plus电视盒子:配置喜人,还没有广告?爱了...
- cmd 删除本地文件夹及其文件
- 雷霆战机 提升关卡经验魔方掉率攻略
- T83312 【音乐会】达拉崩吧·上
- 【PHP基础】PHP概述及简单语法
- 在2022年想创业就一定要注册公司吗?