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测试单元测试

单元测试某个函数

基准测试

基准测试某个函数

相关推荐
FQNmxDG4S6 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
前端老石人6 小时前
HTML 字符引用完全指南
开发语言·前端·html
matlab_xiaowang6 小时前
Redux 入门:JavaScript 可预测状态管理库
开发语言·javascript·其他·ecmascript
虹科网络安全7 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje7 小时前
Java语法进阶
java·开发语言·jvm
老前端的功夫7 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287927 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
止语Lab7 小时前
从手动到框架:Go DI 演进的三个拐点
开发语言·后端·golang
yaoxin5211238 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
小短腿的代码世界8 小时前
Qt日志系统深度解析:从qDebug到企业级日志框架
开发语言·qt