go单元测试和基准测试

1、单元测试和基准测试

单元测试和基准测试代码开发中的重要环节,良好的单元测试和基准测试,能提升开发质量,对整体开发有非常重要的重要,下面介绍单元测试和基准测试的写法。

2、单元测试和基准测试写法

以排序基本排序算法,选择和插入为例介绍,整体代码目录如图所示

创建sort.go和对象sort_test.go

在sort.go中增加函数InsertSort和SelectSort

go 复制代码
package main

func SeletSort(a []int) {
	for i := 0; i < len(a)-1; i++ {
		for j := i + 1; j < len(a); j++ {
			if a[j] < a[i] {
				a[j], a[i] = a[i], a[j]
			}
		}
	}
}

func InsertSort(a []int) {
	for j := 1; j < len(a); j++ {
		for i := j; i > 0 && a[i] < a[i-1]; i-- {
			a[i], a[i-1] = a[i-1], a[i]
		}
	}

}

单元测试需要以Test为前缀+待测试函数,在sort_test.go增加TestSelectSort函数:

go 复制代码
func TestSelectSort(t *testing.T) {
	testCases := []struct {
		input    []int
		expected []int
	}{
		{
			input:    []int{8, 12, 3, 1, 4, 5},
			expected: []int{1, 3, 4, 5, 8, 12},
		},
		{
			input:    []int{8, 13, 0, 9, 8, 7, 6},
			expected: []int{0, 6, 7, 8, 8, 9, 13},
		},
		{
			input:    []int{10, 9, 8, 7, 6, 5, 4},
			expected: []int{4, 5, 6, 7, 8, 9, 10},
		},
		{
			input:    []int{1, 2, 3, 6, 5, 4},
			expected: []int{1, 2, 3, 4, 5, 6},
		},
		{
			input:    []int{7, 7, 7, 9, 9, 9, 9, 6, 6, 6},
			expected: []int{6, 6, 6, 7, 7, 7, 9, 9, 9, 9},
		},
	}

	for i := 0; i < len(testCases); i++ {
		SeletSort(testCases[i].input)

		if !compareSlice(testCases[i].input, testCases[i].expected) {
			t.Errorf("Test case %d: Expected slice %v but received error %v", i+1, testCases[i].expected, testCases[i].input)
		}
	}

}

基准测试以Benchmark+待测函数,分别添加BenchmarkSelectSort和BenchmarkInsertSort

go 复制代码
func BenchmarkInsertSort(b *testing.B) {
	for i := 0; i < b.N; i++ {
		testCases := []struct {
			input    []int
			expected []int
		}{
			{
				input:    []int{8, 12, 3, 1, 4, 5},
				expected: []int{1, 3, 4, 5, 8, 12},
			},
			{
				input:    []int{8, 13, 0, 9, 8, 7, 6},
				expected: []int{0, 6, 7, 8, 8, 9, 13},
			},
			{
				input:    []int{10, 9, 8, 7, 6, 5, 4},
				expected: []int{4, 5, 6, 7, 8, 9, 10},
			},
			{
				input:    []int{1, 2, 3, 6, 5, 4},
				expected: []int{1, 2, 3, 4, 5, 6},
			},
			{
				input:    []int{7, 7, 7, 9, 9, 9, 9, 6, 6, 6},
				expected: []int{6, 6, 6, 7, 7, 7, 9, 9, 9, 9},
			},
		}

		for i := 0; i < len(testCases); i++ {
			InsertSort(testCases[i].input)
		}
	}
}

func BenchmarkSelectSort(b *testing.B) {
	for i := 0; i < b.N; i++ {
		testCases := []struct {
			input    []int
			expected []int
		}{
			{
				input:    []int{8, 12, 3, 1, 4, 5},
				expected: []int{1, 3, 4, 5, 8, 12},
			},
			{
				input:    []int{8, 13, 0, 9, 8, 7, 6},
				expected: []int{0, 6, 7, 8, 8, 9, 13},
			},
			{
				input:    []int{10, 9, 8, 7, 6, 5, 4},
				expected: []int{4, 5, 6, 7, 8, 9, 10},
			},
			{
				input:    []int{1, 2, 3, 6, 5, 4},
				expected: []int{1, 2, 3, 4, 5, 6},
			},
			{
				input:    []int{7, 7, 7, 9, 9, 9, 9, 6, 6, 6},
				expected: []int{6, 6, 6, 7, 7, 7, 9, 9, 9, 9},
			},
		}

		for i := 0; i < len(testCases); i++ {
			SeletSort(testCases[i].input)
		}
	}
}

3.测试

go test 或者go test -v测试单元测试

单元测试某个函数

基准测试

基准测试某个函数

相关推荐
wuyk55518 分钟前
12.归并排序:分治思想的稳定排序算法
开发语言·数据结构·算法·排序算法
吴声子夜歌22 分钟前
ApacheCommons——commons-text(模板替换与文本算法)
java·开发语言·算法·apache
quantdash_cc1 小时前
量化数据源怎么选:稳定性、实时性和数据完整性到底该如何权衡?
开发语言·python·数据分析·量化交易·股票数据·quantdash
萧瑟余晖1 小时前
Java深入解析篇五十四之对象模型详解
java·开发语言
张文是假的啊2 小时前
Java | record | Controller逻辑
java·开发语言
不甘先生2 小时前
Go 中 type、方法与指针接收者:从 str_name.Name() 看懂 Go 的类型系统
开发语言·后端·golang
quantdash_cc3 小时前
Python 股票 K 线数据质量校验:字段、缺失值、重复行和价格异常
开发语言·python·数据分析·量化交易·股票数据·quantdash
Zenova EdgeOS3 小时前
工业网关重试机制:从固定间隔到指数退避的工程实战
开发语言·网络·php
嘻哈baby3 小时前
Go 函数中的参数为什么不支持默认值?
java·开发语言·jvm
一晌小贪欢3 小时前
python-第29天:Python面向对象之多态与抽象类
开发语言·python·数据可视化·面向对象·python办公·python多态