go单元测试实战

Go 语言有自带的测试框架testing,可以用来实现单元测试(T 类型)和性能测试(B 类型),通过go test命令来执行单元测试和性能测试。
go test 执行测试用例时,是以 go 包为单位进行测试的。执行时需要指定包名,比如go test 包名,如果没有指定包名,默认会选择执行命令时所在的包。go test 在执行时,会遍历以_test.go结尾的源码文件,执行其中以Test、Benchmark、Example开头的测试函数。

注意:
测试文件与被测文件需要在同一个目录包下,测试文件必须以_test结尾。比如hello.go对应的测试文件可以命名为hello_test.go(也可以一个测试文件测试包内其他所有文件的导出方法)
测试文件的测试方法必须是Test开头,比如测试Abs方法,就可以命名为TestAbs或者Test_Abs
测试方法必须传入参数 *testing.T,可以使用该类型来记录错误或测试状态。我们可以调用 testing.T 的 Error 、Errorf 、FailNow 、Fatal 、FatalIf 方法,来说明测试不通过

代码实战:

package unittest

import "math"

// Abs returns the absolute value of x.
func Abs(x float64) float64 {
    return math.Abs(x)
}

// Max returns the larger of x or y.
func Max(x, y float64) float64 {
    return math.Max(x, y)
}

package unittest

import "testing"

// go test 自动搜集所有的测试文件,也就是格式为*_test.go的文件,从中提取全部测试函数并执行。
// go test -v 显示所有测试函数的运行细节
// go test -v -run <regexp>,指定要执行的测试函数。如 go test -v -run="TestAbs"

// 测试文件与被测文件在同一个目录包下,测试文件以_test结尾。比如hello.go对应的测试文件就是hello_test.go
// 测试文件的测试方法必须是Test开头,比如测试Abs方法,就可以命名为TestAbs或者Test_Abs
// 测试方法必须传入参数t *testing.T
func TestAbs(t *testing.T) {
    got := Abs(-1)
    if got != 1 {
        t.Errorf("Abs(-1) = %f; want 1", got)
    }
}

func TestAbs_2(t *testing.T) {
    tests := []struct {
        x    float64
        want float64
    }{
        {-0.3, 0.3},
        {-2, 2},
        {-3.1, 3.1},
        {5, 5},
    }
    for _, tt := range tests {
        if got := Abs(tt.x); got != tt.want {
            t.Errorf("Abs() = %f, want %v", got, tt.want)
        }
    }
}

func TestMax(t *testing.T) {
    got := Max(2, 8)
    if got != 8 {
        t.Errorf("Abs(2,8) = %f; want 8", got)
    }
}

开始执行测试:
go test 自动搜集所有的测试文件,也就是格式为*_test.go的文件,从中提取全部测试函数并执行。
go test -v 显示所有测试函数的运行细节
go test -v -run ,指定要执行的测试函数。如 go test -v -run=“TestAbs”

执行结果:
在这里插入图片描述

go自动生成单元测试

强烈推荐使用单元测试工具自动生成测试代码,然后我们只需要写测试用例!!!这样我们就能节省很多时间精力,而且还不会出错。

1、安装gotests工具

go get -u github.com/cweill/gotests/...

2、查看gotests的用法

gotests --help

3、进入测试代码目录,执行 gotests 为该目录下的所有函数生成测试用例:

gotests -all -w .

#-all:所有方法生成测试用例
#-w . : 保存测试文件到当前目录

4、指定一个方法DelPHPConf生成测试用例

gotests -only DelPHPConf -w .
#-only :指定一个方法名

5、添加测试用例
生成完测试用例,你只需要添加需要测试的输入和预期的输出就可以了。我们只需要补全TODO位置的测试数据即可。
在这里插入图片描述
补全测试用例后,代码如下:

func TestAbs(t *testing.T) {
    type args struct {
        x float64
    }
    tests := []struct {
        name string
        args args
        want float64
    }{
        {"詹姆斯", args{-12}, 12},
        {"杜兰特", args{-2}, 2},
    }
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            if got := Abs(tt.args.x); got != tt.want {
                t.Errorf("Abs() = %v, want %v", got, tt.want)
            }
        })
    }
}

执行结果:
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Golang中,单元测试是开发人员在编写代码时编写的一种测试方法,它关注代码的局部而不是整体。单元测试的目的是验证代码的各个单元(函数、方法、类等)是否按照预期工作。单元测试通常比其他测试运行得更快,并且可以帮助开发人员在代码编写过程中及时发现和修复问题。\[1\] 在Golang中,我们可以使用testing包来编写和运行单元测试。在测试函数中,我们可以使用testing.T类型的参数来进行断言和错误报告。如果需要跳过某个测试,可以使用testing.T的Skip方法。例如,可以使用testing.Short()函数来判断是否在短模式下运行测试,并使用t.Skip方法跳过测试。\[2\] 要运行Golang单元测试,可以使用go test命令。默认情况下,go test会运行当前目录下的所有测试文件。可以使用-v选项来输出详细的日志信息。测试运行成功时,会显示PASS,测试失败时,会显示FAIL。如果只想测试单个文件,可以在go test命令后面加上被测试的原文件。如果只想测试单个方法,可以使用-run选项指定要运行的测试方法的名称。\[3\] 希望这些信息对你有帮助! #### 引用[.reference_title] - *1* *2* [Golang单元测试](https://blog.csdn.net/LinAndCurry/article/details/122324323)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Golang-单元测试](https://blog.csdn.net/ALEX_CYL/article/details/121793330)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值