Go语言单元测试与断点调试

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.安装

  • 1.下载编译
cd $GOPATH/src/
git clone https://github.com/derekparker/delve.git
cd delve/cmd/dlv/
go build
go install
  • 2.将项目$GOPATH/bin/添加到环境变量

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)
}
  • 1.设置断点
F:\self_project\golearn\src\dcpuffer\delvetest>dlv debug main.go
(dlv)b main.main  // break 包名:包里面的mian函数名
  • 2.执行程序
(dlv)c
  • 3.下一步
(dlv)next
  • 4.查看变量值
(dlv)p 变量名
  • 5.重新执行
(dlv)r
  • 6.单步进入(遇到函数调用)
(dlv)s
  • 7.退出调试
(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)
    }
}
  • 1.开启调试
F:\self_project\golearn\src\dcpuffer\delvetest>dlv attach 105252
(dlv) b main.go:13
  • 2.执行
(dlv) c
  • 3.下一步
(dlv) next
  • 4.查看变量i的值
(dlv) p i
  • 5.退出
(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)
}
  • 1.开启调试
F:\self_project\golearn\src\dcpuffer\delvetest>dlv debug main.go
(dlv) 
  • 2.设置断点
(dlv) b produceSushu
  • 3.执行
(dlv) c
  • 4.下一步
(dlv) next
  • 5.查看当前程序有几个线程
(dlv) goroutines
  • 6.切换线程
(dlv) goroutine 线程编号
  • 7.查看当前线程堆栈信息
(dlv) bt
posted @ 2022-09-26 23:17  fatpuffer  阅读(862)  评论(0)    收藏  举报