[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

相关推荐
odoo中国2 小时前
Part 3 第十二章 单元测试 Unit Testing
单元测试·软件工程
Zero_pl2 小时前
单元测试的策略有哪些,主要包括什么?
单元测试
陈小咩咩3 小时前
IDEA单元测试插件 SquareTest 延长试用期权限
java·单元测试·intellij-idea
NPE~17 小时前
Bug:Goland debug失效详细解决步骤【合集】
go·bug·goland·dlv失效
喵个咪1 天前
开箱即用的GO后台管理系统 Kratos Admin - 交互式API文档 Swagger UI
后端·go·swagger
小石潭记丶2 天前
goland无法debug项目
go
ihengshuai2 天前
Jest单元测试
单元测试·jest·前端自动化测试
千舟2 天前
自己动手编写tcp/ip协议栈4:tcp数据传输和四次挥手
网络协议·go
CHSnake2 天前
gRPC和gRPC-gateway
go
leo_hush2 天前
使用spring-boot-starter-test做单元测试简单示例
java·spring boot·单元测试