首页 > 其他分享 >go单元测试

go单元测试

时间:2023-08-25 16:56:09浏览次数:31  
标签:pprof 单元测试 test go mem cpu out

目录

go test

介绍

1.go test 命令会自动执行_test.go结尾的源码内以Test开头的函数 生成可测试用的执行文件
2.不需要main函数作为入口函数
3.不会参与到正常源码编译
4.执行go test 需要切换目录到存在该文件的同级目录下

语法

go test
    -bench:性能测试(.:表示匹配所有测试函数)
    	eg: go test -v -bench="." -cpu=8 -benchtime="3s" -timeout="5s" -benchmem
    	ps: windows输出的信息不全
    -cpu: 指定GOMAXPROCS
    -benchtime: 测试时长
    -benchmem: 输出内存分配(申请内存次数)
    -timeout: 超时时间
    -blockprofile block.out: 协程阻塞数据写入到block.out 
    -cpuprofile cpu.out: 协程cpu使用数据写入到cpu.out
    -memprofile mem.out: 协程内存申请数据 写入到mem.out
    -mutexprofile mutex.out: 协程互斥数据写入到mutex.out
    -track track.out: 执行调用链写入到track.out
    -v: 显示测试的详情
    -run: 运行特定测试样例中的函数
    	eg: go test -run Test开头的函数名 *_test.go
    	
ps:windows: -bench="." | linux: -bench=.

高级用法

1. 使用go test 做性能测试输出cpu、mem占用信息文件
go test -bench="." -cpuprofile cpu.out  // cpu占用情况
go test -bench="." -cpuprofile mem.out  // mem占用情况

2.1 使用go tool pprof 分析实际cpu、mem情况(pprof性能调试工具 生成相关数据图例)
go tool pprof -text cpu.out
go tool pprof -text mem.out

