[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

相关推荐
车载测试工程师18 小时前
汽车功能安全-软件单元验证 (Software Unit Verification)【用例导出方法、输出物】8
网络·功能测试·安全·车载系统·单元测试·汽车
nextera-void18 小时前
深入浅出 Golang:一次精神之旅
开发语言·golang·go
DemonAvenger20 小时前
Go语言实现DNS解析与域名服务的实践与优化
网络协议·架构·go
痴人说梦梦中人20 小时前
Gin框架统一响应与中间件机制学习笔记
网络安全·中间件·go·gin
程序员爱钓鱼21 小时前
Go语言实战案例-判断回文字符串-是不是正着念反着念都一样?
后端·google·go
岁忧2 天前
(LeetCode 面试经典 150 题 ) 209. 长度最小的子数组(双指针)
java·c++·算法·leetcode·面试·go
熬了夜的程序员2 天前
【华为机试】HJ30 字符串合并处理
算法·华为·面试·go
一条GO2 天前
易犯的五个Go编码错误
go
Code季风2 天前
Go并发详解
go·编程语言·设计
程序员爱钓鱼2 天前
Go语言实战案例-字符串反转
后端·google·go