Go语言进阶6 | 青训营笔记

110 阅读3分钟

这是我参与「第五届青训营」笔记创作活动的第16天

测试

单元测试与基准测试

Go 语言内置了单元测试和基准测试框架,方便开发人员编写、运行和管理测试用例,以确保代码的正确性和性能。

单元测试是指对代码的某个小部分进行测试,通常是函数或方法。在 Go 语言中,单元测试以 _test.go 文件名结尾,放在和被测试代码相同的包目录下。单元测试框架使用 testing 包提供的函数和方法来编写测试用例和测试逻辑。例如,我们可以使用 testing.T 类型的 Errorf() 方法来输出测试结果和错误信息。运行单元测试需要使用 go test 命令,Go 语言会自动搜索所有 _test.go 文件,并执行其中的测试函数,输出测试结果和统计信息。

基准测试是指对代码的性能进行测试,通常是对某个函数或方法的执行时间、内存占用等方面进行测试。在 Go 语言中,基准测试以 _test.go 文件名结尾,函数名以 Benchmark 开头,并使用 testing.B 类型的参数来提供测试数据和测试环境。基准测试框架使用 testing 包提供的函数和方法来编写基准测试用例和测试逻辑。例如,我们可以使用 testing.B 类型的 N 方法来获取测试数据的规模,使用 testing.B 类型的 ReportAllocs() 方法来报告内存分配情况。运行基准测试需要使用 go test 命令,并使用 -bench 参数来指定需要运行的基准测试函数,Go 语言会自动运行基准测试并输出测试结果和统计信息。

需要注意的是,在编写测试用例时,我们需要尽可能覆盖代码的各种情况和分支,以确保代码的正确性和鲁棒性。在编写基准测试时,我们需要使用足够的测试数据和测试环境,以确保测试结果的准确性和可靠性。同时,我们需要合理使用测试框架提供的各种函数和方法,以提高测试代码的可读性和可维护性。

package main

import (
    "testing"
)

// 被测试函数:计算两个整数之和
func add(x, y int) int {
    return x + y
}

// 单元测试:测试 add() 函数
func TestAdd(t *testing.T) {
    cases := []struct {
        name string
        x, y int
        want int
    }{
        {"case1", 1, 2, 3},
        {"case2", 2, 3, 5},
        {"case3", -1, 1, 0},
    }
    for _, c := range cases {
        got := add(c.x, c.y)
        if got != c.want {
            t.Errorf("%s failed, got=%d, want=%d", c.name, got, c.want)
        }
    }
}

// 基准测试:测试 add() 函数的性能
func BenchmarkAdd(b *testing.B) {
    for i := 0; i < b.N; i++ {
        add(1, 2)
    }
}

在上面的示例中,我们定义了一个 add() 函数,用于计算两个整数之和。然后,我们编写了一个单元测试 TestAdd(),使用 testing.T 类型的 Errorf() 方法来输出测试结果和错误信息。在单元测试中,我们定义了三个测试用例,分别测试了 add() 函数的三种情况。我们使用一个结构体切片 cases 来存储测试数据和期望结果,然后在循环中遍历所有测试用例,并执行测试逻辑。最后,我们使用 go test 命令来运行单元测试,Go 语言会自动搜索 *_test.go 文件,并执行其中的测试函数。

在示例中的基准测试 BenchmarkAdd() 中,我们使用 testing.B 类型的参数来提供测试数据和测试环境。在基准测试中,我们使用 for 循环来重复执行 add() 函数,以测试其性能。我们使用 go test 命令,并使用 -bench 参数来指定需要运行的基准测试函数,Go 语言会自动运行基准测试并输出测试结果和统计信息。