网站首页 > 技术文章 正文
之前写过了Go语言gorm框架MySQL实践,其中对gorm框架在操作MySQL的各种基础实践,下面分享一下如何使用gorm框架对MySQL直接进行性能测试的简单实践。
框架支持
这里我使用了一个原始的Go语言版本的FunTester测试框架,现在只有一个基本的方法,实在是因为Go语言特性太强了。框架设计的主要思路之一就是利用Go语言的闭包和方法参数特性,将一个func()当做性能测试的主题,通过不断运行这个func()来实现性能测试。当然还有另外一个思路就是运行一个多线程任务类,类似Java版本的com.funtester.base.constaint.ThreadBase抽象类,这样可以设置一些类的属性,绑定一些测试资源,适配更多的测试场景。
// ExecuteRoutineTimes
// @Description: FunTester性能测试执行框架
// @param fun 待执行方法
// @param times 次数
// @param thread 线程数
func ExecuteRoutineTimes(fun func(), t, r int) {
c := make(chan int) //确认所有线程都结束
key := false //用于控制所有线程一起结束
start := futil.Milli()
for i := 0; i < r; i++ {
go func() {
sum := 0
for i := 0; i < t; i++ {
if key {
break
}
fun()
sum++
}
key = true
c <- sum
}()
}
total := 0
for i := 0; i < r; i++ {
num := <-c
total += num
}
end := futil.Milli()
diff := end - start
//total := thread * times
log.Printf("总耗时: %f", float64(diff)/1000)
log.Printf("请求总数: %d", total)
log.Printf("QPS: %f", float64(total)/float64(diff)*1000.0)
}
select
下面演示select的性能测试,这里我用了随机ID查询的场景。
func TestSelectP(t *testing.T) {
execute.ExecuteRoutineTimes(func() {
var f Funtester
drive.Where("id = ?", futil.RangInt(35, 20000)).First(&f)
},1000,100)
}
delete
这里我使用从35开始递增的ID进行删除。
func TestDeleteP(t *testing.T) {
var index int32 = 35
execute.ExecuteRoutineTimes(func() {
id := atomic.AddInt32(&index, 1)
drive.Where("id = ?", id).Delete(&Funtester{})
},1000,100)
}
update
这里使用了select的用例部分,随机ID,然后更新name字段,随机10个长度的字符串。
func TestUpdateP(t *testing.T) {
execute.ExecuteRoutineTimes(func() {
drive.Where("id = ?",futil.RangInt(35, 20000)).Update("name",futil.RandomStr(10))
},1000,100)
}
inset
这里用到了FunTester字段都是随机生成。
func TestInsertP(t *testing.T) {
execute.ExecuteRoutineTimes(func() {
drive.Create(&Funtester{Name: futil.RandomStr(10),Age: futil.RandomInt(100)})
},1000,100)
}
FunTester构造方法
type Funtester struct {
gorm.Model
Name string
Age int
}
到这里可以看出,性能测试框架用到的都是gorm框架的基础API使用,这里MySQL连接池的管理工作完全交给了gorm框架完成,看资料说非常牛逼,我们只需要设置几个参数。这个使用体现很像HttpClient设置HTTP连接池类似,这里我们也可以看出这些优秀的框架使用起来都是非常简单的。
PS:关于gorm的基础使用的请参考上一期的文章Go语言gorm框架MySQL实践。
Have Fun ~ Tester !
- FunTester2021年总结
- FunTester原创大赏
- 性能测试专题【FunTester原创】
- Groovy语言学习笔记大赏【FunTester】
- 性能测试中异步展示测试进度
- 下单延迟10s撤单性能测试
- 性能测试误差对比研究(四)
- 如何选择API测试工具
- 性能框架哪家强—JMeter、K6、locust、FunTester横向对比
- 左移测试
- Java&Go三种HTTP客户端性能测试
- 浏览器测试的三大挑战及解决方案【译】
- 单元测试再出发
- 敬畏用户
- 千万级日志回放引擎设计稿
猜你喜欢
- 2024-09-09 混合云资产管理项目(二)(混合云存储产品有哪些)
- 2024-09-09 Go语言进阶之Go语言高性能Web框架Iris项目实战-完善用户管理EP04
- 2024-09-09 数据库与 Go 的交互(go数据库和kegg数据库)
- 2024-09-09 七爪源码:N+1 查询如何烧毁您的数据库
- 2024-09-09 Go的安全编程和防御性编程(防止代码注入)
- 2024-09-09 Vue3+Go 仿抖音项目架构设计与实现
- 2024-09-09 腾讯Go安全指南(腾讯官网最新安全公告)
- 2024-09-09 Grails指南24查询高阶(grails中文参考手册)
- 2024-09-09 Redis优化高并发下的秒杀性能(redis秒杀高并发代码)
- 2024-09-09 10.Go语言编写个人博客 文章分类(基于golang的个人博客系统)
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)