当前位置: 首页 > article >正文

第十一章 测试——1.单元测试

一、引言

单元测试是软件开发中确保代码质量的关键步骤之一。Go语言内置了一个简单而强大的测试框架,使得开发者可以方便地编写和运行单元测试。本文将详细介绍Go语言单元测试的基本概念、编写方法以及一些高级技巧。

二、单元测试的基本概念
  1. 测试文件:在Go语言中,所有以_test.go为后缀名的源文件都被视为测试文件。这些文件不会被包含在go build的源代码构建中,而是单独通过go test命令来编译和执行。
  2. 测试函数:每个测试函数都必须导入testing包,并且函数名必须以大写Test开头,后跟函数名(可以是大写字母或下划线)。测试函数的参数必须是*testing.T类型。
  3. 测试包:通常情况下,测试文件应该与源代码文件放在同一个包内。测试文件的命名一般是{source_filename}_test.go
三、编写单元测试
  1. 基本测试函数

一个基本的测试函数示例如下:

// math_test.go
package main
 
import (
	"testing"
)
 
func TestSum(t *testing.T) {
	result := Sum(3, 5)
	if result != 8 {
		t.Fatalf("Sum(3, 5) = %d; want %d", result, 8)
	}
}
 
func Sum(a, b int) int {
	return a + b
}

在终端中运行go test -v命令,将执行该测试函数并输出结果。

  1. 测试覆盖率

测试覆盖率是衡量代码被测试程度的重要指标。可以使用go test -cover命令来查看测试覆盖率。例如:

$ go test -cover
PASS
coverage: 50.0% of statements
ok  	learn-go/main/test_learn	0.438s

可以将覆盖率信息保存到文件中,以便后续分析:

$ go test -coverprofile=cover.out
$ go tool cover -func=cover.out
learn-go/main/test_learn/math.go:6:	Sum		50.0%

还可以使用HTML格式查看详细的覆盖率信息:

$ go tool cover -html=cover.out

这将默认在浏览器中打开一个页面,显示详细的覆盖率报告。

  1. 测试单个函数

有时候,我们可能只想测试某个特定的函数。可以使用-run标志来指定要测试的函数。例如:

$ go test -v -run TestSum
  1. 使用断言库

Go语言的标准测试框架虽然强大,但有时候使用断言库可以使测试代码更加简洁和易读。常用的断言库有github.com/stretchr/testify/assert

安装断言库:

$ go get github.com/stretchr/testify/assert

使用断言库编写测试函数:

go复制代码



// math_test.go
package main
 
import (
	"testing"
	"github.com/stretchr/testify/assert"
)
 
func TestSum(t *testing.T) {
	assert := assert.New(t)
	assert.Equal(8, Sum(3, 5))
}
  1. 批量测试

对于需要多次测试相同函数但输入参数不同的场景,可以使用批量测试。例如:

func TestMul(t *testing.T) {
	testCases := []struct {
		name string
		a, b int
		res  int
	}{
		{"n1", 3, 4, 12},
		{"n2", -1, -1, 1},
		{"n3", 0, 5, 0},
	}
	for _, tc := range testCases {
		t.Run(tc.name, func(t *testing.T) {
			assert.Equal(t, tc.res, Mul(tc.a, tc.b))
		})
	}
}
 
func Mul(a, b int) int {
	return a * b
}
四、高级技巧
  1. 基准测试

除了单元测试外,Go语言还支持基准测试(Benchmark Test)。基准测试用于评估代码的性能。编写基准测试函数时,函数名必须以Benchmark开头。例如:

func BenchmarkSum(b *testing.B) {
	for i := 0; i < b.N; i++ {
		Sum(3, 5)
	}
}

运行基准测试:

$ go test -bench=.
  1. 模拟(Mock)

在单元测试中,有时候需要模拟一些外部依赖(如数据库、网络请求等)。可以使用第三方库(如github.com/golang/mock)来生成和管理模拟对象。

五、总结

本文介绍了Go语言单元测试的基本概念、编写方法以及一些高级技巧。通过编写单元测试,可以确保代码的正确性和稳定性。同时,结合断言库、批量测试和基准测试等高级技巧,可以进一步提高测试效率和代码质量。


http://www.kler.cn/a/472980.html

相关文章:

  • Mac-docker配置
  • 网络安全-XSS跨站脚本攻击(基础篇)
  • MATLAB深度学习实战文字识别
  • Redis Java 集成到 Spring Boot
  • Python 中几个库的安装与测试
  • MATLAB对文件处理
  • 如何使用PyTorch进行模型微调
  • MyBatis面试-1
  • 【git】在服务器使用docker设置了一个gogs服务器,访问和现实都不理想
  • 云南省有一级科技查新机构吗?
  • STM32和国民技术(N32)单片机串口中断接收数据及数据解析
  • LeetCode 744. 寻找比目标字母大的最小字母
  • android ROM开发网络下载速度缓慢问题解决方案
  • Docker入门之docker基本命令
  • ingress-nginx-controller安装
  • jenkins入门7 --发送邮件1
  • 基于Qt/C++二维码生成器(附工程源码链接)
  • ClickHouse Cloud Backup 带宽控制问题诊断以及原理分析
  • 常用命令2-netstat
  • 5G学习笔记之SNPN系列之网络选择
  • 离线录制激光雷达数据进行建图
  • 学习threejs,导入wrl格式的模型
  • ip属地功能有什么作用?自己的ip属地哪里看
  • git 创建tag, 并推送到远程仓库,启动actions构建release自动发布
  • Golang的并发编程异常处理
  • 通过Android Studio修改第三方jar包并重新生成jar包