JMeter学习2

JMeter学习(四)参数化

参数化:录制脚本中有登录操作,需要输入用户名和密码,假如系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户来登录系统。

这个时候就需要对用户名和密码进行参数化,使每个虚拟用户都使用不同的用户名和密码进行访问。

一、准备脚本,测试数据

1、录制一个脚本(可以用badboy工具录制),在jmeter中打开,找到有用户名和密码的页面。如下:

2、把我们需要“参数化”的数据,写入记事本,保存为.dat格式的文件,记事本另存为修改编码UTF-8.  注意用户名和密码是一一对应的,中间用户逗号(,)隔开。

我将这个文件放在了我的( C:JmeterWorkSpace .dat  )路径下。

二、参数化

Jmeter测试时包含两种情况的参数,一种是在url中,一种是请求中需要发送的参数。

URL中的参数,如:http://blog.da-fang.com/index.php/2010/06/01/jmeter参数/,其中“2010/06/01/jmeter参数”为url参数。
请求中的参数,此处只能举例get请求,如:http://blog.da-fang.com/?category=Web,其中“category”是参数名,“Web”是它的值。
对于post请求,用jmeter录制后,可以在请求的“同请求一起发送参数”和“同请求一起发送文件”中找到。

参数化Jmeter脚本时,使用参数的地方书写格式为${参数名}
对于URL“http://blog.da-fang.com/index.php/2010/06/01/jmeter参数/”,在Jmeter的http请求中blog.da-fang.com填写在“服务器名称或IP”中;/index.php/${url_parameter}/填写在“路径”中。
对于请求中的参数http://blog.da-fang.com/?category=Web,在Jmeter的http请求中blog.da-fang.com填写在“服务器名称或IP”中;/填写在“路径”中;参数名称category填写在“同请求一起发送参数”的“名称”中,参数值${category_name}填写在对应的“值”中。

1、函数助手的方式

a、点击菜单栏“选项”---->函数助手对话框,看下图:  CSV文件列号是从0开始的,第一列0、第二列1、第三列2、依次类推。。

b、复制生成的参数化函数,打开登陆请求页面,在右则的参数化中找到我们要参数化的字段,这里对用户名和密码做参数化,第一列是用户名,列号为0;第二列是密码,列号为1;修改函数中对应的参数化字段列号就可以啦。

现在我们的参数化设置完成,在脚本的时候,会调用我们C:JmeterWorkSpace盘下面的t.dat文件,第一列是用户,第二列是密码。


类似的函数还有__Random,__threadNum,__CSVRead,__StringFromFile等。其中{__Random(,,)}方法的第一个参数为随机数的下限,第二个参数为随机数的上限,第三个参数为储存随机数的变量名;{__Random(,,)}方法的第一个参数为随机数的下限,第二个参数为随机数的上限,第三个参数为储存随机数的变量名;{__CSVRead(,)}方法中第一个参数是文件名,第二个参数是文件中的列(列数从0开始);{__StringFromFile(,,,)}方法中第一个参数是文件名,{__StringFromFile(,,,)}方法中第一个参数是文件名,{__StringFromFile(,,,)}方法中没有指定读取文件中的哪一列的参数,所以${__StringFromFile(,,,)}只能读取包含一列的文件。

2.用户定义的变量
2.1 添加“配置元件”->“用户定义的变量”
2.2 “名称”中输入变量名称,此处以登录为例,定义两个变量username和password。“值”中可以直接输入值,也可以通过Jmeter的函数__CSVRead,__StringFromFile从csv或dat文件中读取,还可以通过前缀加随机数的方法设置参数。
如进行登录测试,准备了用户名为perf_0到perf_1000的用户,那么用户名就可以设为perf_{__Random(0,1000,)}。
当参数值没有规律的且量不太大时,可以通过{__CSVRead(,)},{__CSVRead(,)},{__StringFromFile(,,,)}从文件中读取,如将用户名和密码保存在user.csv文件中,user.csv的内容如下:
oriana,123456
admin,admin
dandan,123456
因为user.csv文件中有两列数据,所以只能用{__CSVRead(,)}函数,username参数后的值设为{__CSVRead(,)}函数,username参数后的值设为{__CSVRead(user.csv,0)},password参数后的值设为${__CSVRead(user.csv,1)}。
 

3、借助jmeter中的配置元件(CSV Data Set Config)

 a、选中线程组,点击右键,添加-配置元件-CSV Data Set Config

说明:

