白盒测试 Jmeter 的一些东西

GUO · 2013年12月16日 · 最后由 混泥土瞬间移动工程师 回复于 2015年09月13日 · 2136 次阅读
本帖已被设为精华帖!

最近改用 Jmeter 了,记录点东西
# 和 LoadRunner 的区别
## 编写脚本
LR 提供.net,java,c 三种语言的支持,Jmeter 只支持 Java 一种语言的开发,直接提供 api 的只是其中一种叫 JavaRrequest 的 Sampler
只要继承他的 AbstractJavaSamplerClient 类,打个包丢 lib 下面,就可以了,有点像 Junit
不过开源项目嘛,各种 Processer,Listener 之类的东西都是可以自定义开发的,就是麻烦一点

## 接口
LR 里面有个 transcation 的概念,主要有三个属性:name,duration,status.
通过它提供的 api,可以在业务开始的时候调用 lr.start_transcation(name) 开始一个事件,在结束的时候 lr.end_transcation(name,passOrNot) 来完成一个事件,这样就自动计算了处理花费的时间,并记录了最终状态
,在 contorller 上就会体现出 name 业务的一次执行,TPS 或者 RPS 图标上可以观察到相应的曲线
Jmeter 里也有这么个东西,不过因为 Jmeter 里的业务处理部分叫 Sampler,所以叫 SampleResult.
每个 Sampler 每次执行,都需要 return 一个 SampleResult.这个 Result 包含的内容很多,不光上面的包含 name,duration,status,还可以保存 request 和 respones,而且还能嵌套,一个 Result 可以包很很多 SubResult.
最终这些结果都被"Listener"接收到 (Sampler,Listener 的概念不说了,网上 google 一下一堆)
主要接口

ampleStart()
sampleEnd()
setSuccessful()
setSampleLabel()
setRequestHeaders()
setResponseData()

## 监控,结果展示和分布式
这方面 Jmeter 相比来说太弱,不说了
推荐个插件 jmeter-plugin
Transactions per Second
Response Times Over Time
PerMon Metrics Collector

## 多线程
LR 里面有个叫 Vuser 的东西,一个 Vuser 可以认为是一个独立的线程,也可以设置让他是一个独立的进程,不设置默认 50 个 Vuser 一个进程.每个 Vuser 是一个测试脚本的完整实例.
顺便说一句,LR 的 api 只有从主线程里调用才起作用,别的现成调用都不干活,不过这都不是事
Jmeter 么...... 一个测试计划下面可以有多个线程池,线程池是用来执行各种 Sampler 的,可以设置线程的数量,执行次数
每个线程会都会把线程池下面的东西 (sampler,controller 之类的) 顺序执行一遍

## 上下文
LR 没有
Jmeter 通过 JMeterContextService.getContext() 可以获得一个 JMeterContext,这里面能包含一个工作线程中的大部分有用的信息,比如:
getPreviousResult() 获取上一个 sampler 的结果
getVariables() 获得一个 JMeterVariables,这个东西就是个 Map,Value 是个 Object,这样可以在线程里任何地方存取你需要的任何类型,很灵活也很好用

未完待续...

目前,个人感觉性能测试还是 LR 好用,可惜收费,还很贵,而且只能 Windows
Jmeter 怎么看怎么像个自动化接口测试的东西

共收到 19 条回复 时间 点赞

jmeter 才是最灵活的方式. 比 lr 好很多.
只是用起来需要一些专业知识, 所以不像 lr 那样容易.
jmeter 是在自动化概念上封装了性能测试场景, 其实 lr 也是一样.
lr 也是可以写自动化脚本的.

对于初级入门来说, lr 毕竟会好些, 操作人性化, 报表功能强大.
lr 较难在 linux 上跑, 企业级别的测试, lr 也撑不起来, 需要自己编写工具.

目前 lr 和 jmeter 都是只用在偏前端的一些性能测试场景中, 偏重业务场景分析.
后端测试 jmeter 可能会用上, lr 就不行了

GUO #2 · 2013年12月16日 Author

#1 楼 @seveniruby
LR 好用主要就是报表,可以实时统计回来数据,最后测试结果太大的时候还能是使用 SQL 数据库暂存
应付百万并发连接的测试没啥问题,主要还是看脚本写的质量了

