1.testing模块
testing包提供了自动化测试相关的框架
- 支持单元测试和压力测试
2.Go中的测试约定
- 用来测试的代码必须以
_test.go结尾
- 单元测试的函数名必须以
Test开头,并且只有一个参数,类型是*testing.T
- 单元测试函数名
Test后必须紧跟着大写,比如:TestAdd
- 基准测试或压力测试必须以
Benchmark开头,并且只有参数*testing.B
3.Go test命令介绍
go test packageName:执行这个包下面的所有测试用例
go test 加测试源文件,执行这个测试源文件里的所有测试用例
go test -run选项,执行指定的测试用例
go test -banch .执行当前路径下的所有压力测试
go test -banch BenchmarkAdd对BenchmarkAdd这个函数执行压力测试
2.devel工具介绍
1.介绍
- 追踪程序中的异常代码
- 通过打印日志的方式,追查问题效率比较低
devel是一种工具,直接分析程序执行的情况
2.安装
cd $GOPATH/src/
git clone https://github.com/derekparker/delve.git
cd delve/cmd/dlv/
go build
go install
3.简单使用
// delvetest/main.go
package main
import "fmt"
func Add(x, y int) int {
return x + y
}
func main() {
a := 100
b:=200
c := Add(a, b)
fmt.Println(c)
}
F:\self_project\golearn\src\dcpuffer\delvetest>dlv debug main.go
(dlv)b main.main // break 包名:包里面的mian函数名
(dlv)c
(dlv)next
(dlv)p 变量名
(dlv)r
(dlv)s
(dlv)q
4.调试正在运行的程序
1. dlv attach 进程id
package main
import (
"fmt"
"time"
)
func main() {
var i = 0
for {
var curTime time.Time
time.Sleep(5 * time.Second)
i++
curTime = time.Now()
fmt.Printf("run %d count, cur time: %v\n", i, curTime)
}
}
F:\self_project\golearn\src\dcpuffer\delvetest>dlv attach 105252
(dlv) b main.go:13
(dlv) c
(dlv) next
(dlv) p i
(dlv) q
2.多线程调试
package main
import (
"fmt"
"time"
)
func isPrime(n int) bool {
if n <= 1 {
return false
}
for i := 2; i < n; i++ {
if n % i == 0 {
return false
}
}
return true
}
// 生产素数
func produceSushu(c chan int) {
i := 1
for {
result := isPrime(i)
if result {
c <- i
}
time.Sleep(time.Second)
i++
}
}
func consumeSushu(c chan int) {
for v := range c {
fmt.Printf("%d is prime\n", v)
}
}
func main() {
// 声明一个容量为1000的整形队列
var intChan chan int = make(chan int, 1000)
go produceSushu(intChan) // go 开启一个线程
go consumeSushu(intChan)
time.Sleep(time.Hour)
}
F:\self_project\golearn\src\dcpuffer\delvetest>dlv debug main.go
(dlv)
(dlv) b produceSushu
(dlv) c
(dlv) next
(dlv) goroutines
(dlv) goroutine 线程编号
(dlv) bt