Go 常见 Test

简介: Go语言中的测试方法主要分为三种类型:单元测试、基准测试和示例测试。首先:你需要先导入testing包。在包目录中,所有后缀为*_test.go的源代码文件都是go test测试的一部分,并且不会被go build编译到最终的可执行文件中。

本文翻译自我的英文博客,最新修订内容可随时参考:Go Common Test

Go语言中的测试方法主要分为三种类型:单元测试、基准测试和示例测试。

首先:

  1. 你需要先导入testing包。
  2. 在包目录中,所有后缀为*_test.go的源代码文件都是go test测试的一部分,并且不会被go build编译到最终的可执行文件中。

单元测试

基本格式/签名为:

func TestXxx(t *testing.T) {
   
    // ...
}

将_test.go和.go文件放在同一目录下,运行go test -v可以详细执行测试,运行go test -cover可以检查测试覆盖率。

基准测试

基准测试默认不会执行,你需要使用go test -bench=Xxx来执行基准测试。

基本格式/签名为:

func BenchmarkXxx(b *testing.B) {
   
    for i := 0; i < b.N; i++ {
   
        // ...
    }
}

b.N是测试运行的次数,这个值由go test工具自动调整。

    BenchmarkSplit-8        10000000               215 ns/op
  • -8表示测试在8个GOMAXPROCS上运行
  • 10000000表示测试运行了10000000次
  • 215 ns/op表示每次操作平均耗时215纳秒

go test -bench=Xxx -benchmem可以检查内存分配和每次操作的分配次数。

    BenchmarkSplit-8        10000000               215 ns/op             112 B/op          3 allocs/op
  • 112 B/op表示每次操作分配112字节
  • 3 allocs/op表示每次操作分配3次

性能比较

// 注意:这里的n是Fib函数的参数,而不是b.N,b.N是测试运行的次数,由go test工具自动调整。
func benchmarkFib(b *testing.B, n int) {
   
    for i := 0; i < b.N; i++ {
   
        Fib(n)
    }
}

func BenchmarkFib1(b *testing.B)  {
    benchmarkFib(b, 1) }
func BenchmarkFib2(b *testing.B)  {
    benchmarkFib(b, 2) }
func BenchmarkFib3(b *testing.B)  {
    benchmarkFib(b, 3) }

go test -bench=.会对所有以Benchmark为前缀的函数执行基准测试。

func BenchmarkSplit(b *testing.B) {
   
    time.Sleep(5 * time.Second) // 一些耗时操作
    b.ResetTimer()              // 重置计时器(忽略上面的时间)
    for i := 0; i < b.N; i++ {
   
        // 一些耗时操作
    }
}

// 你也可以使用这种方法

func BenchmarkSplit(b *testing.B) {
   
    b.StopTimer()
    // 一些耗时操作
    b.StartTimer()
    for i := 0; i < b.N; i++ {
   
        // 一些耗时操作
    }
}

并行测试

签名:

func BenchmarkSplitParallel(b *testing.B) {
   
    // b.SetParallelism(1) // 设置使用的CPU数量
    b.RunParallel(func(pb *testing.PB) {
   
        for pb.Next() {
   
            // 一些耗时操作
        }
    })
}

示例测试

签名:

func ExampleName() {
   
    // 无参数和返回值
}
目录
相关文章
|
4月前
|
测试技术 程序员 Go
Go语言测试简明指南:深度解读go test命令
总的来说,go test是 Go 语言中一个强而有力的工具,每个 Go 程序员都应该掌握并把它融入到日常的开发和调试过程中。就像是一个眼镜过滤出的太阳,让我们在宽阔的代码海洋中游泳,而不是淹没。用好它,让我们的代码更健壮,让我们的生产力更强效。
233 23
|
测试技术 Go 开发者
掌握 go test 命令,写出可信赖的代码
掌握 go test 命令,写出可信赖的代码
254 0
|
测试技术 Go Cloud Native
Go test 单元测试用起来
单元测试,是指对软件中的最小可测试单元进行检查和验证
|
测试技术 API Go
|
Go
GO语言学习笔记(四) - 测试 go test
GO语言学习笔记(四) - 测试 go test 测试程序规则 测试程序文件必须以_test.go结尾规则是被测试文件的文件名+_test.go例:被测试文件是 bs.go,那么测试文件名应该是bs_test.
1180 0
|
关系型数据库 测试技术 Go
|
测试技术 Go 应用服务中间件
|
8月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
8月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
2月前
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。