#2 楼 @guo 现在的服务器都是使用 linux 在存放服务器和测试环境的集群中都没有了 windows 所以 lr 的应用场景有限 在办公环境中加压很容易搞垮办公网络 百万连接 lr 貌似搞不起来 主要是 window 太差 用 linux 加压更节省资源 持续集成也方便 lr 在做复杂业务的性能测试还是很好的 现在连 jmeter 用的也不是太多 他的加压能力也有限 也是适合处理复杂业务场景

GUO #16 · 2013年12月16日 Author

#3 楼 @seveniruby 现在就是,环境里没 windows 的服务器了,所以只能换 jmeter
windows 其实没那么差,java7 nio 在 windows 上表现就挺好的
最大的问题就是要钱

#4 楼 @guo windows 在发起连接和维持连接这个方面还是挺差的. 而且修改连接参数很麻烦.windows 在连接数超过 2k 的时候, 基本就顶不住了. 而 linux 可以达到上万. 在消耗的 cpu 和内存方面也比 windows 少很多. 你用多了 linux 就知道 windows 有多挫了.

试试看 gatling,用协程,效率高很多

#1 楼 @seveniruby 说说我的看法吧~LR 处理后端信令场景的测试其实未尝不可,我们在实际项目中有过实施,甚至还尝试自写 puntch 过程来验证硬件某转发模块的 (SIP 协议) 队列处理能力,严格意义上来讲,LR 能够测试任何基于消息模型的产品,只不过国内 LR 盗版横行,别看各大论坛都在谈 LR,但是他的普及率其实真不算高...况且,让 TE 用 C 写一段复杂的后端测试脚本确实多少有点难度,导致了这块的案例非常少;再者,从模拟用户真实操作的角度上来讲,性能测试肯定是偏向于前端业务,以此来触发后端处理,从而验证系统的容量。拙见~哈哈~

我用 jmeter 运行一个简单脚本,发送 http 请求,100 个线程,时间设置无限,跑一晚上后,内存溢出了,汗

GUO #9 · 2014年01月02日 Author

#8 楼 @simple 你是不是开着那个什么树列别啥的了,那个会吧结果一直记录在内存里,数据量多了就不行,正式测试的时候最好吧一些没有的记录都关了

GUO #10 · 2014年01月02日 Author

#7 楼 @qddegtya 我以前就是这么做的,不过不是用的 C,现在支持 C#和 JAVA 的脚本,降低了很多开发难度
而且发现很多公司验收的时候还比较认可 LR 出的报告,可见知名度还是相当高的

Arguments、JavaSamplerContext....这些没写

#9 楼 @guo 知道原因了,长时间施压,不能设置 “查看结果树”,不然会在 bin 目录下生成一个很大的文件

#12 楼 @simple 可以勾选 Errors

1.最近我也在使用 jmeter,针对于百度,我只是并发 100 个请求,响应时间惨不忍睹,我观察我的内存和 cpu 信息,发现内存一直没有变化,cpu 倒还是有波动
2.其实最令我关注的还是服务器这块,监控服务器,数据库,网络等这些信息,个人感觉还是 lr 应该会强大很多的。
3.lr 的名气实在太大了,很多客户指定需要 lr 的分析报告。

所以我不得不把重新投入到 lr 的怀抱

GUO #15 · 2015年07月15日 Author

#14 楼 @284772894 LR 在数据统计展示和稳定方面,确实比 jmeter 好用. jmeter 好处就是能做些深入的二次开发.

#6 楼 @lihuazhang
大神,您好,看到你提到 gatling,我最近在看这个工具,很希望你能指导一下,就是用 gatling 写接口测试的脚本的时候,该怎么写呢?如果方便的话,可以加我一下扣扣 872489864,谢谢。

#16 楼 @diao2007 推荐@seveniruby 给你。他了解整套解决方案。

#5 楼 @seveniruby 你好,@lihuazhang说您对 gatling 有深入研究,能指导一下,怎么用 gatling 写接口测试的脚本呢?

请教大神。最近想搞个 jmeter 接口自动化,遇到的最大问题是,怎么样开始一次就执行所有的组合请求@seveniruby

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册