0


Go语言中的单元测试和基准测试

Go语言内建

testing

包,我们可以简单地通过

导入测试包

约定命名

ge test

快速完成单元测试的编写和执行。

注意:

go test

需要在Go模块下才能正常运行,否则会报下面这段错误:

go: go.mod file not found in current directory or any parent directory; see 'go help modules

不了解Go模块的,可以先看这篇文章 Go语言中的模块

下面我们测试

testing_ane_benchmarking.go

main

包下的

IntMin

函数。

testing_ane_benchmarking.go

文件具体内容如下:

package main

funcIntMin(a, b int)int{if a < b {return a
    }return b
}
  1. 创建测试文件

我们需要创建一个名字以被测试文件名(不含.go)为前缀,

_test.go

为后缀的文件,

go test

会自动寻找并执行遵循这类约定命名规则的文件。
如果

go test

没有找到这类文件,就会报

[no test files]

错误。
这里我们将测试文件命名为

testing_ane_benchmarking_test.go

  1. 创建一个简单的测试样例测试函数是否正常运行。

测试包提供两类错误输出函数:

Error

Fatal

Error

会报告测试错误并继续运行,而

Fatal

会报告测试错误并终止测试。它们都提供对应的格式化输出

Errorf

Fatalf

。下面使用

Errorf

做一个简单测试。

测试需要编写一个以

Test

为前缀且没有任何返回值的函数,

go test

会自动运行遵守这种命名规则的函数。

package main

import(// 导入测试包"testing")// 测试基本功能funcIntMinBasic(t *testing.T){
    ans :=IntMin(2,-2)if ans !=-2{// 错误格式化输出
        t.Errorf("IntMin(2, -2) = %d; want -2", ans)}}
  1. 测试覆盖率

在Go中,我们可以使用

go test -cover

来运行覆盖率分析,使用

go test -coverprofile

将覆盖率分析报告输出到文件中,如:

go test-coverprofile=c.out

上面命令会将报告输出到

c.out

文件中。

我们还可以用

go tool cover -html=c.out

打开一个网页显示详细的覆盖率报告,查看每一行代码是否被测试覆盖。

  1. 编写基准测试

基准测试同样需要写在以

_test.go

为后缀的文件中,函数名以

Benchmark

为前缀,运行

go test -bench=.

执行所有基准测试,如果只想运行特定基准测试则执行

go test -bench=funcname
package main

import(// 导入测试包"testing")// 单元测试代码// ...// 基准测试funcBenchmarkIntMin(b *testing.B){// 测试器会多次执行基准测试函数,每次执行都会增加b.N,直到收集到精确的测量值。for i :=0; i < b.N; i++{IntMin(1,2)}}

执行基准测试

go test-bench=.

测试结果

# 操作系统信息:macOS
goos: darwin
# 架构:arm64
goarch: arm64
# 基准测试运行所在的包
pkg: example.com/testing_and_benchmarking
# 基准测试名称:函数名BenchmarkIntMin,最大并发CPU为8
BenchmarkIntMin-8       
# 基准测试运行次数(也就是b.N的值):1000000000次;每次运行的平均时间:0.3175纳秒10000000000.3175 ns/op
# 测试通过:包名 + 测试总时间
PASS
ok      example.com/testing_and_benchmarking    0.485s

以上就是基本的测试内容,如果你想深入学习 Go 语言的测试知识,如表驱动测试和子测试等,可以学习Prefer table driven tests,Go 官方文档 和 Go 博客 上的相关文章。


本文转载自: https://blog.csdn.net/a2025834646/article/details/138388864
版权归原作者 CodeSingerAlex 所有, 如有侵权,请联系我们删除。

“Go语言中的单元测试和基准测试”的评论:

还没有评论