[go-tools] gotests:一个高效编写测试用例的工具

前言

在开发中,为了提升代码质量,经常我们需要编写单元测试。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

相关推荐
代码方舟4 小时前
Go数据工程:利用天远柠檬查出险优化二手车批发拍卖车源出险核查合规体验
人工智能·go
不是万能的豆学长4 小时前
排查Go服务40天后的内存泄漏问题
开发语言·后端·golang·go
用户125758524364 小时前
Golang后台管理框架推荐:XYGo Admin与devinggo怎么选?
后端·go·ai编程
tachibana26 小时前
Go语言里slice是怎么扩容的?
后端·golang·go·切片
孟陬7 小时前
不用盲调性能参数 Vitest 5.0 新推出 `vitest doctor` 一键诊断测试慢卡点,自动给出最优提速配置
性能优化·单元测试·vite
tachibana220 小时前
使用for range 的时候,它的地址会发生变化吗?
开发语言·后端·golang·go·语法
newerp1 天前
GC Pacer 调优算法:GOGC、GOMEMLIMIT 与容器 OOM 防御
后端·程序员·go
newerp1 天前
逃逸分析、栈分配与 sync.Pool 对象池
后端·程序员·go
Laurie三省2 天前
现场版却配上录音室版的歌词?聊聊我给开源 Mac 歌词软件写的多源打分算法
算法·macos·go
newerp3 天前
Execution Trace 深入实战:可视化调度与系统停顿分析
后端·程序员·go