Go语言学习之旅 | 青训营笔记

60 阅读2分钟

Go语言是一种支持并发和垃圾回收的编译型语言,它提供了一套简单而强大的测试工具,可以帮助开发者编写高质量的代码。本文将介绍Go语言的三种测试方式:单元测试性能测试覆盖率测试

  • 单元测试:单元测试是对程序中的最小可测试单元进行检验,通常是一个函数或一个方法。Go语言的标准库提供了 testing 包,可以方便地编写和运行单元测试。要编写一个单元测试,只需要创建一个以 _test.go 结尾的文件,定义一个以 Test 开头的函数,接受一个 *testing.T 类型的参数,然后使用 t.Errort.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%往往是一个理想化的目标。