go里面怎么写测试用例

本文详细介绍了如何在Go语言中使用testing框架进行单元测试(T类型)和性能测试(B类型),包括测试文件命名规则、包的命名规范、测试函数命名以及gotest命令的使用方法,强调了测试在代码开发中的重要性。
摘要由CSDN通过智能技术生成

Go 语言有自带的测试框架testing,可以用来实现单元测试(T 类型)和性能测试(B 类型),通过go test命令来执行单元测试和性能测试。

当你执行go test 测试用例时,是以 go 包为单位进行测试的。执行时需要指定包名,例如go test + 包名,如果没有指定包名,默认会选择执行命令时所在的包。go test 在执行时,会遍历以_test.go结尾的源码文件,执行其中以Test、Benchmark、Example开头的测试函数。

假设我要测试下列文件:

package test

func ArrSort(arr []int) []int {
	n := len(arr)
	for i := 0; i < n-1; i++ {
		// 每一轮将最大值放到数组末尾
		for j := 0; j < n-i-1; j++ {
			if arr[j] > arr[j+1] {
				arr[j], arr[j+1] = arr[j+1], arr[j]
			}
		}
	}
	return arr
}

包的命名

Go 的测试文件名必须以_test.go结尾。例如,如果我们有一个名为array.go的文件,那它的测试文件必须命名为array_test.go。这样做是因为,Go 需要区分哪些文件是测试文件。这些测试文件可以要被 go test 命令行工具加载,用来测试我们编写的代码,但会被 Go 的构建程序忽略掉,因为 Go 程序的运行不需要这些测试代码。

Go 的测试可以分为白盒测试和黑盒测试。
在白盒测试中,Go 的测试包名称需要跟被测试的包名保持一致,举个例子:array.go定义了一个abc包,则array_test.go的包名也要为abc,这也意味着array.go和array_test.go都要在同一个目录中。

然而黑盒测试中,Go 的测试包名称需要跟被测试的包名不同,你也可以存放在同一个目录下。举个例子,array.go定义了一个abc包,则array_test.go的包名需要跟abc不同,通常我们命名为abc_test。

go test 工具的默认白盒测试;使用白盒测试,我们可以测试和使用不可导出的标识符。测试文件和包的命名规范,都会由 Go 语言及 go test 工具来强制约束。

函数的命名

测试用例函数必须以Test、Benchmark、Example开头,例如TestAbc、BenchmarkAbc、ExampleAbc,Abc部分为任意字母数字的组合,首字母大写。这是由 Go 语言和 go test 工具来进行约束的,Abc一般是需要测试的函数名。

变量的命名

Go 中的变量名应该尽量短短而不是长。变量离声明越远,对名称的描述性要求越高。像循环、索引之类的变量,名称可以是单个字母(i)。如果是不常见的变量和全局变量,变量名就需要具有更多的描述性。

单元测试

单元测试用例函数以 Test 开头,例如 TestXxx 或 Test_xxx ( Xxx 部分为任意字母数字组合,首字母大写)。函数参数必须是 *testing.T,可以使用该类型来记录错误或测试状态。我们可以调用 testing.T 的 Error 、Errorf 、FailNow 、Fatal 、FatalIf 方法,来说明测试不通过;调用 Log 、Logf 方法来记录测试信息。例如测试一下上面写的数组排序算法

func TestArrSort(t *testing.T) {
	arr := []int{3,1,2,5,7,4,6}
    got := ArrSort(arr)
    if len(got) == 0 {
        t.Errorf("排序错误")
    }
}

然后运行go test命令来执行如上单元测试用例:

$ go test
PASS
ok      demo/test    0.002s

go test 还支持下面三个参数。
-v,显示所有测试函数的运行细节:

$ go test -v
=== RUN   ArrSort
--- PASS: ArrSort (0.02s)
PASS
ok     demo/test    0.002s

-run < regexp>,指定要执行的测试函数:

$ go test -v -run='TestA.*'
=== RUN   TestArrSort
--- PASS: TestArrSort (0.02s)
PASS
ok      demo/test    0.001s

这样子,我们就只运行了以TestA开头的测试函数。

-count N,指定执行测试函数的次数:

$ go test -v -run='TestA.*' -count=2
=== RUN   TestArrSort
--- PASS: TestArrSort (0.02s)
PASS
ok      demo/test    0.002s

好了,一个简单的测试用例就完成了,这样子可以有效的看到我们自己写的函数的执行速度,方便我们调优。

性能测试

接下来说一下性能测试,
性能测试用例函数必须以Benchmark开头,以*testing.B 作为函数入参,通过 go test -bench 运行。
例如:

func BenchmarkRandInt(b *testing.B) {
    for i := 0; i < b.N; i++ {
        RandInt()  //你自己需要测试的函数名,也可以我上面写的排序函数。
    }
}

go test命令默认不会执行性能测试函数,需要通过指定参数-bench 来运行性能测试函数。-bench后可以跟正则表达式,选择需要执行的性能测试函数,例如go test -bench=“.“表示执行所有的压力测试函数。
开始执行go test -bench=”.

$ go test -bench=".*"
goos: linux
goarch: amd64
pkg: demo/test
BenchmarkRandInt-4      97384827                12.4 ns/op
PASS
ok      demo/test    1.223s

看执行的的结果

BenchmarkRandInt-4,BenchmarkRandInt表示所测试的测试函数名.

4 表示有 4 个 CPU 线程参与了此次测试,默认是GOMAXPROCS的值。

97384827 ,说明函数中的循环执行了97384827次。

12.4 ns/op,说明每次循环的执行平均耗时是 12.8 纳秒,该值越小,说明代码性能越高

测试库的B 类型的性能测试还支持下面 4 个参数。

benchmem,输出内存分配统计:

$ go test -bench=".*" -benchmem
goos: linux
goarch: amd64
pkg: demo/test
BenchmarkRandInt-4      96776823                12.8 ns/op             0 B/op          0 allocs/op
PASS
ok      demo/test    1.255s

你看指定了-benchmem参数后,执行结果中又多了两列:

0 B/op,表示每次执行分配了多少内存(字节),该值越小,说明代码内存占用越小;

0 allocs/op,表示每次执行分配了多少次内存,该值越小,说明分配内存次数越少,意味着代码性能越高。

benchtime,指定测试时间和循环执行次数(格式需要为 Nx,例如 100x):

$ go test -bench=".*" -benchtime=10s # 指定测试时间

$ go test -bench=".*" -benchtime=100x # 指定循环执行次数

cpu,指定 GOMAXPROCS。
timeout,指定测试函数执行的超时时间:

$ go test -bench=".*" -timeout=10s

结语

当我们编写完代码之后,就可以用T类型或者B类型写出符合我们预期的测试用例,这是一个非常好的习惯,对于我们检查代码维护代码有很大的用处。

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BIMCC筑云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值