JMeter使用正则表达式和JSON提取器实现关联
前言
1 关联的释义与示例
2 常用正则表达式详解
3 正则表达式提取器
4 JSON提取器
5 疑难杂症
5.1 提取多个值
5.2 多个值合并
5.3 左右边界不好确定
5.4 多个匹配结果
5.5 其他特殊用法
前言
使用JMeter做接口测试的过程中,将多个接口在逻辑上串联起来可以说是接口测试的灵魂,而关联是实现这个串联的关键步骤。
本文主要内容是:使用使用正则表达式提取器和JSON提取器实现关联。
下文中会多次使用到BeanShell Sampler
和Debug Sampler
,前者其实是起到一个mock server
的作用,返回自定义的响应结果,后者能够输出JMeter
的变量情况。
关于JMeter的使用,花费大量精力写了JMeter的一系列文章,有图有案例,一方面总结起来作为备忘,一方面希望能给初学者一些帮助。觉得有所帮助的朋友,请点个赞,对于疏漏之处也欢迎指教。
JMeter逻辑控制器 :https://blog.csdn.net/mu_wind/article/details/91879280
JMeter配置元件 :https://blog.csdn.net/mu_wind/article/details/92796646
JMeter操作Mysql数据库 : https://blog.csdn.net/mu_wind/article/details/93312052
BeanShell Sampler与BeanShell断言 :https://blog.csdn.net/mu_wind/article/details/93506974
JMeter Linux下执行测试 :https://blog.csdn.net/mu_wind/article/details/95733081
JMeter自定义日志与日志分析 :https://blog.csdn.net/mu_wind/article/details/95752633
1 关联的释义与示例
那么,什么是关联?接口测试的关联,指的是前接口相应结果的某个数据(这个数据往往是动态而无法预知的),被后面的接口引用作为请求参数。
以一个查询商品-购买商品的流程为例,查询商品接口获取到特定的商品id,购买商品接口则以此id为参数,才能向后端发起确切的请求,也就是明确购买哪个商品。贴上一个简陋的示意图:
那么,在JMeter接口测试中,怎么实现关联呢?
接下来,我们以 WeatherWS 这个网站的两个接口为示例,使用【正则表达式提取器】完成一个关联实现。
接下来的测试场景是这样的:
请求 getRegionProvince
接口,得到包含各个省份 code
的列表,并在这个列表里提取北京 的 code
将北京的 code
作为getSupportCityDataSet
接口 theRegionCode
参数的参数值,请求接口得到北京下辖的行政区域列表。
getRegionProvince 的接口说明如下:
GET / WebServices/ WeatherWS. asmx/ getRegionDataset? HTTP/ 1.1
Host: ws. webxml. com. cn
HTTP/ 1.1 200 OK
Content- Type: text/ xml; charset= utf- 8
Content- Length: length
< ? xml version= "1.0" encoding= "utf-8" ? >
< DataSet xmlns= "http://WebXml.com.cn/" >
< schema xmlns= "http://www.w3.org/2001/XMLSchema" > schema< / schema> xml< / DataSet>
getSupportCityDataSet 的接口说明如下:
GET / WebServices/ WeatherWS. asmx/ getSupportCityDataset? theRegionCode= string HTTP / 1.1
Host: ws. webxml. com. cn
HTTP / 1.1 200 OK
Content- Type: text/ xml; charset= utf- 8
Content- Length: length
< ? xml version= "1.0" encoding= "utf-8" ? >
< DataSet xmlns= "http://WebXml.com.cn/" >
< schema xmlns= "http://www.w3.org/2001/XMLSchema" > schema< / schema> xml< / DataSet>
根据上面的接口说明,先建立下面的脚本: 整体的脚本结构如上图所示,下面依次看每个组件的内容和作用。
1、【HTTP请求】getRegionProvince
:
IP:ws.webxml.com.cn
路径:/WebServices/WeatherWS.asmx/getRegionDataset
作用:获得中国省份、直辖市、地区;国家名称(国外)和与之对应的ID
相应结果(为节省篇幅,删除了大量无关数据):
< ? xml version= "1.0" encoding= "utf-8" ? >
< DataSet xmlns= "http://WebXml.com.cn/" >
< xs: schema id= "getRegion" xmlns= "" xmlns: xs= "http://www.w3.org/2001/XMLSchema" xmlns: msdata= "urn:schemas-microsoft-com:xml-msdata" >
< / xs: schema>
< diffgr: diffgram xmlns: msdata= "urn:schemas-microsoft-com:xml-msdata" xmlns: diffgr= "urn:schemas-microsoft-com:xml-diffgram-v1" >
< getRegion xmlns= "" >
< Province diffgr: id= "Province5" msdata: rowOrder= "4" >
< RegionID> 3117 < / RegionID>
< RegionName> 河北< / RegionName>
< / Province>
< Province diffgr: id= "Province29" msdata: rowOrder= "28" diffgr: hasChanges= "inserted" >
< RegionID> 311101 < / RegionID>
< RegionName> 北京< / RegionName>
< / Province>
< Country diffgr: id= "Country1" msdata: rowOrder= "0" >
< RegionID> 3320 < / RegionID>
< RegionName> 阿尔及利亚< / RegionName>
< / Country>
< / getRegion>
< / diffgr: diffgram>
< / DataSet>
观察相应结果,北京的RegionID
是311101,但如何将它提取出来并保存到变量中呢?这就要用到【正则表达式提取器】了。在HTTP请求getRegionDataset
上添加【后置处理器】-【正则表达式提取器】。
2、【正则表达式提取器】:
引用名称:code,后面引用该值时,将使用${code}
的固定写法。
正则表达式:(.+?) \r\n\ 北京
,注意中间的8个空格,不能多一个也不能少一个。
模板:$1$
,表示取第一列,下文【正则表达式提取器】会有详细解释。
匹配数字:1,表示取第一行,下文【正则表达式提取器】会有详细解释。
3、【HTTP请求】getSupportCityDataSet
:
IP:ws.webxml.com.cn
路径:/WebServices/WeatherWS.asmx/getSupportCityDataset?theRegionCode=${code}
作用:获得支持的城市/地区名称和与之对应的ID
相应结果:
2 常用正则表达式详解
正则表达式 描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
正则表达式是相对繁琐抽象的,理解和记忆难度较高,因此这里对JMeter中能用到的正则表达式语法(主要是限定符)进行一下讲解。
据我个人经验,(.+?)这个表达式基本就够用了,何况正则表达式提取远不如JSON提取器使用频率高,所以这一节大可以略过,直接看第三节。
字 符
描 述
.
匹配除换行符 \n 之外的任何单字符
*
贪婪,匹配前面的子表达式零次或多次,等价于{0,}
+
占有,匹配前面的子表达式一次或多次,等价于{1,}
?
懒惰,匹配前面的子表达式零次或一次 ,等价于 {0,1}
{n}
n 是一个非负整数。匹配确定的 n 次。例如a{3}匹配“aaaaa”,能匹配到“aaa”
{n,m}
重复n到m次,例如正则 “a{3,4}” 将a重复匹配3次或者4次
*?
重复任意次,但尽可能少重复,如 “acbacb” 正则 “a.*?b” 只会取到第一个"acb"
+?
重复1次或更多次,但尽可能少重复,与上面一样,不同的是至少重复一次
??
重复0次或1次,但尽可能少重复,如 “aaacb” 正则 “a.??b” 只会取到最后的三个字符"acb"
{n,m}?
重复n到m次,但尽可能少重复,如 “aaaaaaaa” 正则 “a{0,m}” 因为最少是0次所以取到结果为空
{n,}?
重复n次以上,但尽可能少重复,如 “aaaaaaa” 正则 “a{1,}” 最少是1次所以取到结果为 “a”
部分表达式使用【正则表达式测试器】实测结果如下:
*
:0次或多次,因为0个也被能匹配,所以b、c和末尾被匹配成空
+
:一个或多个,因为至少要匹配一个,不会有空字符串
?
:0个或一个,同*一样,没有a的被匹配成空字符串
a{n}
:
a{n,m}
:
a{n,}
:
3 正则表达式提取器
正则表达式提取器一般在取样器上创建,它的作用是在取样器(包括HTTP请求和BeanShell Sampler及其他取样器)的结果中按照一定的规则提取特定的值,并保存到内存中的某一个字段上,正则表达式所在的取样器之后的组件,都能通过引用方式(格式:${XXX}
)使用该值。
3.1 参数详解
名称
描述
必须
名称
脚本中显示的这个元件的描述性名称
是
Apply to
Main sample only:仅适用于主样本,默认用这个就可以了
是
Field to check
要检查的响应字段 ,即在取样器响应内容的哪个区域进行匹配
是
Name of created variable
引用名称 ,即匹配到的变量存储的名称,一般会有[refname]_g(匹配数量)、[refname]_g0 (整体)、[refname]_gn(某个具体匹配值)等多个变量,
是
Regular Expression
正则表达式 ,用于分析响应数据的正则表达式,除非使用$0$组,否则必须至少包含一组括号
是
Template
模板 ,如果在正则表达式中有多列 结果,则可以是$2$$3$等等,表示解析到的第几个值给title,如:$1$表示解析到的第1个值
是
Match No. (0 for Random)
匹配数字 ,取第几行 ,0代表随机取值,-1代表全部取值,1、2、3等表示多行返回值取第几个值。
是
Default Value
缺省值,如果表达式没有取得到值,就使用这个默认值
是
Use empty default value
勾选此项后,如果未提取到值,则给变量赋予空字符串,而不是null
是
3.2 使用示例
先看这么一个场景,假如响应内容ccBBmmAABBAAddBBAA
,想在该响应内容中提取AAddBB
并存储到参数test
中,该如何处理?
首先,观察待匹配字符串的左右边界分别是BB
和AA
,那么正则表达式应写成BB(.+?)AA
,在【正则表达式测试器】中测试一下: 可以看到,第1列(列从0开始计数)第二行是我们想要的结果,因此【正则表达式提取器】中按下图填写: 接下来,我们使用【BeanShell Sampler】模拟服务,来测试一下: HTTP请求IP中引用正则表达式提取器提取到的test
:
4 JSON提取器
在【后置处理器】中,有一个【JSON提取器】,与【正则表达式提取器】有类似的作用,不同的是,前者专为处理JSON型的响应结果而生。
4.1 参数详解
名称
描述
必须
Name
名称 ,脚本中显示的这个元件的描述性名称
是
Names of chreated variables
匹配到的数据存储的变量名称,后续可以使用${variable name}
引用它
是
JSON Path Expressions
JSON路径表达式
是
Default Values
默认值,如果JSON 路径表达式未能匹配到值,将使用该默认值
是
Match No. (0 for Random)
如果匹配到多个结果,选择使用哪个。0代表随机,-1代表全部,x代表第x个
是
Compute concatenation var
勾选此项后,如果匹配到多个结果,JMeter会使用","将他们连接起来,存储在的变量中
是
4.2 使用示例
接下来,我们看一个示例:
假如接口返回下面的JSON数据,我们想在其中提取“周芷若”到“name”参数中。
{
"status" : 200 ,
"data" : [ { "id" : 101 , "name" : "张无忌" } , { "id" : 102 , "name" : "周芷若" } ]
}
首先,构造脚本结果如下图,【BeanShell Sampler】作为mock server返回上面的数据:
return "{\"status\":200,\"data\":[{\"id\":101,\"name\":\"张无忌\"},{\"id\":102,\"name\":\"周芷若\"}]}";
在【BeanShell Sampler】下面添加【后置处理器】–【JSON Extractor】 这里解释一下【JSON Path expression】的写法,
. 首先$.
这部分是固定写法
data
表示在JSON串以"data"为key获取value,也就是"[{\"id\":101,\"name\":\"张无忌\"},{\"id\":102,\"name\":\"周芷若\"}]
"。
data
所对应的值是一个JSONArray
(JSON数组)格式,里面有两个JSONObject(JSON对象),第二个JSONObject是我们需要的,因此再按索引值"1"去获取,写作data[1]
,写到这里,我们得到了{\"id\":102,\"name\":\"周芷若\"}
这个JSONObject
,接下来再根据name
这个key去获取相应的值,就得到"周芷若"了。
运行脚本,查看结果树中的【Debug Sampler】的响应数据:
后来在自己开发接口自动化框架的过程中,借鉴JMeter的这个功能,做了一个工具类,在响应结果是JSON串的接口中提取数据十分方便。
import com. alibaba. fastjson. JSON ;
import com. alibaba. fastjson. JSONArray;
import com. alibaba. fastjson. JSONObject;
import java. util. HashMap;
import java. util. Map;
import java. util. regex. Matcher;
import java. util. regex. Pattern;
public class JsonPathExpression {
public static void main ( String[ ] args) {
String str = "{\"data\" : {\"deth\" : {\"bids\" : [[\"3.637\", \"360000\"]],\"asks\" : [[\"4.273\", \"662\"],[[{\"a\":[1,2]}]]]}}}" ;
String result = jsonPathExpression ( str, "$.data.deth.asks[1].[0].[0].a[1]" ) ;
System. out. println ( result) ;
}
public static String jsonPathExpression ( String jsonString, String matcher) {
String[ ] jsons = matcher. split ( "\\." ) ;
JSONObject object = JSON . parseObject ( jsonString) ;
JSONArray array = new JSONArray ( ) ;
String result = "" ;
int index;
for ( int i = 1 ; i < jsons. length; i++ ) {
if ( jsons[ i] . contains ( "[" ) ) {
index = getIndex ( jsons[ i] ) ;
if ( i == jsons. length - 1 ) {
if ( jsons[ i] . length ( ) <= 3 ) {
result = array. getString ( index) ;
} else {
array = object. getJSONArray ( jsons[ i] . split ( "\\[" ) [ 0 ] ) ;
result = array. getString ( index) ;
}
} else {
if ( jsons[ i] . length ( ) <= 3 ) {
try {
array = array. getJSONArray ( index) ;
} catch ( Exception e) {
object = array. getJSONObject ( index) ;
}
} else {
try {
array = object. getJSONArray ( jsons[ i] . split ( "\\[" ) [ 0 ] ) . getJSONArray ( index) ;
} catch ( Exception e) {
object = object. getJSONArray ( jsons[ i] . split ( "\\[" ) [ 0 ] ) . getJSONObject ( index) ;
}
}
}
} else {
if ( i != jsons. length - 1 ) {
object = object. getJSONObject ( jsons[ i] ) ;
} else {
result = object. getString ( jsons[ i] ) ;
}
}
}
return result;
}
public static int getIndex ( String string) {
try {
String regEx = "[^0-9]" ;
Pattern pattern = Pattern. compile ( regEx) ;
Matcher matcher = pattern. matcher ( string) ;
String index = matcher. replaceAll ( "" ) . trim ( ) ;
return Integer. valueOf ( index) ;
} catch ( Exception e) {
return 0 ;
}
}
}
5 疑难杂症
这一节主要记录一些比较特殊的场景和其解决方案。
5.1 提取多个值
{
"result" : {
"similar" : [ {
"id" : "us-B072HFDHKY" ,
"asin" : "B072HFDHKY"
} , {
"id" : "us-B073WM827B" ,
"asin" : "B073WM827B"
} , {
"id" : "us-B07GY17KFZ" ,
"asin" : "B07GY17KFZ"
} , {
"id" : "us-B076NYPS7M" ,
"asin" : "B076NYPS7M"
} , {
"id" : "us-B07NSBBX7L" ,
"asin" : "B07NSBBX7L"
} , {
"id" : "us-B077W9GHDV" ,
"asin" : "B077W9GHDV"
}
]
} ,
"code" : 0 ,
"message" : "操作成功!"
}
以上场景,响应结果是JSON格式,在正常情况下,使用【后置处理器】中的【JSON Extractor】显然是很方便的(提取路径:$.result.similar[0].asin
即可获取第一个 asin 的值)。但由于要提取不止一个 asin 值,【JSON Extractor】就不太适用了,这时候要用到【正则表达式提取器】。
建立下面的脚本结构: 【BeanShell Sampler】的作用依然是模拟接口响应:
return
"{\"result\":{\"similar\":[{\"id\":\"us-B072HFDHKY\",\"asin\":\"B072HFDHKY\"},{\"id\":\"us-B073WM827B\",\"asin\":\"B073WM827B\"},{\"id\":\"us-B07GY17KFZ\",\"asin\":\"B07GY17KFZ\"},{\"id\":\"us-B076NYPS7M\",\"asin\":\"B076NYPS7M\"},{\"id\":\"us-B07NSBBX7L\",\"asin\":\"B07NSBBX7L\"},{\"id\":\"us-B077W9GHDV\",\"asin\":\"B077W9GHDV\"}]},\"code\":0,\"message\":\"操作成功!\"}" ;
【正则表达式提取器】: 正则表达式:"asin":(.+?)"}
运行脚本,查看结果: 可见,所有 asin 值已经被提取并保存在内存中,后续的组件中可以任意引用。
引用值
5.2 多个值合并
如果响应内容是
,我们同时提取到Author:Muguozheng
、Author
、Muguozheng
作为下次请求参数,该如何做呢?
首先,去【正则表达式试验器】中测试 根据匹配要求和正则表达式的测试结果,【正则表达式提取器】如下: 正则表达式:
模板:$1$;$2$
运行后查看结果树,后面的sampler(取样器)引用规则如下:
使用${test}
可以引用Author:Muguozheng
使用${test_g}
可以引用2
这个数值
使用${test_g0}
可以引用
使用${test_g1}
可以引用Author
使用${test_g2}
可以引用Muguozheng
5.3 左右边界不好确定
假如响应结果是这么一个字符串:
(向三位大佬致敬),想要提取马化腾
这个值。
这个例子的难点在于,正则表达式的左右边界无法确定,因为马化腾
的右边界,刘强东
也是响应内容中的动态值(这里的动态指的是,下次请求整体的响应内容可能变成"")。
这里,正则表达式写成下面的样式即可: 于是,【Beanshell Sampler】写入模拟数据
return "" ;
【正则表达式提取器】可以如下图输入: 正则表达式:
模板:$2$
运行后查看结果树:
5.4 多个匹配结果
在实际工作中,接口响应结果可能是一个集合,具有同样的左右边界,但我们需要的是最新的那条,一般是最后一条。
如下,新建一个【Beanshell Sampler】模拟接口:
return "您的验证码是:400836,切勿将验证码告诉他人 您的验证码是:54297,切勿将验证码告诉他人 您的验证码是:65291,切勿将验证码告诉他人 ";
接下来在【Beanshell Sampler】下创建【正则表达式提取器】(匹配数字写-1,表示取所有匹配结果): 正则表达式:您的验证码是:(.+?),切勿将
添加【Debug Sampler】和【查看结果树】后运行脚本,在【查看结果树】中可以看到,【正则表达式提取器】匹配结果:
code_1= 400836
code_1_g= 1
code_1_g0= 您的验证码是:400836 ,切勿将
code_1_g1= 400836
code_2= 54297
code_2_g= 1
code_2_g0= 您的验证码是:54297 ,切勿将
code_2_g1= 54297
code_3= 65291
code_3_g= 1
code_3_g0= 您的验证码是:65291 ,切勿将
code_3_g1= 65291
code_matchNr= 3
那么我们想获得匹配结果的最后一个,该怎么操作呢?这个问题的难点在于,事先无法确定匹配结果的数量,而解决这个难点的关键就在于code_matchNr
这个参数,它的含义是匹配到的结果的数量,它的值就是最后一个匹配结果的索引。
很明显,取code_${code_matchNr}
就等值于code_3,无论匹配结果的数量是多少,code_${code_matchNr}
都代表着最后一条结果。
JMeter不支持嵌套引用,所以${code_${code_matchNr}}
这种写法是不正确的。想正确引用该值,需要打开【Tools】-【函数助手对话框】,选择_V
,填入code_${code_matchNr}
,点击生成: ${__V(code_${code_matchNr})}
这个表达式就表示引用了匹配结果的最后一个。
5.5 其他特殊用法
在身份证中匹配提取出生日期,正则表达式如下图:
以上就是如何使用正则表达式提取器和JSON提取器实现关联 的全部内容,觉得不错的朋友请点个赞和收藏,有不准确之处,欢迎指正。
你可能感兴趣的:(#,JMeter)
JMeter 4.0 mac上配置代理录制脚本
GoGooGooo
添加线程组添加http代理服务器设置mac网页代理设置http代理服务器启动,访问指定网站,去线程组里查看拦截的请求
性能测试的复习2-jmeter的搭建、使用、参数化
暖阳与晚风
jmeter jmeter
通过网盘分享的文件:性能测试共享文件链接:https://pan.baidu.com/s/1A4Nc8C5Xp6qxQ5QFtecK8g?pwd=s73c提取码:s73c1、性能测试工具2、jmeter环境搭建3、jmeter的基本使用4、jmeter的参数化
2.Jmeter安装配置,核心目录详情,组件和作用域
XXX-17
Jmeter jmeter 软件测试 接口测试
一、Jmeter安装配置以及核心目录详情Jmeter基于java语言来开发,java需要jdk环境。1.安装jdk并且配置jdk的环境变量。2.jmeter只需要解压就可以使用了。3.在D:\apache-jmeter-5.5\bin目录下双击jmeter.bat文件就可以启动使用了backups:自动备份的目录bin:启动文件、配置文件(jmeter.bat是启动问题,jmeter.propti
使用Docker部署Jmeter+InfluxDB+Grafana 搭建性能监控平台
Geraint丶
docker jmeter
前言之前写过一篇《linux下性能测试监控平台InfluxDB+Grafana+Jmeter的搭建》,后来在应用中发现,在linux下部署多个原生服务组合使用时移植性较差,每次更换一台linux机器都需要重新搭建所有的服务,在安装和修改配置文件的过程中很容易出现各种各样的问题,而且排查问题非常的耗费时间。Docker部署方便,没有那么多的环境参数配置,隔离性好,更重要是可移植性强,可以完美避开li
性能测试-jmeter连接数据库(十七)...
暖阳与晚风
jmeter jmeter
百度服务器域名:www.baidu.com百度的IP:110.242.68.3(使用pingwww.baidu.com)jdbc:mysql://211.103.136.244:7061/test_db:mysql是数据库类型211.103.136.244是服务器IP7061是服务器端口号test_db是服务器的数据库一、为什么要连接数据库1、校验测试数据2、构造测试数据二、连接数据库的步骤1、添
Jmeter性能测试六--Jmeter录制+服务器监控
鱼排也爱小白菜
jmeter
一、排除模式填写测试计划右键添加-->非测试原件-->HTTP代理服务器端口设置:不能填本机已存在的端口排除模式填写:(?i).*\.(bmp|css|js|gif|ico|jpe?g|png|swf|woff|woff2|html|htm).*点击启动录制结果二、服务器脚本运行1.上传脚本包后需要先解压unzipServerAgent-2.2.3.zipcdServerAgent-2.2.3.z
Jmeter性能-压测脚本录制与编写
HHX__HHX
jmeter 测试工具
#学习打卡第6天今天学习主题:jmeter性能学习目标:压测脚本录制与编写--压测脚本录制与编写1、jmeter配置添加线程组添加recordingcontroller抓取请求添加viewresultstree添加HTTP(s)TestScriptRecorder2、浏览器配置使用firefox浏览器,下载插件omega,设置本机代理,IP地址:127.0.0.1;端口号:8888打开代理模式3、
jmeter常见压测错误解决
打工人996
服务器 运维
错误一:Responsecode:NonHTTPresponsecode:java.net.SocketTimeoutExceptionResponsemessage:NonHTTPresponsemessage:connecttimedout查看Loadtime的时间要大于request设置的connecttimeout时间,因此抛出该异常。多是因为服务端有较多请求正在处理(且处理时间较长),致
jmeter组件
澄子_向钱看
一.性能测试1.0为什么要进行性能测试?评估当前系统的能力寻找性能瓶颈,优化系统性能评估软件是否满足未来的需要招聘需要1.1什么是性能时间:系统处理用户请求的响应时间资源:系统运行过程中,系统资源的消耗情况1.2.性能测试是什么1.2.1广义定义基于协议模拟用户发出请求,对服务器形成一定负载,来测试服务器的性能指标是否满足要求性能指标关注点:时间性能、空间性能性能测试与页面无关1.2.1狭义定义指
一篇文章教你如何读懂 JMeter聚合报告参数!
程序员潇潇
软件测试 postman 测试工具 软件测试 功能测试 自动化测试 程序人生 职场和发展
线程组参数解释线程数(即并发数):一个用户占一个线程,200个线程就是模拟200个用户;Ramp-Up时间(秒):设置线程需要多长时间全部启动;如果线程数为200,准备时长为10,那么需要1秒钟启动20个线程;也就是每秒钟启动20个线程;循环次数:一次场景下来,请求的数量=线程数*循环次数;如果线程数为200,循环次数为10,那么每个线程发送10次请求;总请求数为200*10=2000;如果勾选了
Jmeter压测记录
西电大侠
1、配置压测参数第一步,先启动jmeter,具体如下image.png配置相关参数image.pngimage.pngimage.pngnumberofthreads(线程数):就是模仿用户并发的数量,Ramp-up:运行线程的总时间,单位是秒。loopcount(循环次数):就是每个线程循环多少次。我现在的线程数是50,就是相当于有50个用户,运行线程的总时间是1秒。也就是说在这1秒中之内50个
mac 版本Jmeter安装教程
weixin_58693614
macos jmeter java
1.确认是否安装JDK*打开终端->输入java-version(注意空格)会出现版本信息javaversion"16.0.1"2021-04-20Java(TM)SERuntimeEnvironment(build16.0.1+9-24)JavaHotSpot(TM)64-BitServerVM(build16.0.1+9-24,mixedmode,sharing)2.若没有安装,移步官网下载安
JMETER+ANT+JENKINS持续集成并生成html报告
qq_40447533
jmeter 持续集成
1.下载ant2.配置build.xml文件3.在本地运行antrun4.部署到jenkins上5.在jenkins上查看测试报告jenkins-HTMLreport没有css样式问题注;如果运行后还是没有css样式,清理缓存试试对于测试报告来说,除了内容的简洁精炼,样式的美观也很重要。常用的做法是,采用HTML格式的文档,并搭配CSS和JS,实现自定义的样式和动画效果(例如展开、折叠等)。在Je
jmeter远程启动配置
雪霁_
性能测试 压力测试 jmeter linux
前提条件保持windows端、linux端jdk版本一致配置linux压力机(配置agent)修改文件jmeter.properties,打开注释server_port开启端口(默认1099);打开注释,修改server.rmi.ssl.disable=false为true运行命令,./jmeter-server-Djava.rmi.server.hostname=10.0.0.48(ip为lin
Jmeter测试本地web应用
会飞的猫丶。
测试
一、Jmeter下载及安装官网:http://jmeter.apache.org/下载:下载源码:解压到相关文件夹:打开bin里面的jmeter.bat就可以使用了二、看不懂英文的可以把语言切换为中文:选择options--->chooselanguage--->chinese三、新建线程组1)线程数:指的是用户的请求数,默认的输入是“1”,如果想模拟100个请求,则此处输入100。2)Ramp-
Jmeter、Python、Postman测试工具对比
测试界的海飞丝
软件测试 自动化测试 测试工具 jmeter python
一、JMeter总结:适合对代码不敏感的使用人员,不会代码也可以完成接口自动化,设计框架。适合紧急迭代的项目。JMeter接口测试的优势小巧轻量级,并且开源免费,社区接受度高,比较容易入门支持多协议,并提供了比较高级的扩展能力,允许自己定义和扩展新的协议支持,比如扩展支持阿里提供的Dubbo协议的JMeter插件等学习者不需要会代码,不需要编程,熟悉http请求,熟悉业务流程,就可以根据页面中in
“Jmeter-InfluxDB-Grafana“常见错误有哪些如何解决?
神即道 道法自然 如来
jmeter grafana
常见错误:1.网络不同,检查网络IP是否写对,端口号有没有放开(Centos7端口号命令),防火墙是否关闭firewall-cmd--add-port=3000/tcp--permanentfirewall-cmd--add-port=3000/udp--permanentfirewall-cmd--reload2.Jmeter里面的influxDB地址里面的db=jmeter,和在influxd
jmeter持续时间循环控制器_jmeter 循环控制器使用
weixin_39610759
jmeter持续时间循环控制器
案例一:一、认识循环控制器如下图:新增一个循环控制器循环控制器的设置界面:循环次数:永远和自定义次数,这个应该比较好理解。二、使用循环控制器其实大家对Jmeter的熟悉的话,应该会想到,线程组这个设置界面也是有一个循环次数的设置,那么到底他们两个有什么关联呢。我理解为父子关系。下面举个例子,首先在线程组中设置循环次数3,循环控制器中设置循环测试2,其他默认,添加一个计时器,方便查看结果,如下:执行
jmeter 获取全部响应_Jmeter 记录请求和响应信息
weixin_39603609
jmeter 获取全部响应
Jmeter默认是不记录请求和响应的具体信息的,不过依照这一篇的方法,可以记录下响应数据。然而,仍然没有办法记录请求的数据。本文将探索如何做到记录请求数据到文件。本文使用的Jmeter是4.0版本对象及用途SamplerResult和prev对象都可以用于记录请求-响应中一系列信息,也就是在ViewResultsTree中观察到的信息。它们的接口是相同的,但是所属的元件有不同。@SamplerRe
Cannot load JDBC driver class ‘com.mysql.jdbc.Driver’
Coco(学习)
mysql mysql 数据库 java
解决问题:Jmeter使用JDBCConnectionConfiguration以及JDBCRequest的时候提示CannotloadJDBCdriverclass'com.mysql.jdbc.Driver’这个错误通常是由以下原因引起的:1.**缺少JDBC驱动程序:**JMeter无法找到MySQLJDBC驱动程序。你需要下载驱动程序并将其复制到$JMETER_HOME/lib目录下。2.
第五单元 Jmeter组件介绍
胖虎大魔王
一、性能测试1.下载,安装,运行2.java环境运行二、Jmeter简介1.我们为什么使用Jmeter开源,免费,基于Java编写,可集成到其他系统可拓展各个功能插件支持接口测试,压力(负载和压力)测试等多种功能,支持录制回放,入门简单相较于自己编写框架活其他开源工具,有较为完善的UI界面,便于接口调试多平台支持,可在Linux,Windows,Mac上运行,支持多协议2.Jmeter的作用接口测
Jmeter压测
澄子_向钱看
Jmeter本身是不能够展示内存,cpu和吞吐量的,但是可以通过添加插件的方式来对jmeter添加这些功能Jmeter常用插件介绍JMeter之ServerAgent监控资源一、数据库压测1.为什么要进行数据库压测不断给数据库施加压力,验证数据库处理的性能2.如何进行数据库压测测试的过程中,我们经常要对数据库表数据进行查询、修改、添加等操作。在用JMeter做性能或者接口等测试时,也可以让JMet
如何做大数据测试
测试界潇潇
软件测试 软件测试 功能测试 自动化测试 程序人生 职场和发展
测试流程及测试方法没有太大的区别,重点说一下大数据测试相比传统测试的区别:1、数据规模:大数据测试所涉及的数据规模通常是海量级别的,而普通测试所涉及的数据规模较小。2、测试工具:大数据测试需要使用专门的测试工具和框架,如HadoopUnit、ApacheBigTop、JMeter、LoadRunner等,而普通测试则可以使用通用的测试工具和框架,如JUnit、TestNG等。3、测试目的:大数据测
linux-centos等测试环境做压力测试
远方的、远方的、、、
自动化测试 linux centos 压力测试
一,jmeter环境安装1,jdk下载安装因为jmeter使用Java写的测试工具,应用需要jdk环境支持.yum-yinstalljava-1.8.0-openjdk*注意:【jdk和*通配符之间不能敲空格,有空格不能匹配所有的子文件】【安装过程中需要等待它执行完成,不要中途中断,中断后可能出现错误,出现错误可以尝试卸载Java后重新安装】java-version查看是否安装成功2,jmeter
毕业了还是要继续努力呀
小菊花麻麻颗糖
慢慢接触了Postman和Jmeter,同事帮忙搭建了环境并把他会的都教给了我们,毕竟他是开发,后面还是得靠自己自学。这个公司环境不错,同事关系也毕竟融洽,唯一的缺点就是工资太低,我也知道新毕业的菜鸟这点也还可以,可是谁不想工资越高越好呢,说到底还是自己会的太少,当下最重要的还是充实自己!作为一个新手测试,目前只是熟悉几个bug管理工具,问题跟进、分析能力也算是有了;测试过程算熟悉,但是整体把控还
JMeter 接口自动化测试:以搜索功能为例的实现思路详解
锦都不二
jmeter
在软件开发和测试领域,接口自动化测试是确保系统间交互顺畅、提高测试效率的重要手段。ApacheJMeter是一款广受欢迎的开源性能测试工具,它不仅能够进行负载测试,也支持接口测试。本文将以一个典型的搜索功能为例,详细解析如何使用JMeter实现接口自动化测试,从功能分析到抓取接口,再到配置与执行测试。1.功能需求分析首先,明确搜索功能的基本需求:用户输入关键词,系统根据关键词检索数据库或索引,并返
jmeter连接mysql数据,并将查询结果存储到指定txt文件中
清冬暖雪
JMeter jmeter 数据库 mysql
1、首先jmeter先进行连接mysql相关的配置,我之前已经有教程了就不赘述了,教程链接如下jmeter连接mysql数据库以及常规用法-CSDN博客2、当jmeter成功配置mysql数据库后,在JDBCRequest组件中进行如下配置VariableNameofPooldeclaredinJDBCConnectionConfiguration:输入连接数据库名称,上面链接教程中有介绍不赘述Q
jmeter中上传文件接口,当文件名为中文时出现乱码
清冬暖雪
JMeter jmeter
1、在jmeter5.1.1中配置上传文件接口,当上传的文件为中文名称时,文件名称会显示乱码如图2、解决方案是需要更换jmeter/lib/ext文件中的ApacheJMeter_http.jar包3、更换jar包经过多次实验,发现有的上传文件接口中文名正常,但是有的还是显示乱码,如果谁有更好的解决方法希望能指正。下载链接如下:通过网盘分享的文件:ApacheJMeter_http.jar链接:h
Jmeter进阶-接口自动化
俊俏的萌妹纸
jmeter 自动化 运维
JMeter是一款广泛使用的开源软件,它不仅可以用于性能测试,还可以用于接口自动化测试。以下是JMeter进行接口自动化测试的一些优缺点:优点:易用性:JMeter上手简单,大部分操作都有对应的元件帮助完成,开源且社区接受度高。灵活性:提供BeanShell脚本能力,允许自定义扩展新的协议支持,比如Dubbo协议的JMeter插件。支持多种协议:除了HTTP,还支持JDBC等,能够将测试结果存入数
关于jmeter的一些面试题及回答
ruanxinyan12345
jmeter
1、说明jmeter的工作原理jmeter就像一个虚拟用户模拟器,你创建一个测试计划,指定这些虚拟用户(线程)要做什么,比如你要访问网站的不同页面,jmeter会按照你设定的规则,让这些虚拟用户同时发起请求,然后记录下这些请求的响应时间和结果,最后,你可以通过查看这些数据来分析网站在不同负载下的表现,找出潜在的性能问题2、在哪里可以使用函数和变量任何测试组件的任何字段3、解释下什么是采样器和线程组
java Illegal overloaded getter method with ambiguous type for propert的解决
zwllxs
java jdk
好久不来iteye,今天又来看看,哈哈,今天碰到在编码时,反射中会抛出
Illegal overloaded getter method with ambiguous type for propert这么个东东,从字面意思看,是反射在获取getter时迷惑了,然后回想起java在boolean值在生成getter时,分别有is和getter,也许我们的反射对象中就有is开头的方法迷惑了jdk,
IT人应当知道的10个行业小内幕
beijingjava
工作 互联网
10. 虽然IT业的薪酬比其他很多行业要好,但有公司因此视你为其“佣人”。
尽管IT人士的薪水没有互联网泡沫之前要好,但和其他行业人士比较,IT人的薪资还算好点。在接下的几十年中,科技在商业和社会发展中所占分量会一直增加,所以我们完全有理由相信,IT专业人才的需求量也不会减少。
然而,正因为IT人士的薪水普遍较高,所以有些公司认为给了你这么多钱,就把你看成是公司的“佣人”,拥有你的支配
java 实现自定义链表
CrazyMizzz
java 数据结构
1.链表结构
链表是链式的结构
2.链表的组成
链表是由头节点,中间节点和尾节点组成
节点是由两个部分组成:
1.数据域
2.引用域
3.链表的实现
&nbs
web项目发布到服务器后图片过一会儿消失
麦田的设计者
struts2 上传图片 永久保存
作为一名学习了android和j2ee的程序员,我们必须要意识到,客服端和服务器端的交互是很有必要的,比如你用eclipse写了一个web工程,并且发布到了服务器(tomcat)上,这时你在webapps目录下看到了你发布的web工程,你可以打开电脑的浏览器输入http://localhost:8080/工程/路径访问里面的资源。但是,有时你会突然的发现之前用struts2上传的图片
CodeIgniter框架Cart类 name 不能设置中文的解决方法
IT独行者
CodeIgniter Cart 框架
今天试用了一下CodeIgniter的Cart类时遇到了个小问题,发现当name的值为中文时,就写入不了session。在这里特别提醒一下。 在CI手册里也有说明,如下:
$data = array(
'id' => 'sku_123ABC',
'qty' => 1,
'
linux回收站
_wy_
linux 回收站
今天一不小心在ubuntu下把一个文件移动到了回收站,我并不想删,手误了。我急忙到Nautilus下的回收站中准备恢复它,但是里面居然什么都没有。 后来我发现这是由于我删文件的地方不在HOME所在的分区,而是在另一个独立的Linux分区下,这是我专门用于开发的分区。而我删除的东东在分区根目录下的.Trash-1000/file目录下,相关的删除信息(删除时间和文件所在
jquery回到页面顶端
知了ing
html jquery css
html代码:
<h1 id="anchor">页面标题</h1>
<div id="container">页面内容</div>
<p><a href="#anchor" class="topLink">回到顶端</a><
B树、B-树、B+树、B*树
矮蛋蛋
B树
原文地址:
http://www.cnblogs.com/oldhorse/archive/2009/11/16/1604009.html
B树
即二叉搜索树:
1.所有非叶子结点至多拥有两个儿子(Left和Right);
&nb
数据库连接池
alafqq
数据库连接池
http://www.cnblogs.com/xdp-gacl/p/4002804.html
@Anthor:孤傲苍狼
数据库连接池
用MySQLv5版本的数据库驱动没有问题,使用MySQLv6和Oracle的数据库驱动时候报如下错误:
java.lang.ClassCastException: $Proxy0 cannot be cast to java.sql.Connec
java泛型
百合不是茶
java泛型
泛型
在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,任意化的缺点就是要实行强制转换,这种强制转换可能会带来不安全的隐患
泛型的特点:消除强制转换 确保类型安全 向后兼容
简单泛型的定义:
泛型:就是在类中将其模糊化,在创建对象的时候再具体定义
class fan
javascript闭包[两个小测试例子]
bijian1013
JavaScript JavaScript
一.程序一
<script>
var name = "The Window";
var Object_a = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
探索JUnit4扩展:假设机制(Assumption)
bijian1013
java Assumption JUnit 单元测试
一.假设机制(Assumption)概述 理想情况下,写测试用例的开发人员可以明确的知道所有导致他们所写的测试用例不通过的地方,但是有的时候,这些导致测试用例不通过的地方并不是很容易的被发现,可能隐藏得很深,从而导致开发人员在写测试用例时很难预测到这些因素,而且往往这些因素并不是开发人员当初设计测试用例时真正目的,
【Gson四】范型POJO的反序列化
bit1129
POJO
在下面这个例子中,POJO(Data类)是一个范型类,在Tests中,指定范型类为PieceData,POJO初始化完成后,通过
String str = new Gson().toJson(data);
得到范型化的POJO序列化得到的JSON串,然后将这个JSON串反序列化为POJO
import com.google.gson.Gson;
import java.
【Spark八十五】Spark Streaming分析结果落地到MySQL
bit1129
Stream
几点总结:
1. DStream.foreachRDD是一个Output Operation,类似于RDD的action,会触发Job的提交。DStream.foreachRDD是数据落地很常用的方法
2. 获取MySQL Connection的操作应该放在foreachRDD的参数(是一个RDD[T]=>Unit的函数类型),这样,当foreachRDD方法在每个Worker上执行时,
NGINX + LUA实现复杂的控制
ronin47
nginx lua
安装lua_nginx_module 模块
lua_nginx_module 可以一步步的安装,也可以直接用淘宝的OpenResty
Centos和debian的安装就简单了。。
这里说下freebsd的安装:
fetch http://www.lua.org/ftp/lua-5.1.4.tar.gz
tar zxvf lua-5.1.4.tar.gz
cd lua-5.1.4
ma
java-递归判断数组是否升序
bylijinnan
java
public class IsAccendListRecursive {
/*递归判断数组是否升序
* if a Integer array is ascending,return true
* use recursion
*/
public static void main(String[] args){
IsAccendListRecursiv
Netty源码学习-DefaultChannelPipeline2
bylijinnan
java netty
Netty3的API
http://docs.jboss.org/netty/3.2/api/org/jboss/netty/channel/ChannelPipeline.html
里面提到ChannelPipeline的一个“pitfall”:
如果ChannelPipeline只有一个handler(假设为handlerA)且希望用另一handler(假设为handlerB)
来
Java工具之JPS
chinrui
java
JPS使用
熟悉Linux的朋友们都知道,Linux下有一个常用的命令叫做ps(Process Status),是用来查看Linux环境下进程信息的。同样的,在Java Virtual Machine里面也提供了类似的工具供广大Java开发人员使用,它就是jps(Java Process Status),它可以用来
window.print分页打印
ctrain
window
function init() {
var tt = document.getElementById("tt");
var childNodes = tt.childNodes[0].childNodes;
var level = 0;
for (var i = 0; i < childNodes.length; i++) {
安装hadoop时 执行jps命令Error occurred during initialization of VM
daizj
jdk hadoop jps
在安装hadoop时,执行JPS出现下面错误
[slave16]
[email protected] :/tmp/hsperfdata_hdfs# jps
Error occurred during initialization of VM
java.lang.Error: Properties init: Could not determine current working
PHP开发大型项目的一点经验
dcj3sjt126com
PHP 重构
一、变量 最好是把所有的变量存储在一个数组中,这样在程序的开发中可以带来很多的方便,特别是当程序很大的时候。变量的命名就当适合自己的习惯,不管是用拼音还是英语,至少应当有一定的意义,以便适合记忆。变量的命名尽量规范化,不要与PHP中的关键字相冲突。 二、函数 PHP自带了很多函数,这给我们程序的编写带来了很多的方便。当然,在大型程序中我们往往自己要定义许多个函数,几十
android笔记之--向网络发送GET/POST请求参数
dcj3sjt126com
android
使用GET方法发送请求
private static boolean sendGETRequest (String path,
Map<String, String> params) throws Exception{
//发送地http://192.168.100.91:8080/videoServi
linux复习笔记 之bash shell (3) 通配符
eksliang
linux 通配符 linux通配符
转载请出自出处:
http://eksliang.iteye.com/blog/2104387
在bash的操作环境中有一个非常有用的功能,那就是通配符。
下面列出一些常用的通配符,如下表所示 符号 意义 * 万用字符,代表0个到无穷个任意字符 ? 万用字符,代表一定有一个任意字符 [] 代表一定有一个在中括号内的字符。例如:[abcd]代表一定有一个字符,可能是a、b、c
Android关于短信加密
gqdy365
android
关于Android短信加密功能,我初步了解的如下(只在Android应用层试验):
1、因为Android有短信收发接口,可以调用接口完成短信收发;
发送过程:APP(基于短信应用修改)接受用户输入号码、内容——>APP对短信内容加密——>调用短信发送方法Sm
asp.net在网站根目录下创建文件夹
hvt
.net C# hovertree asp.net Web Forms
假设要在asp.net网站的根目录下建立文件夹hovertree,C#代码如下:
string m_keleyiFolderName = Server.MapPath("/hovertree");
if (Directory.Exists(m_keleyiFolderName))
{
//文件夹已经存在
return;
}
else
{
try
{
D
一个合格的程序员应该读过哪些书
justjavac
程序员 书籍
编者按:2008年8月4日,StackOverflow 网友 Bert F 发帖提问:哪本最具影响力的书,是每个程序员都应该读的?
“如果能时光倒流,回到过去,作为一个开发人员,你可以告诉自己在职业生涯初期应该读一本, 你会选择哪本书呢?我希望这个书单列表内容丰富,可以涵盖很多东西。”
很多程序员响应,他们在推荐时也写下自己的评语。 以前就有国内网友介绍这个程序员书单,不过都是推荐数
单实例实践
跑龙套_az
单例
1、内部类
public class Singleton {
private static class SingletonHolder {
public static Singleton singleton = new Singleton();
}
public Singleton getRes
PO VO BEAN 理解
q137681467
VO DTO po
PO:
全称是 persistant object持久对象 最形象的理解就是一个PO就是数据库中的一条记录。 好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象。
BO:
全称是 business object:业务对象 主要作用是把业务逻辑封装为一个对象。这个对
战胜惰性,暗自努力
金笛子
努力
偶然看到一句很贴近生活的话:“别人都在你看不到的地方暗自努力,在你看得到的地方,他们也和你一样显得吊儿郎当,和你一样会抱怨,而只有你自己相信这些都是真的,最后也只有你一人继续不思进取。”很多句子总在不经意中就会戳中一部分人的软肋,我想我们每个人的周围总是有那么些表现得“吊儿郎当”的存在,是否你就真的相信他们如此不思进取,而开始放松了对自己的要求随波逐流呢?
我有个朋友是搞技术的,平时嘻嘻哈哈,以
NDK/JNI二维数组多维数组传递
wenzongliang
二维数组 jni NDK
多维数组和对象数组一样处理,例如二维数组里的每个元素还是一个数组 用jArray表示,直到数组变为一维的,且里面元素为基本类型,去获得一维数组指针。给大家提供个例子。已经测试通过。
Java_cn_wzl_FiveChessView_checkWin( JNIEnv* env,jobject thiz,jobjectArray qizidata)
{
jint i,j;
int s