IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> golang 单元测试和性能测试 -> 正文阅读

[开发测试]golang 单元测试和性能测试

单元测试

  • 单元测试(Unit Tests, UT) 是一个优秀项目不可或缺的一部分,特别是在一些频繁变动和多人合作开发的项目中尤为重要。你或多或少都会有因为自己的提交,导致应用挂掉或服务宕机的经历。比如我就曾经就因为打印了sql,而忘记关闭,导致所有的接口异常(允悲)。还有就是如果你优化了一些代码逻辑,优化了某个函数。那么我们怎么保证我们的正确性呢?那么几个测试用例或许就可以解决这个问题。

测试文件的命名

  • go语言是支持单元测试的,测试文件是_test.go结尾的文件名

测试用例的命名

  • 测试用例名称一般命名为 Test 加上待测试的方法名。比如TestAdd(),测试用的参数有且只有一个,在这里是 t *testing.T

简单入门

  • 我们来写一个Add函数,创建文件add.go
package main

import "fmt"

func main() {
	sum := Add(1, 2)
	fmt.Println(sum)
}

func Add(a int, b int) int {
	return a + b
}

  • 我们在add.go目录下创建一个add_test.go的测试文件
package main

import (
	"testing"
)

func TestAdd(t *testing.T) {
	testData := []struct {
		a int
		b int
		c int
	}{
		{1, 2, 3},
		{4, 5, 9},
		{50, 5, 5},
	}
	ans := 0
	for _, data := range testData {
		if ans = Add(data.a, data.b); ans != data.c {
			t.Errorf("%d + %d expected %d,but %d got", data.a, data.b, data.c, ans)
		}
	}

}

我们先来认识一下ide调试工具,当然这些调试我们在命令也是可以运行的

  • Run 执行脚本

  • Debug 开启Debug模式

  • coverprofile 代码覆盖率

  • CPU Profiler cup分析

  • Memory Profiler 内存分析 对象、堆的分析和内存泄漏等

  • Blocking Profiler 记录 goroutine的阻塞情况,等待和同步情况,timer/channel通讯等各项细节

  • Mutex Profiler 互斥锁分析,包括各种竞争情况
    在这里插入图片描述

  • 我通过ide运行一下
    在这里插入图片描述

  • 我们也可以使用ide的debug功能打断点调试
    在这里插入图片描述

  • 命令行测试,首先我们进入add.go目录
    在这里插入图片描述

代码覆盖率

  • IDE调试
    在这里插入图片描述
  • 我们使用命令行再试一下
zhangguofu@zhangguofudeMacBook-Pro add (master) $ go test -coverprofile=c.out 
--- FAIL: TestAdd (0.00s)
    add_test.go:20: 50 + 5 expected 5,but 55 got
FAIL
coverage: 33.3% of statements
exit status 1
FAIL    goapp/src/learngo/add   0.502s
zhangguofu@zhangguofudeMacBook-Pro add (master) $ ls
add.go      add_test.go c.out
zhangguofu@zhangguofudeMacBook-Pro add (master) $ cat c.out
mode: set
goapp/src/learngo/add/add.go:5.13,8.2 2 0
goapp/src/learngo/add/add.go:10.28,12.2 1 1


我们发现多了一个c.out 文件,但是里面的内容我们看不太懂,我们借助工具go tool cover ,查看代码覆盖的相关命令帮助
在这里插入图片描述
我们使用` go tool cover -html=c.out``,此时会打开一个html页面,上面标注了我们代码覆盖的情况
在这里插入图片描述

性能测试

  • 我们通过一个获取最长不重复字符串函数来测试一下性能
  • 函数代码 在add.go文件中
/**
最大字符串不重复
*/
func Repeat(s string) int {
	//保持最大不重复串
	lastOccur := make(map[string]int)
	start := 0
	max := 0
	for k, v := range []rune(s) {
		if index, ok := lastOccur[string(v)]; ok && start <= index {
			start = index + 1
		}
		if max < k-start+1 {
			max = k - start + 1
		}
		lastOccur[string(v)] = k
	}
	return max
}
  • 性能测试代码 在add_test.go文件中
func BenchmarkRepeat(b *testing.B) {
	str := "不经历风雨,怎么见彩虹?没有人能随随便便成功"
	data := struct {
		content string
		res     int
	}{
		str,
		17,
	}
	for i := 0; i < b.N; i++ {
		if len := Repeat(data.content); len != 17 {
			b.Error("the program is wrong")
		}
	}
}

在这里插入图片描述

  • 结果是3ms左右,我们加长一点看看
func BenchmarkRepeat(b *testing.B) {
	str := "不经历风雨,怎么见彩虹?没有人能随随便便"

	for i := 0; i < 20; i++ {
		str += str
	}

	b.Logf("the len of str is %d", len(str))
	b.ResetTimer() //忽略上面的计算时间
	for i := 0; i < b.N; i++ {
		Repeat(str)
	}
}
  • 我们发现对于计算6m文件中的不重复字符串,程序执行了大概是16s左右,这个感觉很慢了,对不对,但是我们想看程序是时间花在哪里了
    在这里插入图片描述
  • 和代码覆盖率的命令类似。我执行命令
zhangguofu@zhangguofudeMacBook-Pro add (master) $ go test -bench . -cpuprofile  cpu.out
goos: darwin
goarch: amd64
pkg: goapp/src/learngo/add
BenchmarkRepeat-8              1        1541179761 ns/op
--- BENCH: BenchmarkRepeat-8
    add_test.go:33: the len of str is 62914560
PASS
ok      goapp/src/learngo/add   2.077s
zhangguofu@zhangguofudeMacBook-Pro add (master) $ ls
add.go      add.test    add_test.go c.out       cpu.out
zhangguofu@zhangguofudeMacBook-Pro add (master) $ less cpu.out  
"cpu.out" may be a binary file.  See it anyway? 

发现生成的cpu.out 是一个二进制文件,我们使用go tool pprof cpu.out 查看,进入交互模式
在这里插入图片描述
我输入web格式的,报错说需要安装Graphviz ,那就安装吧 下载地址 如果安装失败 可以参考我这篇文章解决brew 安装软件失败的问题

  • 再次输入go tool pprof cpu.out 输入web
    没有报错了,但是此处我碰到一个个问题。就是我的虚拟机(mac上面装的win10)会默认打开svg 文件,很烦人
    解决方式
    在这里插入图片描述
    并且设置谷歌浏览器为默认打开方式

在这里插入图片描述

  • 最终,我们打开了这个文件,这里面箭头越粗,代表花费的时间越长,我们可以根据结果 对我们的程序进行优化,比如在这里,我们看到是string encode decode 很浪费时间,那么我们是不是可以选择更合适的数据类型来存储我们的数据呢,比如我们存的是 abc我爱中国 ,那么再计算中,来回转换是很麻烦的,我们是不是可以转换为int32来计算呢。
    在这里插入图片描述
  • golang的单元测试和性能测试就先到这里了。喜欢可以点赞哦!!
  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-12-26 22:30:16  更:2021-12-26 22:32:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 4:18:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码