[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

相关推荐
FungLeo4 小时前
成为全栈·Node 后端篇·后端测试策略:单元、集成与测试数据库
单元测试·node.js·集成测试·测试策略·成为全栈·测试数据库
yume_sibai7 小时前
09-Rust 测试与质量保证(单元测试 + 集成测试 + Mock + Benchmark + Fuzzing + CI/CD)
rust·单元测试·集成测试
江湖十年7 小时前
Go 虚荣域名详解:我用 go get -x 抓了个包,终于看清了 Go 工具链“对暗号”的全过程
后端·面试·go
平头哥AI16 小时前
Day 22 _ 包装错误别丢链_%w、errors.Is 与 errors.As
android·服务器·学习·golang·go
王码码20351 天前
Go语言CGO:Go与C交互
后端·golang·go·接口
妙码生花1 天前
两个月 59 篇 AI 开发日志 + Golang 商业级实战项目收工后,得来的 AI 使用心法-下
前端·后端·go
平头哥AI1 天前
Day 21 _ error 是个普通值_errors.New 与 fmt.Errorf 造出来,沿调用栈抛到 main 接住
后端·学习·golang·go
ChampaignWolf1 天前
Joule Unit Test 深度集成:ABAP 单元测试的 AI 六件套全解析
人工智能·单元测试·sap·abap·joule·单元测试ai
川石课堂软件测试1 天前
涨薪技术|Prometheus之HTTP API中使用PromQL
网络协议·测试工具·jmeter·http·单元测试·postman·prometheus
HappRobot2 天前
# Go语法基础
go