Filename --- 参数项文件
File Encoding --- 文件的编码,设置为UTF-8
Vaiable Names --- 文件中各列所表示的参数项;各参数项之间利用逗号分隔;参数项的名称应该与HTTP Request中的参数项一致。
Delimiter --- 如文件中使用的是逗号分隔,则填写逗号;如使用的是TAB,则填写 ;(如果此文本文件为CSV格式的,默认用英文逗号分隔)
Recycle on EOF --- True=当读取文件到结尾时,再重头读取文件。False=当读取文件到结尾时,停止读取文件
Stop thread on EOF --- 当Recycle on EOF为False时,当读取文件到结尾时,停止进程。当Recycle on EOF为True时,此项无意义

通俗说:
Recycle on EOF :到了文件尾处,是否循环读取参数,选项:true和false
Stop thread on EOF:到了文件尾处,是否停止线程,选项:true和false
当Recycle on EOF 选择true时,Stop thread on EOF选择true和false无任何意义,通俗的讲,在前面控制了不停的循环读取,后面再来让stop或run没有任何意义
当Recycle on EOF 选择flase时,Stop thread on EOF选择true,线程4个,参数3个,那么只会请求3次
当Recycle on EOF 选择flase时,Stop thread on EOF选择flase,线程4个,参数3个,那么会请求4次,但第4次没有参数可取,不让循环,所以第4次请求错误

b、使用刚才定义好的变量

函数助手方法要比CSV控件方法参数化功能要弱,推荐使用CSV控件方法。
再看看与loadrunner参数化不一样的:
1、 jmeter参数文件的第一行没有列名称
2、 这里要注意的是参数文件的编码,可以使用记事本另存为就可以修改该编码(编码问题在使用CSV Data Set Config参数化时要求的比较严格)
3、 Jmeter的参数化设置没有LoadRunner做的出色,它是依赖于线程设置的(只有CSV Data Set Config参数化方法才有)

4.从数据库中获取
当参数的值没有规律且量比较大时,可以选用这种方法。具体做法如下:
4.1 下载MySQL JDBC即mysql-connector-java-5.1.12-bin.jar,将其放到Jmeter的lib目录下
4.2 添加“配置元件”->“JDBC Connection Configuration”,设置下列参数:
  • Database URL:jdbc:mysql://host:port/db(如jdbc:mysql://localhost:3306/testlink
  • JDBC Driver class:com.mysql.jdbc.Driver
  • username:连接数据库的用户名(如root)
  • password:连接数据库的密码
4.3 添加“Sampler”->“JDBC Request”,在SQL Query中输入查询语句,如下:
SELECT CONCAT (“[",GROUP_CONCAT(CONCAT("{username:'",login,"'"),CONCAT("{password:'",password),"'}"),"]“) AS json FROM users
4.4 在4.3中的JDBC请求中添加“后置处理器”->“正则表达式提取器”,以提取4.2中的用户名和密码为例设置正则表达式提取器的参数:
  • 引用名称:user
  • 正则表达式:username:’(.+?)’{password:’(.+?)’
  • 模板:1122

使用时,user_g1即为用户名,user_g2即为对应用户名的密码;更多正则表达式提取方法参见Jmeter正则表达式提取器

Jmeter关联

1、实现Jmeter关联----JsonPath:(返回值是json串时才可用)

DestinationVariable Name随意填写,表示返回值的参数化
Default Value随便填写
JSONPath Expression填写需要获取的返回值,格式为.parameter.parameter在需要传这个返回值的其他接口中,传这个返回值的参数化变量{DestinationVariable Name}即可-----如${ninanie}



2、实现Jmeter关联----正则表达式方式:

引用名:正则表达式参数化的名称
正则表达式匹配:"token": "(.*?)"------(.*?)表示要匹配的值,括号左右分别为值的左右两边的显示
模板:固定值
匹配数值:1表示有多个匹配值时取第一个
缺省值:匹配失败时默认取的值

JMeter学习(五)检查点

JMeter也有像LR中的检查点,JMeter里面的检查点通过添加断言来完成。

检查点:我们对用户名和密码进行了参数化,那么怎样来判断jmeter有没有正确调用t.dat里面的文件呢。当然,我们可以从结果图表中查看。但我还是想在“登录”这个地方进行一下检查。

1添加响应断言,右键点击我们的“登录”页面---->添加---->断言---->响应断言

2. 设置响应断言

断言中可以添加多个断言一起判断,断言中也可以使用参数化方法,进行动态判断。

3、添加断言结果,右键点击我们的“登录”页面---->添加---->监听器---->断言结果

 再添加一个“查看结果树” 右键点击我们的“登录”页面---->添加---->监听器---->查看结果树

在线程组中设置3个用户,点击运行运行。

4、查看断言结果

1)、成功如下图:

2)、若断言失败,如下图:

