Go语言是一种支持并发和垃圾回收的编译型语言,它提供了一套简单而强大的测试工具,可以帮助开发者编写高质量的代码。本文将介绍Go语言的三种测试方式:单元测试、性能测试和覆盖率测试。
-
单元测试:单元测试是对程序中的最小可测试单元进行检验,通常是一个函数或一个方法。Go语言的标准库提供了 testing 包,可以方便地编写和运行单元测试。要编写一个单元测试,只需要创建一个以 _test.go 结尾的文件,定义一个以 Test 开头的函数,接受一个 *testing.T 类型的参数,然后使用 t.Error 或 t.Fatal 来报告测试失败。eg:
// calc_test.go package main import "testing" func TestAdd(t *testing.T) { if ans := Add(1, 2); ans != 3 { t.Errorf("1 + 2 expected be 3, but %d got", ans) } } 要运行单元测试,只需要在命令行中执行 go test 命令,它会自动找到当前目录下的所有 _test.go 文件,并执行其中的测试函数。也可以使用 -v 参数来查看详细的输出,或者使用 -run 参数来指定要运行的测试函数。
-
性能测试:性能测试是对程序的性能进行评估和优化,通常是关注程序的运行时间和内存占用等指标。Go语言的 testing 包也支持编写和运行性能测试,只需要定义一个以 Benchmark 开头的函数,接受一个 *testing.B 类型的参数,然后在函数体中使用 b.N 来控制循环次数,执行要测试的代码。eg:
// calc_test.go package main import "testing" func BenchmarkAdd(b *testing.B) { for i := 0; i < b.N; i++ { Add(1, 2) } } 要运行性能测试,需要在命令行中执行 go test -bench 命令,它会自动找到当前目录下的所有 Benchmark 函数,并执行其中的代码,统计运行时间和内存分配等信息。也可以使用 -benchmem 参数来查看更多的内存相关数据,或者使用 -benchtime 参数来指定每个 Benchmark 函数运行的时间。
-
覆盖率测试:覆盖率测试是对程序中执行到的代码行数进行统计和分析,通常是为了检查代码是否有遗漏或冗余的部分。Go语言提供了一个工具 go tool cover ,可以用来生成和查看覆盖率报告。要生成覆盖率报告,需要在命令行中执行 go test -coverprofile 命令,它会在当前目录下生成一个名为 cover.out 的文件,记录每个代码文件中每一行代码是否被执行到。eg:
$ go test -coverprofile cover.out ok example 0.007s coverage: 100.0% of statements 要查看覆盖率报告,可以使用 go tool cover -func 命令来输出每个函数的覆盖率百分比,或者使用 go tool cover -html 命令来生成一个 HTML 文件,在浏览器中查看每一行代码是否被覆盖到。eg:
$ go tool cover -func cover.out example/calc.go:Add 100.0% example/calc.go:Mul 100.0% total: (statements) 100.0% 在开发中,一般测试率在50%-80%之间,虽然是越高越好,但100%往往是一个理想化的目标。