[Jmeter(三十七)源码导入IDE(转!)]
转自:www.cnblogs.com/taoSir/p/51…
亲测3.3有效。
由于JMeter纯Java开发,界面也是基于Swing或AWT搞出来的,所以想更深层次的去了解这款工具或对于想了解JMeter插件开发或二次开发的童鞋们来说,读读JMeter的源码估计是必不可少的,所以首先就得把源码整合起来,方便后面的Debug和二次开发,下面整理了关于JMeter源码整合到Eclipse中的一个过程,希望对大家有一定的帮助。
-
首先下载源文件:jmeter.apache.org/download_jm…
-
然后解压下载的源码文件到本地路劲下面;
- 打开Eclipse,建立一个JavaProject,按照下面的截图建立JavaProject;
- 选择创建的Java项目,右键选择Import,然后选择“File System”
- 定位到解压到本地路径下的JMeter源码文件下,选择全部导入
- 导入完成后,查看项目,全部是红色的X,这个太令人苦恼了,造成出现错误的原因是没有导入对应的jar包,
- 我们可以利用Ant下载项目所需要的jar文件,操作步骤如下:
Eclipse –> Window –> Show View –> Ant, 将ant加入Eclipse的控制面板上,
然后选择Ant面板上的添加Buildfiles;
- 选择该项目下的ant的构建文件“build.xml”
- 在ant页面上双击“download_jars”,这个时候ant运行自动下载缺省的jar文件到项目下指定的路劲下,直到显示Build Success(这个过程中可能出现一些问题,由于网络受限,部分jar包无法下载,可能需要FQ,如果不想麻烦的,我稍后直接将所需要的jar包上传到云盘中,直接将jar包丢到lib下)
- jar包下载完或直接将jar包已经复制到Lib文件夹下以后,这个时候右键选择项目 Build Path –> configure build path,然后选择“Add Jars”,
将lib下面所有的jar包都导入到项目中,jar包在lib下面的目录结构如下图所示,这个不能错(如果是用ant下载的,创建的目录结构就是这样的,如果自己下载jar包导入的,一定要注意lib下面的目录结构)。
jar包下载地址: yunpan.cn/crdkymEH8hD… (提取码:3b14)
- 导入成功以后再次查看项目,就可以看到万恶的红X都没有了,但是这个时候项目还不能成功运行,还需要进行下面的操作,
- 关闭Eclipse, 进入到该Java项目的本地文件夹下,需要删除原有的“.classpath”,将“eclipse.classpath”重命名为“.classpath”,由于Windows本身的限制,所以需要进入到CMD下面进行对应的操作,如下图所示:
- 上述操作完成后,重新打开Eclipse,找到项目的入口,main方法,/jmeter/src/core/org/apache/jmeter/NewDriver.java
运行该项目发现还是报错,如下图所示,各种Google,各种尝试,都没有解决,其实错误的原因说的非常明确,就是bin下面缺少“jmeter.properties”,万万没想到啊,完整的项目导入为什么就没有将该配置文件导入呢?想不通,只要到源码文件中的bin目录下将该配置文件复制到项目的bin目录下,就解决了这个问题一大步了,操作如下图所示:
- 上述操作完成以后,再次选择该项目,右键选择NewDriver这个main类, 选择 Run As –> Run Configuration, 按照下面的操作,就完美的解决了上面的报错。
- 完成上面所有的操作以后,就可以尽情的各种Debug和二次开发操作了。
[Jmeter(三十八)Jmeter Question 之 ‘批量执行SQL语句’]
知识使我们变得玩世不恭,智慧使我们变得冷酷无情,我们思考的太多,感知太少,除了机器,我们更需要人性,除了智慧,我们需要仁慈和善良。
------出自查理卓别林的演讲
前面有提到Jmeter使用JDBC连接池进行连接数据库,执行SQL语句,但是有一个误区点是没有提到的:
示例:
user表
case表:
使用Jmeter进行连接查询:
单条执行语句查询结果是没有任何问题的;
问题出在哪呢?使用JDBC Request执行两条SQL,如下:
结果:
结果看的出来,只执行了第一条,第二条并没有执行。
如何打破这个僵局?
此处的解决方案只用于Mysql。
第一步:
在JDBC连接池的Url后方加上allowMultiQueries=true,允许批量更新,更多细节请百度。
第二步:
将Query Type设置为Callable Statement。
OK,再请求一下查看结果。
[Jmeter(三十九)User.Properties定义全局变量]
“烟”从物质上满足吸烟者对尼古丁的依赖,但“烟”更从精神上满足了人们对“思想”的欲望---在抽烟的时刻,每个男人都可能成为思想家。
---《冲突》
前面有记到jmeter读取外部文件内容的方法,而本节要记录的是使用User.Properties定义全局变量,是一劳永逸的做法。
jmeter的bin目录下有若干文件,其中用的最多的便是jmeter.bat,jmeter.Properties等,写代码的都知道Properties乃配置文件也。我们可以通过Properties中定义的各类属性来实现需求,例如前面的cookie问题、输出日志类型问题、定义日志级别问题、编码问题等等。
那么这些文件如何使用,从该节开始,从该标题的需求开始。
一、打开jmeter.Properties文件,找到user.properties=这一行
默认指定的user.properties为自带用户配置文件,当然可以自定义。
该处使用默认配置文件。保存。
二、编辑user.properties文件(user.properties文件在bin目录下)
变量值与变量名可自定义。保存重启。
三、界面引用
使用组件:User Defined Variables
使用函数:${__property(,,)}
四、常规引用${变量名}
查看结果:
引用成功。
[Jmeter(四十)BeanShell范例]
这世间,死一个人是一件大事,人名、地名都会被广传;死一百人就只是一个数字了。
---《传记文学:从晚清到民国》
一、生成随机手机号码
编译器调试:
package performance.java.top;
import java.util.Random;
/**
* BeanShell生成随机手机号码方法
* @author Richered
*
*/
public class BeanShell {
public void BeanShell() {
String phone = "1";
String number = System.currentTimeMillis() + "";
for(int i = 0;i<100;i++){
int second = new Random().nextInt(10);
if (second == 3 || second == 4 || second == 5 || second == 7 || second == 8) {
phone = phone + second;
break;
}
}
if("13".equals(phone)||"18".equals(phone))
{
int third = new Random().nextInt(10);
phone = phone + third;
}
if("14".equals(phone))
{
int[] arr = { 5, 7, 9 };
phone = phone + arr[new Random().nextInt(3)];
}
if("15".equals(phone))
{
int[] arr = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
phone = phone + arr[new Random().nextInt(arr.length)];
}
if("17".equals(phone))
{
int[] arr = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
phone = phone + arr[new Random().nextInt(arr.length)];
}
phone=phone+number.substring(5,5+8);
System.out.println(phone);
}
public static void main(String[] args) {
BeanShell test = new BeanShell();
test.BeanShell();
}
}
jmeter调试:
/**
* BeanShell生成随机手机号码方法
* @author Richered
*
*/
import java.util.Random;
String phone = "1";
String number = System.currentTimeMillis() + "";
for(int i = 0;i<100;i++){
int second = new Random().nextInt(10);
if (second == 3 || second == 4 || second == 5 || second == 7 || second == 8) {
phone = phone + second;
break;
}
}
if("13".equals(phone)||"18".equals(phone))
{
int third = new Random().nextInt(10);
phone = phone + third;
}
if("14".equals(phone))
{
int[] arr = { 5, 7, 9 };
phone = phone + arr[new Random().nextInt(3)];
}
if("15".equals(phone))
{
int[] arr = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
phone = phone + arr[new Random().nextInt(arr.length)];
}
if("17".equals(phone))
{
int[] arr = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
phone = phone + arr[new Random().nextInt(arr.length)];
}
phone = phone + number.substring(5, 5+8);
vars.put("mobphone", phone);
请求查看:
二、数据转换
字符串转换为十六进制,十六进制转换为json
编译器调试:
/**
* 16进制转换为json
* @param s
* @return
*/
public static String toStringHex(String s) {
byte[] baKeyword = new byte[s.length() / 2];
for (int i = 0; i < baKeyword.length; i++) {
try {
baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(
i * 2, i * 2 + 2), 16));
} catch (Exception e) {
e.printStackTrace();
}
}
try {
s = new String(baKeyword, "utf-8");// UTF-16le:Not
} catch (Exception e1) {
e1.printStackTrace();
}
return s;
}
/**
* 字符串转换为十六进制
* @param str
* @return
* @throws Exception
*/
public static String toHexString(String str) throws Exception{
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < str.length(); i++) {
int ch = (int) str.charAt(i);
String strHex = Integer.toHexString(ch);
hexString.append(strHex);
}
return hexString.toString();
}
jmeter前置处理器demo:
String json = "{"appVersion":"","autoLogin":true,"deviceId":"","jid":"16780330/p_web_monitor","sdkVersion":"","token":"xxx"}";
public static String toHexString(String str){
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < str.length(); i++) {
int ch = (int) str.charAt(i);
String strHex = Integer.toHexString(ch);
hexString.append(strHex);
}
return hexString.toString();
}
vars.put("data", toHexString(json));
三、生成随机身份证号码
import java.util.*;
StringBuilder generater = new StringBuilder();
int sex=0; // 1为男 0 为女
int age=1979; //1979为大于18岁 2000小于18岁
Map areaCode = new HashMap();
areaCode.put("北京市", 110000);
areaCode.put("市辖区", 110100);
areaCode.put("东城区", 110101);
areaCode.put("西城区", 110102);
areaCode.put("崇文区", 110103);
areaCode.put("宣武区", 110104);
areaCode.put("朝阳区", 110105);
//地区号
String randomAreaCode="";
int index = (int) (Math.random() * areaCode.size());
Collection values = areaCode.values();
Iterator it = values.iterator();
int i = 0;
int code = 0;
while (i < index && it.hasNext()) {
i++;
randomAreaCode = it.next().toString();
}
generater.append(randomAreaCode);
//生日
String randomBirthday="";
Calendar birthday = Calendar.getInstance();
birthday.set(Calendar.YEAR, (int) (Math.random() * 20) + age);
birthday.set(Calendar.MONTH, (int) (Math.random() * 12));
birthday.set(Calendar.DATE, (int) (Math.random() * 31));
StringBuilder builder = new StringBuilder();
builder.append(birthday.get(Calendar.YEAR));
long month = birthday.get(Calendar.MONTH) + 1;
if (month < 10) {
builder.append("0");
}
builder.append(month);
long date = birthday.get(Calendar.DATE);
if (date < 10) {
builder.append("0");
}
builder.append(date);
randomBirthday= builder.toString();
generater.append(randomBirthday);
//随机码
String randomCode="";
int code = (int) (Math.random() * 1000);
if (code < 10) {
// randomCode= "00" + code;
if(code%2==sex)
{
randomCode= "00" + code;
}
else
{
code=code + 1;
randomCode= "00" + code;
}
} else if (code < 100) {
// randomCode= "0" + code;
if(code%2==sex)
{
randomCode= "0" + code;
}
else
{
code=code + 1;
randomCode= "0" + code;
}
} else {
// randomCode= "" + code;
if(code%2==sex)
{
randomCode= "" + code;
}
else
{
code=code + 1;
randomCode= "" + code;
}
}
generater.append(randomCode);
//验证码
char[] chars= generater.toString().toCharArray();
int[] c = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
char[] r = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };
int[] n = new int[17];
int result = 0;
for (int i = 0; i < n.length; i++) {
n[i] = Integer.parseInt(chars[i] + "");
}
for (int i = 0; i < n.length; i++) {
result += c[i] * n[i];
}
char validateCode = r[result % 11];
generater.append(validateCode);
vars.put("idNumber",generater.toString());
SampleResult.setResponseData(generater.toString());
[Jmeter(四十一)分布式测试(转!)]
寄语路人休掩鼻,活人不及死人香。
-------《随园诗话》袁枚
转自:www.cnblogs.com/imyalost/p/…
1、修改Contorller配置
打开Contorller机下jmeter安装文件下的bin目录:jmeter.properties文件,搜索remote_hosts=127.0.0.1,将Agent机的IP和端口写在后面,比如:
remote_hosts=127.0.0.1,127.0.0.2:80,127.0.0.3:80
其中127.0.0.2和127.0.0.3为Agent机的IP,每个Agent机之间用英文半角逗号隔开,修改保存。
2、启动jemter
启动jmeter后,设置线程组、配置元件、取样器、监听器等原件,点击“运行-远程启动”:
可以选择远程启动一个Agent机,或者选择远程全部启动,这样,就可以进行分布式测试了。
PS: 上面的例子中,127.0.0.2和127.0.0.3为举例说明,具体实践请修改为对应的Agent机IP以及端口。
注意事项
1、保持Contorller和Agent机器的JDK、jmeter以及插件等配置版本一致;
2、如果测试数据有用到CSV或者其他方式进行参数化,需要将data pools在每台Agent上复制一份,且读取路径必须保持一致;
3、确保Contorller和Agent机器在同一个子网里面;
4、检查防火墙是否被关闭,端口是否被占用(防火墙会影响脚本执行和测试结构收集,端口占用会导致Agent机报错);
5、分布式测试中,通过远程启动代理服务器,默认查看结果树中的响应数据为空,只有错误信息会被报回;
6、如果并发较高,建议将Contorller机设置为只启动测试脚本和收集汇总测试结果,在配置文件里去掉Contorller机的IP;
7、分布式测试中,如果1S启动100个模拟请求,有5个Agent机,那么需要将脚本的线程数设置为20,否则模拟请求数会变成500,和预期结果相差太大。
[Jmeter(四十二)Jmeter工作原理]
“千举万变,其道一也。不离于宗,谓之天人”
----《荀子·儒效》和《庄子·天下》
作为接口测试工具
Jmeter只是作为发起请求的客户端(可以理解为前端),Jmeter是作为组装请求报文结构的容器,例如:请求行、请求头、请求数据;并可将响应结果进行可视化展示。对于接口的复杂逻辑Jmeter有丰富的插件进行支持,前/后置处理,断言元件、第三方插件、也可以自行开发插件。
考察点:对协议的理解程度,例如http(s)、TCP、SOAP、DUBBO等常见协议,熟悉了解其请求报文以及响应报文结构则可知其本质
作为录制工具
其录制功能本质为通过监听某个端口,让代理捕获监听端口的报文信息,对抓取的报文进行格式化转换为对应的行为函数,而脚本进行回放时,就用函数方法去模拟客户端与服务端的通信过程。
说的明白点,就是将浏览器(前端)的所有请求保存下来,而监听手段便是设置代理,其他的抓包工具fiddler、Charles等原理都为一致。fiddler打开便启动默认代理(代理端口8888),Jmeter则是需要去设置代理服务器,其原理一致。
考察点:对录制本质的理解,这也是对当下测试人员的一个阶段性的考验,初级测试人员学习工具的初衷究其根本:不想写代码!托拉拽能搞定的不会写一行代码,录制便是这种类型的一种体现。
作为性能测试工具
Jmerer是模拟负载的工具,通过多线程模拟服务器访问压力。众所周知,性能测试中脚本以及加压工具并非重点,因为可择加压方式有很多,如LR、locust、自行编码,脚本编写相对容易,其核心点在于针对数据的分析,而完成分析工作则需要审查对业务架构、系统架构、业务逻辑、接口逻辑、需求调研分析、数据准备、同步/异步监控(JVM、服务器)准备等等前置工作的铺底程度,而Jmeter在编写脚本以及服务器同步监控(有插件支持、也可集成influxdb+Grafana)阶段可完成。
考察点:对性能测试的理解,学习过性能测试的童鞋应该都知道:性能测试≠工具or代码,性能测试是一个比较宽泛的领域,仅仅说某种工具或者说某种代码能搞定的,显然是不太现实的。
因此考察what,回答what,如何回答,首先要理解其本质,万变不离其宗!见招拆招方可达道境三十三重天!
[Jmeter(四十三)WebSocket Sampler 和 Ajax Request]
权利被放出牢笼,就很难再被关入笼中;奴性被唤出来,腰杆和膝盖很难再直起来。
----宅猪《牧神记》
websocket概述:
Jmeter进行websocket协议的接口测试,该类型协议的接口在网上是搜得到的,传送门:github.com/maciejzales…
下载即可。
还有依赖需要下载,链接:pan.baidu.com/s/1QSp21gRY… 提取码:alwl
依赖maven坐标:github.com/maciejzales…
将下载完成的jar 放在{jmeter_home}\lib\ext目录下,重启。
Web Server
Server Name or IP:被测 WebSocket服务器的域名或IP
Port Number: 被测WebSocket服务器的端口号。
Timeout
Connection:链接建立的最大超时时间,单位毫秒。如果达到超时时间设置后链接未建立,则sampler失败。
Response:对响应消息的最大等待时间,单位毫秒。到达设定时间后WebSocket链接关闭。
WebSocket Request
Implementation:仅支持 RFC6455(v13)
Protocol:ws——普通的WebSocket链接,或wss——安全的WebSocket链接(WebSocket Secure connection)
Path、同请求一起发送参数、Request Data:与http采样器类似,结合被测接口说明文档来进行配置。
Ajax:
取自BlazeMeter官网
与上方一致:链接:pan.baidu.com/s/1IqVd28P2…提取码:jo7w
将下载的插件放入{jmeter_home\lib\ext}目录下,重启。
[Jmeter(四十四)启动提示 Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.]
有已知的已知;有些事情我们自己知道自己知道;
我们也知道有已知的未知;这是指我们知道有些事情自己不知道;
但是还有未知的未知;有些事情我们不知道自己不知道;
---美国国防部长 唐纳德·拉姆斯菲尔德 2002年2月12日
---读《性能之巅》
在技术群里边看到有人会问到启动dos窗口有个警告的提示,WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5。
但是并不影响使用。我也在自己本地装的时候遇到过该情况,只是由于不影响任何使用就忽略掉了,那么今天找找该问题的原因,做一次总结。
资料来源:blog.csdn.net/zjq001x/art…
stackoverflow.com/questions/2…
Problem(Abstract)
After running a clemb command under Windows 7 with Modeler 14.1 the following error is produced:
java.util.prefs.WindowsPreferences
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs
at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
Cause
The error occurs because java.util.prefs.WindowsPreferences is trying to save information in HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs instead of under HKEY_CURRENT_USER\Software\JavaSoft\Prefs.
翻译:
错误原因:
java.util.prefs.WindowsPreferences需要保存信息到HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs而不是HKEY_CURRENT_USER\Software\JavaSoft\Prefs。
解决办法:
The work around is to login as the administrator and create the key HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs.
以管理员身份登录,创建HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs项,
虽然Jmeter不会保存任何东西到该项,仍会将信息保存到HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs。
以上方法可以解决,但经过测试,发现不用创建注册项, “以管理员身份运行一次” jmeter.bat 也可解决。
[Jmeter(四十五)Throughput Controller(控制业务比例)]
The Throughput Controller allows the user to control how often it is executed. There are two modes
第一段就说的很清楚,控制执行频率。
·Total Executions
执行一定数量停止
·Percent Executions
按照百分比执行
和仅一次控制器一样,当父循环控制器重新启动时,此设置将重置
·Per User
如果选中,则每个用户将导致控制器计算是否应按每个线程执行
如果未选中,则计算是所有线程的全局计算
例如:选择Total Executions,取消选择Per User,则吞吐量给定的数字是执行的总数;选择Per User,执行的总数是线程数*吞吐量的给定数
二、实践
吞吐量控制器通常在组合业务场景中,例如:容量性能场景、稳定性能场景中非常实用。
线程组配置:5s内启动100线程,循环1次
Throughput Controller_success 选择百分比控制方式 20%
Throughput Controller_debug 选择百分比控制方式 30%
Throughput Controller_error 选择百分比控制方式 50%
聚合报告展示:
Response Times Over Time 展示:
Transactions per Second展示:
从聚合报告展示中便可看出其分配比例。
分别将吞吐量控制器修改为Total Executions
线程组循环数改为2,其余不变
Throughput Controller_success 100
Throughput Controller_debug 50
Throughput Controller_error 50
选择Per User
Response Times Over Time
[Jmeter(四十六)Jmeter第三方插件安装]
想走的路不好走,想做人不好做,都说是身不由己。那不是废话吗,己不由心,身又岂能由己。
---《一人之下· 张之维》
插件地址:jmeter-plugins.org/install/Ins…
如上图示,将plugins-managher.jar放在lib/ext目录下
打开jmeter->option
可安装自己需要的插件。
也可直接在官网中下载,将下载下来的jar放在lib下即可
[Jmeter(四十七)TCP协议测试]
江畔何人初见月?江月何年初照人?
----张若虚《春江花月夜》
一、TCP取样器官方介绍
比较重要的参数:
TCP Sampler提供了3个报文编码类型的实现,分别是
org.apache.jmeter.protocol.tcp.sampler. TCPClientImp
org.apache.jmeter.protocol.tcp.sampler. BinaryTCPClientImpl
org.apache.jmeter.protocol.tcp.sampler. LengthPrefixedBinaryTCPClientImpl
1)TCPClientImpl以文本编辑器中所编辑的纯文本为内容进行发送。
2)BinaryTCPClientImpl以文本编辑器中所编辑的16进制字符(hex)内容为基础转换为二进制的 字节内容进行发送。
3)LengthPrefixedBinaryTCPClientImpl在BinaryTCPClientImpl基础上默认以发送内容的长度为 字节前缀进行填
二、实例
报文需要16进制报文,因此需要转一下
beanshell前置处理
String json ="{"appVersion":"","autoLogin":true,"deviceId":"","jid":"16780330/p_web_monitor","sdkVersion":"","token":"xxxx"}";
public static String toHexString(String str){
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < str.length(); i++) {
int ch = (int) str.charAt(i);
String strHex = Integer.toHexString(ch);
hexString.append(strHex);
}
return hexString.toString();
}
vars.put("data", "000000F9000F000103E80000781700" + toHexString(json).toUpperCase());
服务端可查看连接数
[Jmeter(四十八)MQ测试(转!)]
马渡江头苜蓿香,片云片雨渡潇湘
--《明朝那些事儿》
转自:www.cnblogs.com/DeryKong/p/…
一、下载安装ActiveMQ
ActiveMQ下载:https://activemq.apache.org/
解压:tar -zxvf apache-activemq-5.16.2-bin.tar.gz
切换到activemq的bin目录:cd apache-activemq-5.16.2/bin
启动MQ:./activemq start
检查MQ是否正常启动:ps -ef|grep activemq|grep -v grep
浏览器打开:http://localhost:8161 admin/admin 登录查看
JMS脚本开发
jms(java message service):java消息服务器应用程序接口,是一个Java平台面向消息中间件的api,用于在两个应用程序之间,或分布式系统中发送信息,进行异步通信
Connection Factory:创建一个连接,向消息服务器发送消息以及从消息服务器接收信息均是通过此连接进行
Connection:是客户端与消息服务器的活动连接
Session:是用于生产和使用消息的单线程上下文
MessageProduce:指定的物理目标发送消息
MessageConsumer:客户端是使用Message Consumer对象从指定的目录目标接收信息
二、jmeter开发jms脚本的步骤
1、创建 jndi.properties文件
java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url=tcp://localhost:61616
指定 connectionFactory 的 jndi名字,多个名字之间可以逗号隔开
connectionFactoryNames=connectionFactory
注册queue,格式:
queue.[jndiName]=[physicalName]
#使用时:(Queue)context.lookup("jndiName"),此处是MyQueuePerPertest自定义命名
queue.MyQueuePerPertest=MyQueuePerPertest
注册 topic,格式:
topic.[jndiName]=[physicalName]
使用时:(Topic)context.lookup("jndiName"),此处是MyTopicPerPertest自定义命名
queue.MyTopicPerPertest=MyTopicPerPertest
2、把这个文件夹加入到ApacheJMeter.jar这里
保存并把这个文件复制到 JMETER_HOME/bin (JMETER_HOME为 jmeter 的安装目录)目录中。
由于 bin 目录并不在 jmeter 的 classpath 中,所以需要执行一些额外的工作来把 jndi.properties 添加到 jmeter 的classpath 中。
这儿使用一种最简单的办法:把 jndi.properties 打包到 jmeter 的启动 jar 包中。 jmeter 的启动 jar 包为 JMETER_HOME/bin/ApacheJMeter.jar,所以需要把 jndi.properties 添加到这个 jar 文件中。执行如下操作,打开命令行窗口,并定位到 JMETER_HOME/bin 目录,运行如下命令 jar uf ApacheJMeter.jar jndi.properties 就可以,
命令行:jar uf ApacheJMeter.jar jndi.properties
3、拷贝Active所需用到的包文件到jMeter的lib下面
jmeter 在测试 jms 的时候会使用到 activemq 提供的 jms 的实现类,这些类并没有随 jmeter 一起分发,所以需要把这些类添加到 jmeter 的 classpath 中。只要把 ACTIVE_HOME/activemq-all-5.2.0.jar 文件复制到 JMETER_HOME/lib 目录中即可。
重启JMeter,添加取样器列表可以看到有JMS的选择
这里,发送MQ的脚本就完成了
三种方式:
1、jms to jms
tcp://localhost:61616
测试JMS的PUB/SUB模式
步骤:
jms的订阅(消费)
在这里添加响应的信息,进行请求,会一直等待状态
jms的发送者:
请求消息,再来看订阅者,就会看到消息接收
[Jmeter(四十九)jmeter+influxdb+Granfna集成win部署]
其实很多时候,群众是很好说话的,因为他们所需要的并非特权,而是公平
******--当年明月《明朝那些事儿》
由于是win本地部署,jmeter部署看前面文章即可,本篇主要记录influxdb+granfna
一、influxdb
1、influxdb官网下载win的安装包
2、解压至本地
3、修改配置文件,下载下来的配置文件为:influxdb.conf;一般win都推荐influxdb.config使用config后缀的配置,其实两种配置文件都试了试,都可用
4、修改配置文件内容,路径改成自己本地路径
meta部分:
[meta]
# Where the metadata/raft database is stored
dir = "D:\usuallySoftwere\influxdb-1.7.7-1\meta"
# Automatically create a default retention policy when creating a database.
retention-autocreate = true
# If log messages are printed for the meta service
logging-enabled = true
data部分:
[data]
# The directory where the TSM storage engine stores TSM files.
dir = "D:\usuallySoftwere\influxdb-1.7.7-1\data"
# The directory where the TSM storage engine stores WAL files.
wal-dir = "D:\usuallySoftwere\influxdb-1.7.7-1\wal"
retention部分:
[retention]
# Determines whether retention policy enforcement enabled.
enabled = true
# The interval of time when retention policy enforcement checks run.
check-interval = "30m"
shard-precreation部分:
[shard-precreation]
# Determines whether shard pre-creation service is enabled.
enabled = true
# The interval of time when the check to pre-create new shards runs.
check-interval = "10m"
# The default period ahead of the endtime of a shard group that its successor
# group is created.
advance-period = "30m"
http部分:
[http]
# Determines whether HTTP endpoint is enabled.
enabled = true
# Determines whether the Flux query endpoint is enabled.
# flux-enabled = false
# Determines whether the Flux query logging is enabled.
# flux-log-enabled = false
# The bind address used by the HTTP service.
bind-address = ":8086"
# Determines whether user authentication is enabled over HTTP/HTTPS.
auth-enabled = false
# The default realm sent back when issuing a basic auth challenge.
# realm = "InfluxDB"
# Determines whether HTTP request logging is enabled.
# log-enabled = true
# Determines whether the HTTP write request logs should be suppressed when the log is enabled.
# suppress-write-log = false
# When HTTP request logging is enabled, this option specifies the path where
# log entries should be written. If unspecified, the default is to write to stderr, which
# intermingles HTTP logs with internal InfluxDB logging.
#
# If influxd is unable to access the specified path, it will log an error and fall back to writing
# the request log to stderr.
# access-log-path = ""
# Filters which requests should be logged. Each filter is of the pattern NNN, NNX, or NXX where N is
# a number and X is a wildcard for any number. To filter all 5xx responses, use the string 5xx.
# If multiple filters are used, then only one has to match. The default is to have no filters which
# will cause every request to be printed.
# access-log-status-filters = []
# Determines whether detailed write logging is enabled.
# write-tracing = false
# Determines whether the pprof endpoint is enabled. This endpoint is used for
# troubleshooting and monitoring.
# pprof-enabled = true
# Enables a pprof endpoint that binds to localhost:6060 immediately on startup.
# This is only needed to debug startup issues.
# debug-pprof-enabled = false
# Determines whether HTTPS is enabled.
# https-enabled = false
# The SSL certificate to use when HTTPS is enabled.
# https-certificate = "/etc/ssl/influxdb.pem"
# Use a separate private key location.
# https-private-key = ""
# The JWT auth shared secret to validate requests using JSON web tokens.
# shared-secret = ""
# The default chunk size for result sets that should be chunked.
# max-row-limit = 0
# The maximum number of HTTP connections that may be open at once. New connections that
# would exceed this limit are dropped. Setting this value to 0 disables the limit.
# max-connection-limit = 0
# Enable http service over unix domain socket
# unix-socket-enabled = false
# The path of the unix domain socket.
# bind-socket = "/var/run/influxdb.sock"
# The maximum size of a client request body, in bytes. Setting this value to 0 disables the limit.
# max-body-size = 25000000
# The maximum number of writes processed concurrently.
# Setting this to 0 disables the limit.
# max-concurrent-write-limit = 0
# The maximum number of writes queued for processing.
# Setting this to 0 disables the limit.
# max-enqueued-write-limit = 0
# The maximum duration for a write to wait in the queue to be processed.
# Setting this to 0 or setting max-concurrent-write-limit to 0 disables the limit.
# enqueued-write-timeout = 0
graphite部分:
[[graphite]]
# Determines whether the graphite endpoint is enabled.
enabled = true
database = "jmeter"
# retention-policy = ""
bind-address = ":2003"
protocol = "tcp"
consistency-level = "one"
# These next lines control how batching works. You should have this enabled
# otherwise you could get dropped metrics or poor performance. Batching
# will buffer points in memory if you have many coming in.
# Flush if this many points get buffered
# batch-size = 5000
# number of batches that may be pending in memory
# batch-pending = 10
# Flush at least this often even if we haven't hit buffer limit
# batch-timeout = "1s"
# UDP Read buffer size, 0 means OS default. UDP listener will fail if set above OS max.
# udp-read-buffer = 0
### This string joins multiple matching 'measurement' values providing more control over the final measurement name.
# separator = "."
### Default tags that will be added to all metrics. These can be overridden at the template level
### or by tags extracted from metric
# tags = ["region=us-east", "zone=1c"]
### Each template line requires a template pattern. It can have an optional
### filter before the template and separated by spaces. It can also have optional extra
### tags following the template. Multiple tags should be separated by commas and no spaces
### similar to the line protocol format. There can be only one default template.
# templates = [
# "*.app env.service.resource.measurement",
# # Default template
# "server.*",
# ]
###
### [collectd]
###
### Controls one or many listeners for collectd data.
###
可以看到基本上都是对配置的打开,graphite部分和http部分涉及自定义配置
5、启动influxdb,指定配置文件
命令:influxd -config influxdb.config
6、启动成功
二、Granfna
1、官网下载win安装包
2、配置influxdb库信息(注意:库有设置密码就填入密码,未设置密码便不用填写,直接连接即可)
3、导入jmeter模板(模板很多,百度一下,或者官网查找)
三、jmeter配置
1、添加后置监听器进行配置
后端监听器实现选择:org.apache.jmeter.visualizers.backend.influxdb.InfluxdbBackendListenerClient
参数配置:
influxdbUrl :http://localhost:8086/write?db=jmeter
application :jmeter
measurement :jmeter
summaryOnly : false
samplersRegex :*
其余默认即可
配置完成。
[Jmeter(五十)Dubbo Sampler]
智力和智慧是两码事,很多人有智力,但不一定有智慧。
---《法治的细节》罗翔
一、前言
随着分布式普及,日常工作中多少会接触到dubbo,对于dubbo接口的调用或者压测等等。
调用最简单的方式便是telnet,或者泛化调用的方式。
进入telnet命令行,invoke 对应方法以及传入对应的参数即可。
当然jm也有对应开源插件。
二、原料和配件
下载完成,放入${jmeter_home}/lib/ext目录下,重启jm即可
三、参数详解
① Registry Center(注册设置) 区域填写内容:
直连的方式,Protocol选none。其他的选择对应的注册中心即可,可以看到有zk,nacos等等
②Consumer&Service Settings(消费者和服务者设置):
Timeout:设置请求接口超时时间,默认1000ms, 就用默认的就行,如果实际接口响应比较慢,也可以改大点,比如改成5000
Version:版本,一般无需填写。Dubbo不同版本之间差异较大,不同版本之间不能互相调用。注意:默认这里填的是1.0,现在dubbo的版本都是2.xx了,因此直接删掉版本号,就让这里为空,不然用默认的1.0会调不通。最开始我没有管这个值,结果发现调不通,删了version的值就成功调通了。
后面其他的几项值都不管,保持默认就行。
③Get Provider List按钮:
根据Address填写的地址,获取服务提供者的服务列表。直连的方式下,点这个按钮没用,会提示让你把Protocol选为zookeepr or nacos or redis, 但是直连的时候Protocol要选none, 所以直连的时候就手动在下面去填interface和method,不用 Get Provider List按钮来获取。
④Interface 填 dubbo的接口:如com.xxx.xxx.xxxService
⑤Args:接口入参,输入对应的参数类型和参数值
paramType:参数支持任何类型,可以直接使用java.lang下的包装类,如:int、float、shot、double、long、byte、boolean、char、String等。类型也可以是自定义对象POJO,需使用类的完全名称。
paramValue:填写需要的参数值,例如:int为1,boolean为true等,自定义类与List或者Map等使用Json格式数据。
按照具体入参传入即可。
[Jmeter(五十一)上传类接口测试]
人的一切痛苦,本质上都是对自己无能的愤怒
----《认知觉醒:开启自我改变的原动力》
一、HTTP 请求中勾选Use Multipart/form-data
二、传入其他参数于Parmameters
三、Files Upload选项卡传入本地excel路径即可
注:Mime Type类型,观察接口原始报文传的类型
[Jmeter(五十二)PostMan的json格式文件转换为jmx文件]
他年我若为青帝,报与桃花一处开
---黄巢
一、环境准备
**1. maven
2. postman
- jmeter**
二、将PostMan的接口请求导出来
export即可
三、拉取项目并构建
git clone https://github.com/Loadium/postman2jmx.git
拉取完成进行构建
cd postman2jmx
mvn package
进入构建完成的target/postman2jmx目录postman2jmx.jar,则完成
四、进行转换
在构建完成的目录下启动jar,传参即可:
需要传两个参数:
- 第一个参数为postman导出的json文件;
- 第二个参数为要生成的Jmeter的脚本文件名(.jmx);
java -jar Postman2Jmx.jar my_postman_collection.json my_jmx_file.jmx
jmx文件已生成,完!