4、Go语言单元测试、性能测试与监控

在这里插入图片描述

1、单元测试

1.1 单元测试简介

单元测试用来检测某个模块、某个函数的执行结果是否正确,也因此能够实现监控代码质量。 Go语言中自带有一个轻量级的测试框架 testing,同时也自带了 go test 命令,可以通过这些工具来实现单元测试和性能测试。

1.2 testing的使用

go自带的testing单元测试框架使用要求:

  • 测试代码必须放在以_test.go结尾的文件中
  • 测试函数以Test为名称前缀
  • 命令go test会忽略以 _.开头的测试文件
  • 命令go build/install等正常编译操作会忽略测试文件

1.3 案例

文件目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bvsX5HzE-1648278050837)(../images/Golang/09-01.png)]

源码文件/hello/hello.go

package hello

import "fmt"

func Hello() string{
	return "world"
}

单元测试文件:/test/hello_test.go

package test

import (
	"TestGo/hello"
	"testing"
)

func Test_hello(t *testing.T){
	r := hello.Hello()
	if r != "world" {
		t.FailNow()
	}
}

运行测试文件:没有main方法也可以执行

# -v用于显示详细测试流程
go test -v test/hello_test.go 		

# 只执行Test_hello					
go test -v -run Test_hello test/hello_test.go 			

1.4 测试中一些函数的区别

  • Fail,Error:若测试失败,则测试会继续执行
  • FailNow,Fatal:若测试失败,则测试会终止

2、代码覆盖率

代码覆盖率命令:

go test -v -cover

3、断言库

使用一些第三方的断言库也可以达到原生的单元测试效果:

import "github.com/stretchr/testify/assert"
func Test_hello(t *testing.T){
	r := hello.Hello()
	assert.Equal("world")
}

4、BDD测试框架

常用的BDD测试框架https://github.com/smartystreets/goconvey

5、基准测试

5.1 基准测试简介

基准测试可以测试一段程序的运行性能及耗费CPU的程度。 性能测试函数以Benchmark为名称前缀,同样保存在*_test.go文件里。

5.2 基准测试案例

需要被基准测试的方法写为

func Benchmark_Hello(b *testing.B){
	
	// 开始测试性能相关代码
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		//  测试代码
	}

	// 结束性能测试
	b.StopTimer()
}

测试

# win下命令为 -bench="-"  -bench=.表示运行后面文件里的所有基准测试。
go test -v -bench=.  		# 添加参数 

常用参数:

-benchmem 			# 显示性能具体的开销情况
-benchtime=5s		# 自定义测试时间为5秒
-bench=Alloc		# 显示内存分配

6、性能监控

利用go的 runtime/pprof 包可以生成prof文件,用来查看go代码的运行情况,示例代码:

package main

import (
	"fmt"
	"os"
	"runtime/pprof"
)

func slowFunc(){

	str := "hello world "
	for i := 0; i < 5; i++ {
		str += str
	}
}

func main() {

	// 创建输出文件
	f, err := os.Create("cpu.prof")
	if err != nil {
		fmt.Println("create cpu.prof err :", err)
		return
	}
	// 获取系统信息
	if err := pprof.StartCPUProfile(f); err != nil {
		fmt.Println("start cpu.prof err :", err)
		return
	}
	defer pprof.StopCPUProfile()

	// 业务代码
	slowFunc()

	// 获取内存相关信息
	f1, err := os.Create("mem.prof")
	defer f1.Close()
	if err != nil {
		fmt.Println("create mem.prof err :", err)
		return
	}
	// runtime.GC()			// 是否获取最新的数据信息
	if err := pprof.WriteHeapProfile(f1); err != nil {
		fmt.Println("write cpu.prof err :", err)
		return
	}


	// 获取协程相关信息
	f2, err := os.Create("goroutine.prof")
	defer f2.Close()
	if err != nil {
		fmt.Println("create goroutine.prof err :", err)
		return
	}
	if gProf := pprof.Lookup("goroutine"); gProf != nil {
		fmt.Println("write goroutine.prof err :", err)
		return
	} else {
		gProf.WriteTo(f2, 0)
	}

	return
}

生成prof文件

# 生成程序的二进制文件
go build -o program main.go		// 此时会按照代码中的要求生成多份prof文件

# 查看prof文件
go tool pprof program cpu.prof

贴士:

  • 导入 "_ "net/http/pprof"包还可以实现以网页形式展示prof文件内容!
  • 程序执行前加上环境变量可以查看GC日志,如:GODEBUG=gctrace=1 go run main.go

7、常见的调优参数

常见调优参数:

  • Wall Time:程序运行的绝对时间、函数运行的绝对时间被阻塞的影响
  • CPU消耗时间
  • 内存分配
  • GC次数GC耗时

在这里插入图片描述

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
以下是十个免费的Web压力测试工具: 1. Apache JMeter:这是一个功能强大的开源工具,可用于模拟多种类型的负载,并通过测试结果生成详细的分析报告。 2. LoadUI:这是一个用户友好的开源工具,可用于通过图形化界面创建和运行压力测试,并提供实时监控和分析功能。 3. Gatling:这是一个基于Scala编写的开源工具,可用于创建高度可扩展的Web应用程序性能测试脚本,并提供实时的图表和报告。 4. Locust:这是一个用Python编写的开源工具,可用于编写负载测试脚本,通过多个虚拟用户并发模拟真实场景。 5. Tsung:这是一个基于Erlang编写的开源工具,具有强大的性能和扩展性,可以模拟大量并发用户。 6. ApacheBench (ab):这是一个简单但功能强大的命令行工具,可用于发送并发请求并测量服务器的响应时间和吞吐量。 7. WebLOAD:这是一个功能全面的商业工具,提供轻松创建和运行大规模的压力测试,并提供详细的性能报告和分析。 8. Loader.io:这是一个基于云的免费工具,可快速创建和运行压力测试,通过虚拟用户模拟实际负载。 9. Siege:这是一个简单易用的命令行工具,可使用多线程并发发送请求,并提供实时性能度量。 10. Vegeta:这是一个基于Go语言开发的命令行工具,可用于生成随机负载并测量服务器的响应时间和吞吐量。 以上这些工具都可以通过其官方网站或开源社区进行下载和使用。无论您是在开发阶段还是在生产环境中测试性能,这些免费工具都是非常有帮助的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行走的皮卡丘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值