前言
在开发中,为了提升代码质量,经常我们需要编写单元测试。gotests是一个提升编码效率的工具,可以自动生成Go代码的单元测试,减少我们手动编写测试的工作量。
gotests
来自于官方的介绍
gotests
使编写 Go 测试变得容易。它是一个 Golang 命令行工具,可根据目标源文件的函数和方法签名生成表驱动测试。测试文件中的任何新依赖项都会自动导入。
安装
这里我们使用[go get
]安装和更新:
go
go get -u github.com/cweill/gotests/...
安装完成,我们可以使用
cmd
gotests -h
来查看gotests的usage和options
js
gotests -h
Usage of gotests:
-all 为所有函数和方法生成测试
-excl string regexp。为不需要的函数和方法生成测试匹配。优先于-only、-exported和-all
-exported 为导出的函数和方法生成测试。需要 优先于-only和-all
-i 在错误消息中打印测试输入
-only regexp。为只匹配的函数和方法生成测试。 优先于-all
-nosubtests 当>= Go 1.7时禁用子测试生成
-parallel 当>= Go 1.7时启用并行子测试生成。
-w 将输出写入(测试)文件而不是标准输出
-template_dir 包含自定义测试代码模板的目录的路径。需要 优先于-template。这也可以通过环境设置
变量GOTESTS_TEMPLATE_DIR
-template 指定自定义测试代码模板,例如:作证。这也可以
通过环境变量GOTESTS_TEMPLATE设置
-template_params 使用stdin从json中读取外部参数到模板
-template_params_file string 通过json与file读取外部参数到模板
生成测试代码
gotests
可以为特定源文件或整个目录生成 Go 测试。默认情况下,它将输出打印到stdout
。 我们以一个简单是数学加减乘除法为例,演示如何使用gotests命令来自动生成测试代码。 在workspace/
目录下,创建xmath.go
go
package xmath
func Add(a, b int) int {
return a + b
}
func Subtract(a, b int) int {
return a - b
}
func Multiply(a, b int) int {
return a * b
}
func Divide(a, b int) int {
return a / b
}
在目录下,并运行以下命令:
go
gotests -all xmath.go
输出如下:
js
gotests -all xmath.go
Generated TestMultiply
Generated TestDivide
package xmath
import (
"testing"
)
func TestAdd(t *testing.T) {
type args struct {
a int
b int
}
tests := []struct {
name string
args args
want int
}{
// TODO: Add test cases.
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := Add(tt.args.a, tt.args.b); got != tt.want {
t.Errorf("Add() = %v, want %v", got, tt.want)
}
})
}
}
func TestSubtract(t *testing.T) {
type args struct {
a int
b int
}
tests := []struct {
name string
args args
want int
}{
// TODO: Add test cases.
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := Subtract(tt.args.a, tt.args.b); got != tt.want {
t.Errorf("Subtract() = %v, want %v", got, tt.want)
}
})
}
}
func TestMultiply(t *testing.T) {
type args struct {
a int
b int
}
tests := []struct {
name string
args args
want int
}{
// TODO: Add test cases.
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := Multiply(tt.args.a, tt.args.b); got != tt.want {
t.Errorf("Multiply() = %v, want %v", got, tt.want)
}
})
}
}
func TestDivide(t *testing.T) {
type args struct {
a int
b int
}
tests := []struct {
name string
args args
want int
}{
// TODO: Add test cases.
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := Divide(tt.args.a, tt.args.b); got != tt.want {
t.Errorf("Divide() = %v, want %v", got, tt.want)
}
})
}
}
上例中,stdout输出了每个函数和方法对应的测试用例,当然,我们可以将其保存到xmath_test.go中。我们可以通过-w
来实现,详细的命令如下:
js
gotests -all -w .\xmath.go
执行后你将在workspace下,生成xmath_test.go,内容和stdout的内容一致。
更多的options的使用可以参考 github.com/cweill/gote...
Goland IDE下使用
Goland可以通过快捷键ctrl+shift+T, 或者右键
--Go To
--Test
--Tests for package
生成测试用例
同样,会在目录下生成xmath_test.go
总结
文中简介了gotests工具,其可以自动生成生成代码的单元测试,避免重复的工作量,提升编码效率。并通过一个的生成go单元测试的例子,演示了如何入门使用。另外在Goland IDE中,可以通过Tests for package也可以快速生成单元测试。
Te
- GitHub(github.com/cweill/gote...
- golang编写单元测试 (gitee.com/lucktk/stud...)
- Goland IDE下使用 (juejin.cn/post/684490...)