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是一个非常强大且易于使用的工具,它可以帮助开发者确保他们的代码质量,并通过可视化的覆盖率报告了解哪些部分可能需要更多的测试。


The cover story

posted @ 2024-12-06 15:38  guanyubo  阅读(35)  评论(0编辑  收藏  举报