Go Test
Go语言自带了一个强大的测试框架,它通过go test
命令来运行测试。这个工具可以执行单元测试、性能测试(基准测试)、示例测试,并且支持测试覆盖率的统计和报告生成。
Go Test 简介
单元测试
单元测试是通过编写以Test
开头的函数来实现的,这些函数接收一个*testing.T
类型的参数。每个测试函数应该独立地验证程序的一部分功能是否正确工作。例如:
package mypackage
import (
"testing"
)
func TestAdd(t *testing.T) {
if add(2, 3) != 5 {
t.Error("Expected 5 but got", add(2, 3))
}
}
func add(a, b int) int {
return a + b
}
基准测试
基准测试用于测量代码的性能。它们以Benchmark
开头,接收一个*testing.B
类型的参数,并使用b.N
进行循环测试。例如:
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
add(2, 3)
}
}
示例测试
示例测试是为了提供文档化的例子,它们会出现在生成的文档中。示例测试函数名以Example
开头,不需要任何参数,也不返回任何值。例如:
func ExampleAdd() {
fmt.Println(add(2, 3))
// Output: 5
}
测试覆盖率
测试覆盖率衡量的是测试覆盖了多少代码行或分支。你可以使用-cover
标志来查看覆盖率统计信息:
go test -cover
这将输出类似如下的结果:
ok your/package/path 1.234s coverage: 80.0% of statements
生成HTML覆盖率报告
为了更直观地看到哪些代码被测试覆盖了,以及哪些没有,你可以生成一个HTML格式的覆盖率报告。首先你需要用-coverprofile
选项指定一个文件来保存覆盖率数据,然后使用go tool cover
转换并查看该文件:
# 运行测试并将覆盖率数据保存到coverage.out文件中
go test -coverprofile=coverage.out
# 将覆盖率数据转换为HTML格式并打开浏览器查看
go tool cover -html=coverage.out
如果你想直接在命令行中生成HTML报告而不用手动打开文件,可以这样做:
go test -coverprofile=coverage.out && go tool cover -html=coverage.out -o coverage.html
之后,你可以在当前目录下找到名为coverage.html
的文件,双击即可在默认浏览器中打开。
其他有用的选项
-coverpkg
:指定要计算覆盖率的包列表。-covermode
:设置覆盖率模式(set
,count
,atomic
),其中atomic
最适合并发测试。-v
:显示详细输出,包括每个测试的结果。
综上所述,go test
是一个非常强大且易于使用的工具,它可以帮助开发者确保他们的代码质量,并通过可视化的覆盖率报告了解哪些部分可能需要更多的测试。
多用组合、少用继承
基于接口而非实现进行编程