1. 概述
在Go语言开发中,测试用例的编写和运行是保障代码质量的重要环节。Go语言提供了一套简单而强大的测试框架,便于开发者编写功能测试和性能测试。以下是Go语言中测试用例的基本特点和常见用法:
文件命名规范
测试用例所在的文件必须以_test.go结尾。只有这样的文件才会被Go的测试工具识别和执行。
测试用例的运行
通过命令go test xxx_test.go即可运行对应的测试用例。Go测试工具会自动扫描符合规范的测试函数并执行,输出测试结果。
测试用例的分类
Go语言主要支持以下两种常见的测试类型:
1. 功能测试(Functional Testing)
功能测试的测试函数通常以Test为前缀,命名格式为func TestXxx(t *testing.T),其中Xxx可以是描述测试内容的具体名称。功能测试主要用于验证代码逻辑是否符合预期。
-
如何跳过耗时的单元测试?
在某些情况下,一些测试可能运行时间较长,例如需要访问外部资源或处理大规模数据集。可以通过testing.T中的t.Skip方法在特定条件下跳过这些测试。例如:func TestHeavyFunction(t *testing.T) { if testing.Short() { t.Skip("Skipping heavy test in short mode.") } // 测试逻辑 }可以通过命令
go test -short来运行跳过这些测试的版本。 -
如何同时对多组数据进行测试?
基于表格驱动的测试(Table-Driven Testing)是Go中一种常见的测试模式。通过定义一个结构体数组存储测试用例的数据和期望结果,循环遍历数组来执行测试,提高代码复用性。例如:func TestAdd(t *testing.T) { testCases := []struct { a, b int expected int }{ {1, 2, 3}, {2, 3, 5}, {-1, -1, -2}, } for _, tc := range testCases { result := Add(tc.a, tc.b) if result != tc.expected { t.Errorf("Add(%d, %d) = %d; want %d", tc.a, tc.b, result, tc.expected) } } }
2. 性能测试(Benchmark Testing)
性能测试的测试函数以Benchmark为前缀,命名格式为func BenchmarkXxx(b *testing.B),其中Xxx可以是具体测试对象的名称。性能测试的目标是衡量代码的运行效率,关注函数在高频调用下的性能表现。
性能测试的核心在于使用b.N来控制测试循环次数,从而模拟不同规模的调用。例如:
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
Add(1, 2)
}
}
执行性能测试时,可以通过命令go test -bench=.运行所有基准测试,或通过go test -bench=Add只运行指定的基准测试。
2. Test功能测试
2.1 单元测试使用举例
- 创建demo1包,添加待测试的add函数方法
package demo1 func add(a, b int) int { return a + b } - 创建测试文件add_test.go,添加测试用例
- 测试用例函数必须以Test开头
- 参数必须是
t *testing.T,它提供了一些功能测试的方法,比如Error()、Fail()、Skip()等等。 - 可以像main函数一样直接运行
- golangIDE中直接点击运行
- 也可以终端:
go test .。注意是进入测试文件所在目录运行,不要运行_test.go文件。
package demo1 import "testing" func TestAdd(t *testing.T) { re := add(1, 2) if re != 3 { t.Errorf("expect %d, but actual %d", 3, re) } } - golangIDE中还可以运行所有的测试用例计算测试覆盖率
2.2 如何跳过耗时的单元测试?
- 测试用例中加上如果是以short模式进行的测试,则跳过当前测试用例。
- 终端中运行测试加上
-short参数,则所有带short的测试用例会被跳过。 - 注意:测试用例是否耗时是由程序员自己判断的。
go test -short
func TestAdd2(t *testing.T) {
// 如果以short模式进行的测试,则会跳过当前测试用例
if testing.Short() {
t.Skip("short 模式下跳过测试")
}
re := add(1, 2)
if re != 3 {
t.Errorf("expect %d, but actual %d", 3, re)
}
}
2.3 如何同时对多组数据进行测试——基于表格驱动的测试
- 创建一个结构体数组,结构体里的变量包含待测试函数的参数和预期值。
- 遍历结构体数组进行测试。