golang 单元测试

参考:https://www.cnblogs.com/nickchen121/p/11517443.html
https://www.cnblogs.com/wukai66/p/12036135.html

单元测试文件的名字:*_test.go
测试函数的名字必须以Test开头,可选的后缀名必须以大写字母开头。
在这里插入图片描述

案例一

文件结构:
split
------spilt.go
------split_test.go
------go.mod

spilt.go

package split
import "strings"
func Split(s, sep string) (result []string) {
	i := strings.Index(s, sep)

	for i > -1 {
		result = append(result, s[:i])
		s = s[i+1:]
		i = strings.Index(s, sep)
	}
	result = append(result, s)
	return
}

split_test.go

package split
import (
	"reflect"
	"testing"
)
func TestSplit(t *testing.T) { // 测试函数名必须以Test开头,必须接收一个*testing.T类型参数
	got := Split("a:b:c", ":")         // 程序输出的结果
	want := []string{"a", "b", "c"}    // 期望的结果
	if !reflect.DeepEqual(want, got) { // 因为slice不能比较直接,借助反射包中的方法比较
		t.Errorf("excepted:%v, got:%v", want, got) // 测试失败输出错误提示
	}
}

测试:
在这里插入图片描述

案例二

改进案例一:案例一只能根据:(长度为1 的字符串)切割

在这里插入图片描述
split_test.go
在这里插入图片描述
测试:
在这里插入图片描述

备注:
执行所有的单元测试:go test -v
执行指定的单元测试:go test -v -run TestMoreSplit .
在这里插入图片描述

案例三:测试组

代码结构:
在这里插入图片描述
splitmore_test.go

package split

import (
	"reflect"
	"testing"
)

func TestSplit(t *testing.T) {
	type test struct {
		input string
		sep   string
		want  []string
	}

	tests := map[string]test{ //测试用例使用map存储
		"simple":      {input: "a:b:c", sep: ":", want: []string{"a", "b", "c"}},
		"wrong sep":   {input: "a:b:c", sep: ",", want: []string{"a:b:c"}},
		"more sep":    {input: "abcd", sep: "bc", want: []string{"a", "d"}},
		"leading sep": {input: "沙河有沙又有河", sep: "沙", want: []string{"", "河有", "又有河"}},
	}
	for name, tc := range tests {
		// got := Split(tc.input, tc.sep)
		// if !reflect.DeepEqual(got, tc.want) {
		// 	t.Errorf("name:%s excepted:%#v, got:%#v", name, tc.want, got) // 将测试用例的name格式化输出
		// }
		t.Run(name, func(t *testing.T) { // 使用t.Run()执行子测试
			got := Split(tc.input, tc.sep)
			if !reflect.DeepEqual(got, tc.want) {
				t.Errorf("excepted:%#v, got:%#v", tc.want, got)
			}
		})
	}
}

#测试结果:
在这里插入图片描述

案例四、其他指标

测试覆盖率
在这里插入图片描述

将覆盖率相关的记录信息输出到一个文件
在这里插入图片描述
打开本地的浏览器窗口生成一个HTML报告
在这里插入图片描述

五、基准测试:

在一定的工作负载之下检测程序性能的一种方法。
基准测试的基本格式:
基准测试以Benchmark为前缀,需要一个*testing.B类型的参数b,基准测试必须要执行b.N次,这样的测试才有对照性,b.N的值是系统根据实际情况去调整的,从而保证测试的稳定性。

基准测试并不会默认执行,需要增加-bench参数,所以我们通过执行go test -bench=Split命令执行基准测试,

func BenchmarkName(b *testing.B){
    // ...
}

在这里插入图片描述
BenchmarkSplit-12代表是对Split函数进行基准测试,数字12代表GOMAXPROCS的值。
5932636和198ns/op代表每次调用Split函数耗时198ns,这个结果是测试5932636后的平均值。

案例五、Fib基准测试

fib.go

package split
// Fib 是一个计算第n个斐波那契数的函数
func Fib(n int) int {
	if n < 2 {
		return n
	}
	return Fib(n-1) + Fib(n-2)
}

bech_test.go

package split
import (
	"testing"
)

func benchmarkFib(b *testing.B, n int) {
	for i := 0; i < b.N; i++ {
		Fib(n)
	}
}
func BenchmarkFib1(b *testing.B)  { benchmarkFib(b, 1) }
func BenchmarkFib2(b *testing.B)  { benchmarkFib(b, 2) }
func BenchmarkFib3(b *testing.B)  { benchmarkFib(b, 3) }
func BenchmarkFib10(b *testing.B) { benchmarkFib(b, 10) }
func BenchmarkFib20(b *testing.B) { benchmarkFib(b, 20) }
func BenchmarkFib40(b *testing.B) { benchmarkFib(b, 40) }

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值