关于JMeter原子性相关探究
1.背景
最近宝路遇到个项目,在使用JMeter过程中引发了一些思考,宝路尝试用各种方式去验证,进而有了今天“JMeter原子性”相关主题。
2.目的
探究JMeter的事务的原子性
3.实战
说道原子性,有的同学还一头雾水。。。。啥是原子性?相信大家应该都接触过数据库,数据库的事务就具有原子性(其余的几个特性本次不讨论),宝路觉得这个原子性的概念,更像是从化学这么学科中“偷”过来的。在化学中,原子是在化学反应不可再分的微粒。影射到事务,那就是一个或者多个操作步骤组成了一个原子单元,在事务执行过程中,如果其中任意一个操作步骤失败,那么整个事务即失败。
说下本次JMeter的测试计划,本次设计4个接口,“登录”、“活动信息”、“查卡列表”、“查询余额”,只有登录成功之后才会触发其余交易。
脚本结构(全部交易默认成功):
脚本中sampler都用相同代码来模拟,可以通过random参数控制返回内容,sleep参数控制交易耗时。
public class JMeterTransaction extends AbstractJavaSamplerClient {
@Override
public Arguments getDefaultParameters() {
Arguments arguments = new Arguments();
arguments.addArgument("random","1");
arguments.addArgument("sleep","50");
return arguments;
}
@Override
public SampleResult runTest(JavaSamplerContext arg0) {
SampleResult result = new SampleResult();
result.sampleStart();
String random = arg0.getParameter("random");
long sleep = Long.valueOf(arg0.getParameter("sleep"));
try {
TimeUnit.MILLISECONDS.sleep(sleep);
} catch (InterruptedException e) {
e.printStackTrace();
}
result.setSuccessful(true);
result.setResponseCodeOK();
result.setResponseData(random,"UTF-8");
result.sampleEnd();
return result;
}
}
10并发执行1min结果:
嗯?各接口样本数为什么不一样?有点意思?理论上每个接口样本数应该一致啊。。。。。
宝路调整了下事务控制器配置,勾选了Genernate parent sampler
10并发执行1min结果:
感觉目前没啥问题,宝路将执行过程中的结果保存了,打开本次jtl结果:
嗯?如出一辙。。。从目前看与事务原子性,登录成功多少笔,其余的交易就应该成功多少笔。目前能看JMeter的事务控制不符合原子性,难道是我使用的姿势有问题?
多次执行过,宝路发现个共性:同一个测试计划的各接口的样本总数是递减的。所以宝路做了推测:在场景停止时(线程数从某个设定的值下降到0),比如某个线程在执行完“查询卡列表”时,线程就被kill了,进而导致“查询余额”接口没被执行。
宝路又做了验证:
不勾选事务控制器Genernate parent sampler
勾选事务控制器Genernate parent sampler
清除结果后,使用聚合报告打开本次执行的jtl结果:
经过多次执行,发了个诡异现象:在不勾选Genernate parent sampler时,事务控制器统计的样本数与最后一个接口统计的样本数相同,在勾选Genernate parent sampler时,事务控制器统计的样本数与首个接口统计的样本数相同。
先不管这个是不是BUG,从事务角度看不满足原子性。单纯的事务控制器并不严格的具备原子性,这是目前看到的表像。
那么怎么解决呢?宝路之前写过一篇关于JavaRequest探究的文章,感兴趣的同学可以点击看下。本文就不过多阐述了。直接看结果
清除聚合报告数据后,再打开本次执行的jtl结果文件
嗯,真香。目前觉得唯一的缺点就是没有一个能监听subResult的插件。相同的场景,都是基于java请求的编写的底层脚本,唯一的区别就是组织方式不同。
其实你完全可以这样看:把TestJavaLee中的main看成事务控制器,你细细品,再细细品。。。。
进而宝路得出:单纯用事务控制器来组织多个sampler,严格来说不具有事务的原子性。
如果有不同想法或者看法,欢迎给宝路留言,最后附下TestJavaLee代码:
public class TestJavaLee extends AbstractJavaSamplerClient {
@Override
public Arguments getDefaultParameters() {
Arguments arguments = new Arguments();
arguments.addArgument("subResult","RAW_NO");
return arguments;
}
@Override
public SampleResult runTest(JavaSamplerContext arg0) {
SampleResult main = new SampleResult();
main.setSampleLabel("Main事务");
main.sampleStart();
SampleResult sample_a = new SampleResult();
sample_a.setSampleLabel("登录");
sample_a.sampleStart();
try {
TimeUnit.MILLISECONDS.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
sample_a.sampleEnd();
sample_a.setSuccessful(true);
main.addSubResult(sample_a,false);
SampleResult sample_b = new SampleResult();
sample_b.setSampleLabel("活动信息");
sample_b.sampleStart();
try {
TimeUnit.MILLISECONDS.sleep(70);
} catch (InterruptedException e) {
e.printStackTrace();
}
sample_b.sampleEnd();
sample_b.setSuccessful(true);
main.addSubResult(sample_b,false);
SampleResult sample_c = new SampleResult();
sample_c.setSampleLabel("查卡列表");
sample_c.sampleStart();
try {
TimeUnit.MILLISECONDS.sleep(80);
} catch (InterruptedException e) {
e.printStackTrace();
}
sample_c.sampleEnd();
sample_c.setSuccessful(true);
main.addSubResult(sample_c,false);
SampleResult sample_d = new SampleResult();
sample_d.setSampleLabel("查询余额");
sample_d.sampleStart();
try {
TimeUnit.MILLISECONDS.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
sample_d.sampleEnd();
sample_d.setSuccessful(true);
main.addSubResult(sample_d,false);
main.setSuccessful(true);
return main;
}
}
关于JMeter原子性相关探究的更多相关文章
- 关于自定义tabBar时修改系统自带tabBarItem属性造成的按钮顺序错乱的问题相关探究
关于自定义tabBar时修改系统自带tabBarItem属性造成的按钮顺序错乱的问题相关探究 测试代码:http://git.oschina.net/Xiyue/TabBarItem_TEST 简 ...
- Jmeter+Badboy实战经验三 Jmeter关联相关知识
1. 什么时候需要使用关联? 有些参数是动态变化的,获取之后,再次操作的时候,参数的值已经发生了变化,这种情况下就会出现脚本不可运行的问题,就需要用到了关联 2. 关联是什么概念? 3.jmeter ...
- JMeter的JavaRequest探究
1.背景 最近笔者的一位老朋友咨询了一个问题:在自定义的Java请求中如何编写多个请求?老朋友反应他们发送请求只能基于这种Java请求形式(代码调需用三方封装的jar包).这个问题恰巧不久前在笔者所在 ...
- ${__setProperty 等常见jmeter参数相关博客汇总
jmeter 控制线程组执行顺序 这个要配合全局变量.if和while来实现BeanShell取样器,全局变量:${__setProperty(newswitch,${switch1},)}if条 ...
- 性能测试之--Apache JMeter安装
Hi,今天给大家分享一下安装JMeter的相关内容~ Apache JMeter 是Apache组织的开源项目,是一个100%纯Java桌面应用,用于压力测试和性能测试. 它能够对HTTP.FTP服务 ...
- 【转】jmeter 进行java request测试
本周使用jmeter进行一个远程dubbo接口的性能测试,因为没有访问页面,本来开发可以写一个页面,进行http请求的调用,不过已经看到jmeter可以直接对java request进行测试,所以尝试 ...
- iOS-事务相关
事务管理 事务(Transaction):1.构成单一逻辑工作单元的操作集合DBMS中的用户程序DBMS外的可执行程序对数据库的读/写操作序列2.读从数据库中读取数据,首先从磁盘中读到内存(Buffe ...
- 使用Jmeter至WebService压力测试
使用Jmeter至WebService压力测试 目中我们使用了Jmeter对webservice进行了压力測试,Apache JMeter是Apache组织开发的基于Java的压力測试工具.用于对 ...
- 转:Jmeter以non-gui模式进行分布式测试
由于Jmeter是一个纯JAVA的应用,用GUI模式运行压力测试时,对客户端的资源消耗是相当惊人的,所以在进行正式的压测时一定要使用non-gui模式运行,如果并发数很高或者客户端的硬件资源比较一般的 ...
随机推荐
- Java设计模式_七大原则
简介 单一职责原则.对类来说,即一个类应该只负责一项职责. 开闭原则.对扩展开放,对修改关闭.在程序需要进行扩展的时候,不能去修改原有代码,使用接口和抽象类实现一个热插拔的效果. 里氏替换原则.任何基 ...
- Oauth 2.0学习
OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为R ...
- 死磕 java线程系列之线程池深入解析——定时任务执行流程
(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 注:本文基于ScheduledThreadPoolExecutor定时线程池类. 简介 前面我们一起学习了普通 ...
- Java8系列 (七) CompletableFuture异步编程
概述 Java8之前用 Future 处理异步请求, 当你需要获取任务结果时, 通常的做法是调用 get(long timeout, TimeUnit unit) 此方法会阻塞当前的线程, 如果任务 ...
- 在VMware下进行的Windows2008操作系统虚拟机的安装
一.VMware虚拟机的安装 首先你需要拥有一款软件VMware,这是一款虚拟机安装软件.Vmware比起Vbox收费较贵,占用资源大,但是拥有大量的资源以及拥有克隆技术,适合新手学习使用,较为专业. ...
- 熊海cms v1.0 完全代码审计
很久以前写的,写这个东西更多的是为了说明我自己的一个思路,即按照程序功能点进行代码审计, 这样经过一段时间训练,熟悉了某种功能的正确和错误实现方法,遇到类似的代码就可以很快看出是否有问题了 --- 0 ...
- Oracle“ORA-00979:不是GROUP BY 表达式”解决方式
今天在工作中碰到一个问题,用group by 语句进行分组时出现ORA-00979错误. 代码如下: select R.ORDER_NO, R.PRODUCT_CODE, R.REGION_NO, R ...
- jdbc 加载数据库驱动如何破坏双亲委托模式
导读 通过jdbc链接数据库,是每个学习Java web 方向的人必然一开始会写的代码,虽然现在各路框架都帮大家封装好了jdbc,但是研究一下jdbc链接的套路还是很意义 术语以及相 ...
- Linux下rpm仓库搭建
一.概念 1.rpm是什么?在帮助文档里我们可以看到,rpm的名字是rpm package manage 的缩写, 从名字上看就可以知道rpm就是一个包管理工具.简单说rpm包就是把一些程序编译成二进 ...
- Android Debug 之 Log 最佳实践
本文微信公众号「AndroidTraveler」首发. 背景 在开发过程中,调试是必不可少的一项工作. 当我们要确定项目的逻辑时,当我们要了解界面的生命周期时,当我们发现新写的逻辑与期望效果不一致时, ...