注意:一般成功只会显示一行数据,否则会多显示一行。

5、再查看结果树

至此,检查点设置完成。

另外,断言还有其它类型:

Duration to Assert:允许的响应时间的最大值,即断言的持续时间。
Size to Assert :对于返回结果文件大小的标准定义

注意:Sampler设置有多个断言,都会经过Assertions的判断,只要有一个不符合条件的都会标示为False

JMeter学习(六)集合点

JMeter也有像LR中的集合点,JMeter里面的集合点通过添加定时器来完成。注意:集合点的位置一定要在Sample之前.

集合点:简单来理解一下,虽然我们的“性能测试”理解为“多用户并发测试”,但真正的并发是不存在的,为了更真实的实现并发这感念,我们可以在需要压力的地方设置集合点,拿那个用户和密码的地方,每到输入用户名和密码登录的地方,所有的虚拟用户都相互之间等一等,然后,一起访问。

1.接着之前创建的脚本,右键点击 线程组---->定时器---->Synchronizing Timer

这样子就添加了一个“集合点”,下面来设置一下集合点,设置延迟时间(以毫秒为单位)

2.我们添加完之后的列表是这个样子的,

发现了没,我们集合点的位置不对,应该在登录的前面才对。怎么弄呢?

简单方法:按住Alt,直接移动Synchronizing Timer至登录的前面即可。

至此,集合点已添加完成。

jmeter 使用URL重写处理用户会话

 

URL重写就是首先获得一个进入的URL请求然后把它重新写成网站可以处理的另一个URL的过程。举个例子来说,如果通过浏览器进来的URL是“UserProfile.aspx?ID=1”那么它可以被重写成 “UserProfile/1.aspx”,这样的URL,这样的网址可以更好的被网站所阅读。
如果浏览器不支持Cookie或用户阻止了所有Cookie,可以把会话ID附加在HTML页面中所有的URL上,这些页面作为响应发送给客户。这样,当用户单击URL时,会话ID被自动作为请求行的一部分而不是作为头行发送回服务器。这种方法称为URL重写(URL rewriting)。
一般来说,URL重写是支持会话的非常健壮的方法。在不能确定浏览器是否支持Cookie的情况下应该使用这种方法。然而,使用URL重写应该注意下面几点:
1.如果使用URL重写,应该在应用程序的所有页面中,对所有的URL编码,包括所有的超链接和表单的action属性值。
2.应用程序的所有的页面都应该是动态的。因为不同的用户具有不同的会话ID,因此在静态HTML页面中无法在URL上附加会话ID。
3.所有静态的HTML页面必须通过Servlet运行,在它将页面发送给客户时会重写URL。

如果您的web应用程序使用URL重写而不是cookie保存会话信息, 那么你需要做一些额外的工作来测试你的网站。

正确应对URL重写,JMeter需要解析HTML 接收从服务器和检索独特的会话ID,使用适当的 HTTP URL重写修改器 来完成这一任务。 只需输入您的会话ID的名称参数修改器,和它 会发现它并将它添加到每个请求。 如果请求已经有一个值,它将被取代。 如果“缓存会话Id ? “检查,最后发现会话id将被保存, 将使用,如果前面的HTTP样本不包含一个会话id。

URL重写的例子

下载 这个例子 。 在图1所示 使用URL重写测试计划。 注意,URL重写SimpleController添加修饰语, 从而确保它只会影响请求SimpleController。

Figure 1 - Test Tree图1 -测试树

在图2中,我们看到了URL重写修改器GUI,只有为用户指定一个字段 会话ID的名称参数。 还有一个复选框,表明会话ID 是路径的一部分(用“;”分隔),而不是一个请求参数

Figure 2 - Request parameters
 
 
 
 
 
 
 
 