2.2 生成svg或pdf 文件报告形式查看
go tool pprof -svg cpu.out > cpu.svg
go tool pprof -pdf cpu.out > cpu.pdf
ps: 前置需要下载安装graphviz并配置环境变量(https://graphviz.org/download/) 否则上面命令会报错导出失败

3. 也可以使用runtime/pprof脚本直接生成cpu.out|mem.out 再通过2.2命令生成报告
参考-脚本化生成测试报告数据

4. 交互式分析
go tool pprof cpu.out
ps:交互模式输入web指令后会生成可视化svg文件用于查看

5. 网页形式查看测试报告
参考-网页形式查看测试报告

go test 实例

package daily

import "testing"

func TestRedisOp(t *testing.T) {
	/**
	文件命名规范: *_test.go
	函数名命名规范: Test开头
	*testing.T相关方法:
        Log:输出信息
        Fail:标记失败 继续执行测试
        FailNow:失败 立即终止测试
        Error: Fail + Log
        Fatal: FailNow + Log
	*/
	num := 0
	for i := 0; i < 100000000; i++ {
		num += i
	}
	t.Log("go test...")
}


脚本化生成测试报告数据

package daily

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

var (
	wg sync.WaitGroup
)

func taskRun() {
	/**
	实际执行的业务逻辑
	 */
	var sum int
	for i := 0; i < 100000000; i++ {
		sum += i
	}
}

func GeneratePprof() {
	wg.Add(2)
    // 1. 生成cpu.out
	go func() {
		defer wg.Done()
		f, _ := os.Create("cpu.out")
		defer f.Close()
		pprof.StartCPUProfile(f)
		defer pprof.StopCPUProfile()
		taskRun()
	}()
	// 2. 生成mem.out
	go func() {
		defer wg.Done()
		f, _ := os.Create("mem.out")
		defer f.Close()
		defer pprof.WriteHeapProfile(f)
		taskRun()
	}()
	wg.Wait()
	fmt.Println("GeneratePprof执行结束...")
    // 后续可采用go tool pprof -pdf cpu.out > cpu.pdf 命令 分析查看整体执行流程
}

网页形式查看测试报告

1. 分析mem占用情况
go tool pprof http://localhost:9999/debug/pprof/heap?seconds=10

2. 分析cpu占用情况(默认30s)
go tool pprof http://localhost:9999/debug/pprof/profile
package daily

import (
	"fmt"
	"net/http"
	_ "net/http/pprof"
	"time"
)


func taskRun() {
	/**
	实际执行的业务逻辑
	*/
	var sum int
	for i := 0; i < 100000000; i++ {
		sum += i
	}
}

func PprofWeb() {
	http.HandleFunc("/unitTest", func(writer http.ResponseWriter, request *http.Request) {
		/**
		实际业务处理
		*/
		t := time.Now()
		taskRun()
		cost := time.Since(t)
		fmt.Fprint(writer, "unitTest调用耗时:", cost)
	})
	if err := http.ListenAndServe(":9999", nil); err != nil {
		panic(err)
	}
}

标签:pprof,单元测试,test,go,mem,cpu,out
From: https://www.cnblogs.com/fsh19991001/p/17657370.html

相关文章

  • CEF4Delphi(DELPHI Google Chrome 浏览器封装) 折腾 (2)--打开一个网页
      打开网页的,折腾了好久,试运行DEMO,就行,把DELPHI的代码抄过来,就是不行,然后把自己弄的控件名称搞的与DEMO一样,属性全对一样了,还是不行,郁闷很久后,才发现工程文件里面还要加代码。 我的工程名为:OpenChrome 选中工程文件后按CTRL+V,然后做以下修改:下面红色的代码是CEF4中需要......
  • django配置swagger自动生成接口文档以及自定义参数设置
    首先安装swagger所用的包pipinstalldrf-yasg然后再settings.py中注册app     接口采用的token认证,在settings.py配置认证方式SWAGGER_SETTINGS={'USE_SESSION_AUTH':False,'SECURITY_DEFINITIONS':{......
  • CEF4Delphi(DELPHI Google Chrome 浏览器封装) 折腾 (1)--安装
    1、下载:https://github.com/salvadordf/CEF4Delphi/tree/master2、安装包:CEF4Delphi-master\packages目录中,如果不行,全部包都编译一下。3、下载运行环境:地址到 https://github.com/salvadordf/CEF4Delphi/tree/master中能查的到 Windows32bitsWindows64bitsLinux......
  • 测试神器!RunnerGo让你的测试工作更高效!
    引言:在软件开发领域,测试是非常重要的一环。然而,传统的测试工具往往复杂且难以使用,让测试工作变得异常繁琐。为了解决这一问题,我们迎来了RunnerGo——一款轻量级、全栈式的测试平台,让你的测试工作更加高效!一、RunnerGo是什么?RunnerGo是一款基于Go语言研发的轻量级测试平台,支持接口管......
  • Go-函数
    1函数的概念在golang语言中为完成某一功能的程序指令(语句、代码)的集合称为函数;在golang中,函数分为自定义函数、系统函数2函数的基本语法func函数名(形参列表)(返回值类型列表){ 函数体 return返回值列表}//形参列表---表示函数的输入//函数体---为了实现某一功能......
  • Mongodb数据库基于spring-boot-starter-data-mongodb的查询工具
    /***字段注解*/public@interfaceBuilderField{/***对应的数据库字段名称*@return*/Stringname();}importlombok.SneakyThrows;importjava.io.Serializable;importjava.lang.invoke.SerializedLambda;importjava.lang.reflec......
  • go开发环境
    目录Go环境环境下载安装常规命令goModule命令go实例Go环境环境下载安装#下载地址:https://golang.google.cn/dl/windows: go1.20.5.windows-amd64.msi:安装版安装流程中可添加环境变量全局使用 go1.20.5.windows-amd64.zip:免安装解压即可用全局使用需添加环境变量Linux......
  • php mongodb操作类,适合mongodb2.x和mongodb3.x
    在别人基础上修改的mongodb操作类,适合mongodb2.x和mongodb3.x<?php/***Mongodb类**examples:*$mongo=newHMongodb("127.0.0.1:11223");*$mongo->selectDb("test_db");*创建索引*$mongo->ensureIndex("test_table",array(&q......
  • 如何在leangoo免费敏捷工具中批量设置成员权限
    ​Leangoo领歌是一款永久免费的专业敏捷开发管理工具,提供端到端敏捷研发管理解决方案,涵盖敏捷需求管理、任务协同、进展跟踪、缺陷管理、统计度量等。包括小型团队敏捷开发,规模化敏捷SAFe,ScrumofScrums大规模敏捷。其功能/解决问题的价值包括:1)能够支持多种场景,如:敏捷研发管理......
  • 创建第一个Django app-part5
    自动化测试开始第一个测试首先有一个bugpython3manage.pyshell创建一个测试来暴露这个bug将下面的代码写入polls应用里的tests.py文件内点击查看代码fromdjango.testimportTestCase#Createyourtestshere.importdatetimefromdjango.utilsimporttim......