单元测试
测试文件命名必须为*_test.go,单元测试函数的签名必须是func TestFoo(t *testing.T) {},基准测试函数签名必须是 func BenchmarkBar(b *testing.B) {}
testMe.go 为被测试的源文件 testMe_test.go 为测试代码,代码附在最后
执行单元测试
go test testMe.go testMe_test.go -v
执行指定方法的测试 -test.run TestS2
go test testMe.go testMe_test.go -test.run TestS2 -v
测试覆盖率 -cover 覆盖率 -v 展示详细信息 -count 执行次数 等于 1 可以避免测试缓存 timeout 超时设置
go test testMe.go testMe_test.go -cover -v -count=1 -timeout 15s
测试覆盖率生成文件
go test testMe.go testMe_test.go -cover -v -coverprofile=coverage.out
测试覆盖率生成的文件分析
go tool cover -func=coverage.out
测试覆盖率生成的文件网页分析
go tool cover -html=coverage.out
递归测试文件夹下所有 *_test.go
go test ./...
基准测试
benchmarkMe.go 为被测试的源文件 benchmarkMe_test.go 为测试代码,代码附在最后
执行基准测试 -bench=. 代表执行所有可运行的benchmark
go test -bench=. benchmarkMe.go benchmarkMe_test.go
执行指定方法的基准测试
go test -benchmem -bench=Benchmark30fibo1 benchmarkMe.go benchmarkMe_test.go
显示内存分配信息
go test -benchmem -bench=. benchmarkMe.go benchmarkMe_test.go
代码:
testMe.go
package testMe
func f1(n int) int {
if n == 0 {
return 0
}
if n == 1 {
return 1
}
return f1(n-1) + f1(n-2)
}
func f2(n int) int {
if n == 0 {
return 0
}
if n == 1 {
return 2
}
return f2(n-1) + f2(n-2)
}
func s1(s string) int {
if s == "" {
return 0
}
n := 1
for range s {
n++
}
return n
}
func s2(s string) int {
return len(s)
}
testMe_test.go
package testMe
import "testing"
func TestS1(t *testing.T) {
if s1("123456789") != 9 {
t.Error(`s1("123456789") != 9`)
}
if s1("") != 0 {
t.Error(`s1("") != 0`)
}
}
func TestS2(t *testing.T) {
if s2("123456789") != 9 {
t.Error(`s2("123456789") != 9`)
}
if s2("") != 0 {
t.Error(`s2("") != 0`)
}
}
func TestF1(t *testing.T) {
if f1(0) != 0 {
t.Error(`f1(0) != 0`)
}
if f1(1) != 1 {
t.Error(`f1(1) != 1`)
}
if f1(2) != 1 {
t.Error(`f1(2) != 1`)
}
if f1(10) != 55 {
t.Error(`f1(10) != 55`)
}
}
func TestF2(t *testing.T) {
if f2(0) != 0 {
t.Error(`f2(0) != 0`)
}
if f2(1) != 1 {
t.Error(`f2(1) != 1`)
}
if f2(2) != 1 {
t.Error(`f2(2) != 1`)
}
if f2(10) != 55 {
t.Error(`f2(10) != 55`)
}
}
benchmarkMe.go
package testMe
import (
"fmt"
)
func fibo1(n int) int {
if n == 0 {
return 0
} else if n == 1 {
return 1
} else {
return fibo1(n-1) + fibo1(n-2)
}
}
func fibo2(n int) int {
if n == 0 || n == 1 {
return n
}
return fibo2(n-1) + fibo2(n-2)
}
func fibo3(n int) int {
fn := make(map[int]int)
for i := 0; i <= n; i++ {
var f int
if i <= 2 {
f = 1
} else {
f = fn[i-1] + fn[i-2]
}
fn[i] = f
}
return fn[n]
}
benchmarkMe_test.go
package testMe
import (
"testing"
)
var result int
func benchmarkfibo1(b *testing.B, n int) {
var r int
for i := 0; i < b.N; i++ {
r = fibo1(n)
}
result = r
}
func benchmarkfibo2(b *testing.B, n int) {
var r int
for i := 0; i < b.N; i++ {
r = fibo2(n)
}
result = r
}
func benchmarkfibo3(b *testing.B, n int) {
var r int
for i := 0; i < b.N; i++ {
r = fibo3(n)
}
result = r
}
func Benchmark30fibo1(b *testing.B) {
benchmarkfibo1(b, 30)
}
func Benchmark30fibo2(b *testing.B) {
benchmarkfibo2(b, 30)
}
func Benchmark30fibo3(b *testing.B) {
benchmarkfibo3(b, 30)
}
func Benchmark50fibo1(b *testing.B) {
benchmarkfibo1(b, 50)
}
func Benchmark50fibo2(b *testing.B) {
benchmarkfibo2(b, 50)
}
func Benchmark50fibo3(b *testing.B) {
benchmarkfibo3(b, 50)
}
Go Mastering 学习笔记,把常用命令汇总在一起方便复习和日常使用。代码都是直接参照书上的0.0