文章目录
测试文件的命名单元测试子测试集子测试组
性能测试简单测试并发性能性能对比设置 cpu 数量, 清除耗时
测试前后加操作全局前后增加操作 - TestMain单一用例前后增加操作 - setup 和 teardown
运行测试单元测试基准测试
练习 - 回文判断
下面展示的所有示例中代码都在这里
测试文件的命名
xxx_test.go比如测 split.go 文件, 命名就为 split_test.go
单元测试
子测试集
package split
import (
"reflect"
"testing"
)
func TestSplit(t
*testing
.T
) {
get
:= Split("a:b:c", ":")
want
:= []string{"a", "b", "c"}
if ok
:= reflect
.DeepEqual(get
, want
); !ok
{
t
.Fatalf("期望结果: %v, 实际结果: %v\n", want
, get
)
}
}
func TestNoneSplit(t
*testing
.T
) {
get
:= Split("a:b:c", "|")
want
:= []string{"a:b:c"}
if ok
:= reflect
.DeepEqual(get
, want
); !ok
{
t
.Fatalf("期望结果: %v, 实际结果: %v\n", want
, get
)
}
}
func TestMulitiSplit(t
*testing
.T
) {
get
:= Split("abcabcabca", "bc")
want
:= []string{"a", "a", "a", "a"}
if ok
:= reflect
.DeepEqual(get
, want
); !ok
{
t
.Fatalf("期望结果: %v, 实际结果: %v\n", want
, get
)
}
}
子测试组
package split
import (
"reflect"
"testing"
)
func TestGroupSplit(t
*testing
.T
) {
type test
struct {
str
string
sep
string
want
[]string
}
tests
:= map[string]test
{
"normal": test
{
str
: "a:b:c",
sep
: ":",
want
: []string{"a", "b", "c"},
},
"none": test
{
str
: "a:b:c",
sep
: "-",
want
: []string{"a:b:c"},
},
"multi": test
{
str
: "a::b::c",
sep
: "::",
want
: []string{"a", "b", "c"},
},
"multi2": test
{
str
: "1231",
sep
: "1",
want
: []string{"", "23", ""},
},
}
for k
, v
:= range tests
{
t
.Run(k
, func(t
*testing
.T
) {
r
:= Split(v
.str
, v
.sep
)
if !reflect
.DeepEqual(r
, v
.want
) {
t
.Errorf("excepted: %#v, get: %#v", v
.want
, r
)
}
})
}
}
性能测试
简单测试
package split
func BenchmarkSplit(b
*testing
.B
) {
for i
:= 0; i
< b
.N
; i
++ {
Split("a:b:c", ":")
}
}
并发性能
package split
func BenchmarkSplitParallel(b
*testing
.B
) {
b
.RunParallel(func(pb
*testing
.PB
) {
for pb
.Next() {
Split("1231", "1")
}
})
}
性能对比
package fib
import "testing"
func benchmarkFib(b
*testing
.B
, n
int) {
for i
:= 0; i
< b
.N
; i
++ {
Fib(n
)
}
}
func BenchmarkFib2(b
*testing
.B
) {
benchmarkFib(b
, 2)
}
func BenchmarkFib20(b
*testing
.B
) {
benchmarkFib(b
, 20)
}
func BenchmarkFib100(b
*testing
.B
) {
benchmarkFib(b
, 200)
}
设置 cpu 数量, 清除耗时
b
.SetParallelism(1)
b
.ResetTimer()
测试前后加操作
全局前后增加操作 - TestMain
func TestMain(m
*testing
.M
) {
fmt
.Println("start test...")
r
:= m
.Run()
fmt
.Println("end test...")
os
.Exit(r
)
}
单一用例前后增加操作 - setup 和 teardown
package split
func TestMultiSplit(t
*testing
.T
) {
f
:= setupT(t
)
defer f(t
)
get
:= Split("a::b::c", "::")
want
:= []string{"a", "b", "c"}
if ok
:= reflect
.DeepEqual(get
, want
); !ok
{
t
.Fatalf("期望结果: %v, 实际结果: %v\n", want
, get
)
} else {
t
.Log("pass test...")
}
}
func setupT(t
*testing
.T
) func(t
*testing
.T
) {
t
.Log("start test...")
return func(t
*testing
.T
) {
t
.Log("end test...")
}
}
运行测试
单元测试
go
test -v
go
test -run
=None -v
go
test -run Split/None -v
go
test -cover
go
test -cover -coverprofile
=c.out
go tool cover -html
=c.out
cover: cannot run go list: fork/exec /usr/local/go/bin/go: no such
file or directory
基准测试
go
test -bench
=.
go
test -bench
=Split -cpu
=2 -benchmem
"""
结果展示:
goos: darwin
goarch: amd64
pkg: code.oldboy.com/split
# 使用了 4 个 cpu 测试次数 每次操作消耗时间 每次操作占用字节数 每次操作申请内存次数
BenchmarkSplit-4 3000000 420 ns/op 112 B/op 3 allocs/op
PASS
ok code.oldboy.com/split 1.710s
"""
练习 - 回文判断
palindrome.go
package palindrome
import (
"fmt"
"unicode"
)
func isPalindrome(s
string) bool {
var letters
[]rune
for _, l
:= range s
{
if unicode
.IsLetter(l
) {
newL
:= unicode
.ToLower(l
)
letters
= append(letters
, newL
)
}
}
l
:= len(letters
)
for i
:= 0; i
< l
/2; i
++ {
if letters
[i
] != letters
[l
-i
-1] {
return false
}
}
return true
}
palindrome_test.go
package palindrome
import (
"reflect"
"testing"
)
func TestIsPalindrome(t
*testing
.T
) {
type test
struct {
str
string
want
bool
}
tests
:= map[string]test
{
"normal": test
{
str
: "abcba",
want
: true,
},
"withXx": test
{
str
: "a:ba",
want
: true,
},
"chinese": test
{
str
: "油灯少灯油",
want
: true,
},
}
for name
, v
:= range tests
{
t
.Run(name
, func(t
*testing
.T
) {
r
:= isPalindrome(v
.str
)
if !reflect
.DeepEqual(r
, v
.want
) {
t
.Errorf("excepted: %#v, get: %#v", v
.want
, r
)
}
})
}
}