JMeter之JMS接口测试

 JMeter是Apache开发的一款小巧易用的开源性能测试工具,由java语言开发。JMeter不仅免费开源而且功能强大、易于扩展,如果有一定Java开发基础的话还可以在JMeter上做扩展开发新的插件等,几乎能满足各种性能测试需求。JMeter中使用Sampler元件(取样器)来模拟各种的类型的请求数据格式,类似于LR中的协议(比LR中的协议概念更广),如:http、ftp、soap、tcp等等。JMeter中支持的JMS Point-to Point、JMS Publisher和JMS Subscriber分别用于发送JMS的PTP消息和PUB/SUB消息,因此可以选择使用JMeter来测试JMS。

  MOM(消息中间件)作为消息数据交换的平台,也是影响应用执行效率的潜在环节。在Java程序中,是通过JMS与MOM进行交互的。作为Java实现的性能测试工具JMeter也能使用JMS对应用的消息交换和相关的数据处理能力进行测试。在整个测试过程中,JMeter测试的重点是消息的产生者和消费者的能力,而不是MOM本身。JMeter虽然能使用JMS对MOM进行测试,但是它本身并没有提供JMS需要使用的包(实现类)。因此在使用JMeter测试JMS时需要使用到具体的MOM的相关jar包。以下结合流行的开源消息中间件ActiveMQ来演示如何使用JMeter来实现对JMS的测试。

1、安装并启动ActiveMQ服务

2、测试前的准备

  使用JMeter进行压力测试时,所有的JMeter依赖的包需要复制到%JMETER_HOME%/lib目录下。对于ActiveMQ来说,就是复制%ACTIVEMQ_HOME%/lib目录下jar包,可根据实际情况来考虑是否复制。JMeter在测试时使用了JNDI,为了提供JNDI提供者的信息,需要提供jndi.properties。同时需要将jndi.properties放到JMeter的%JMETER_HOME%/lib和%JMETER_HOME%/bin目录中,还需要将jndi.properties与%JMETER_HOME%/bin目录下的ApacheJMeter.jar打包在一起。对于ActiveMQ,jndi.properties的演示内容如下:

 1 #java.naming.factory.initial = org.activemq.jndi.ActiveMQInitialContextFactory
 2 java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
 3 java.naming.provider.url = tcp://localhost:61616
 4 
 5 #指定connectionFactory的jndi名字,多个名字之间可以逗号分隔。
 6 #以下为例:
 7 #对于topic,使用(TopicConnectionFactory)context.lookup("connectionFactry")
 8 #对于queue,(QueueConnectionFactory)context.lookup("connectionFactory")
 9 connectionFactoryNames = connectionFactory
10 
11 #注册queue,格式:
12 #queue.[jndiName] = [physicalName]
13 #使用时:(Queue)context.lookup("jndiName"),此处是MyQueue
14 queue.MyQueue = example.MyQueue
15 
16 #注册topic,格式:
17 # topic.[jndiName] = [physicalName]
18 #使用时:(Topic)context.lookup("jndiName"),此处是MyTopic
19 topic.MyTopic = example.MyTopic 

3、测试JMS的PTP模型

    对于点对点模型,JMeter只提供了一种Sampler:JMS Point-to-Point。如图所示建立测试计划:

     

  QueueConnection Factory:连接工厂,输入jndi配置文件中配置的connectionFactory
  JNDI name Request queue:请求队列名,输入jndi配置文件中配置的MyQueue
  JNDI name Receive queue:接收队列名,输入jndi配置文件中配置的MyQueue
  Content:消息内容,比如输入:this is a test
  Initial Context Factory:输入org.apache.activemq.jndi.ActiveMQInitialContextFactory
  Provider URL:提供者URL,即安装的ActiveMQ的服务地址tcp://yourIP:61616
  运行调试时通过监视器元件查看是否发送成功,如下说明发送成功:

     

4、测试JMS的PUB/SUB模型

  在实际测试时,发布者和订阅者并不是需要同时(异步)出现的。比如有时我们可能想测试单位时间内消息发布者的消息产生量,此时就不需要消息发布者,只需要订阅者就可以了。本例为了说明这两种Sampler的使用,建立两个JMeter实例分别用于发送和接收消息。

1)首先新建如下订阅者的测试计划:

   

  勾选使用jndi配置文件,并分别输入jndi中配置的连接工厂和目的地名称,如上图所示,点击运行下的启动,使用消息消费者处于接收状态。

2)然后新建如下发布者的测试计划:

   

  勾选使用jndi配置文件,并分别输入jndi中配置的连接工厂和目的地名称以及要发送的消息内容,此处为:this is a pubish test,如上图所示,点击运行下的启动,以发送消息,查看监视器元件检查消息是否发送成功,如下说明发送成功:

   

  检查消息消费者是否接收到消息,如下说明接收成功:

  

上面已完成了JMeter对JMS的基本测试演示,实际测试时可能需要根据实际的场景选择合适的取样器,添加其他测试元件来建立和增强测试计划,根据真实测试的中间件拷贝依赖包以及配置jndi以完成JMS应用的性能测试。

原文地址:https://www.cnblogs.com/tester-l/p/6016853.html