4go语言单元测试性能测试与监控(代码片段)

行走的皮卡丘 行走的皮卡丘     2022-12-02     427

关键词:


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

1、单元测试

1.1 单元测试简介

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

1.2 testing的使用

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

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

1.3 案例

文件目录

源码文件/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耗时

如何通过单元测试最好地监控性能?

】如何通过单元测试最好地监控性能?【英文标题】:HowcanIbestmonitorperformancewithunittests?【发布时间】:2010-07-2323:53:50【问题描述】:我已经开始为我的代码编写更多的单元测试(我应该做更长的时间),并使用EQATEC等代码分析... 查看详情

redis性能测试与监控(代码片段)

...就没有对redis的配置和部署等有效性和高可用性进行性能测试最终导致上线出现缓存穿透、雪崩等现象,导致性能还是有问题,其实做为技术运维人员在部署好redis后可以使用redis自带的压测工具进行简易型压测,如下命令:redis... 查看详情

golang单元测试与性能测试(代码片段)

Go自带了测试框架和工具,在testing包中,以便完成单元测试(T类型)和性能测试(B类型)。一般测试代码放在*_test.go文件中,与被测代码放于同一个包中。单元测试测试函数名称格式是:Test[^a-z],即以Test开头,跟上非小写字... 查看详情

springboot2单元测试和指标监控(代码片段)

单元测试1、JUnit5的变化SpringBoot2.2.0版本开始引入JUnit5作为单元测试默认库作为最新版本的JUnit框架,JUnit5与之前版本的Junit框架有很大的不同。由三个不同子项目的几个不同模块组成。JUnit5=JUnitPlatform+JUnitJupiter+JUnitVi... 查看详情

实验单元测试(代码片段)

...义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元 查看详情

实验五单元测试(代码片段)

...义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Jav 查看详情

实验五单元测试(代码片段)

...义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件 查看详情

实验单元测试(代码片段)

...义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以值一个窗口或一个菜单等。 查看详情

实验五单元测试(代码片段)

...义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以 查看详情

实验五单元测试(代码片段)

...义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以值一个窗口或一个菜单等。总的来说,单 查看详情

性能测试之redis和nginx性能监控(代码片段)

...另外一种是图形化页面查看。但是实际上,我们性能测试主要更多的是关注性能测试指标本身。首先,我们来查看一下命令行模式。----infoinfo命令展 查看详情

jmeter+influxdb+grafana性能测试监控(代码片段)

...讨论Jmeter+InfluxDb+Grafana的监控,于是,为了有一个漂亮的测试报告,就手动开始进行部署。安装步骤:1、influxdb下载安装:  [[email protected]~]# wgethttps://dl.influxdata.com/influxdb/releases/influxdb-1.7.0 查看详情

springboot2-数据访问单元测试指标监控原理解析(代码片段)

参考自尚硅谷语雀springboot2教程文档springboot2-数据访问、单元测试、指标监控、原理解析一、[数据访问](https://www.yuque.com/atguigu/springboot/aob431)一、连接MySql1、数据源的自动配置-HikariDataSource1.1导入JDBC场景2、自动配置原理2.1.自动... 查看详情

性能测试入门-jmeter工具与监控全方位打造

...目的,想做好性能测试都需要掌握哪些方面的技能(开发语言、操作系统、网络、工具等)。性能测试、稳定性、压力、疲劳、容量预估、多并发逻辑。掌握如何开始性能测试,并且掌握在性能测试中每个部分的工作重点,了解软... 查看详情

性能测试:java线程监控(代码片段)

Java线程的五种状态:新建:new运行:runable等待:waitting(无限期等待),timedwaitting(期限等待)阻塞:blocked结束:terminatedJava线程监控-Jvisualvm图形界面工具,监控 查看详情

性能测试流程(超级详细)(代码片段)

性能测试:利用工具模拟大量用户操作,验证系统承受的负载情况。性能测试的目的:找到潜在的性能问题或瓶颈,分析并解决;找出性能变化趋势,为后续扩展系统提供参考。测试监控:基准测试、... 查看详情

go语言学习笔记—基础—go工具(5.1):单元测试——测试和验证代码的框架(代码片段)

...元进行检查和验证。对于单元测试中单元的含义,如C语言中指一个函数,Java中指一个类,图形化软件中指一个窗口或菜单等。总的来说,单元是认为规定的最小可测试功能模块,单元测试是在软件开发过程中... 查看详情

go-单元测试详解与代码(代码片段)

目录概述Go的单元测试基础知识快速入门进阶单个文件的测试单个函数的测试单元测试覆盖率参考概述常言道,不会测试的程序猿不是好的产品经理!!!现在越来越多测试和运维的工作也需要研发来做了,本... 查看详情