Jmeter使用方法(测试Webservice)

这个篇文章是2016年初工作时使用Jmeter时的一些经验总结,希望能对做性能测试的人员有帮助。

项目背景

 

使用SoapUI生成初始报文

给线程组添加SOAP请求

使用采样器中的SOAP Request来发送WebService请求。

  • 采样器的作用就是模拟浏览器给服务器发送请求,并获取返回值。
  • 采样器中的SOAP请求就是针对webservice设置的
  • 通过SOAP请求就可以测试webservice了。
给线程组添加SOAP请求

 

SOAP请求界面的填写

需要填写的内容包括:

  • URL、SOAPAction、SOAP/XML-RPC Data三部分

SOAP请求界面

从这三部分来看URL是开发给的,其他东西开发都没有给,那怎么办呢?

使用SoapUI这个软件就可以解决这个问题。

 

SOAPUI的作用

  • 这个软件是专门做webservice测试用的,可以自动生成与webservice通信的报文。
  • 首先新建一个SOAP项目,然后填入项目名称,webservice地址即可。

使用SoapUI添加新SOAP项目

在SoapUI的SOAP项目中填入项目名称和webservice地址

 

SoapUI项目界面

  • 1:项目的结构;
  • 2:项目地址;
  • 3:自动生成的XML报文基本结构;
  • 4:发送报文按钮;
  • 5:显示回执。

SoapUI项目界面

 

第一次XML文件发送测试

  • 把准备好的XML文件内容放入<xmlstr>中,并点发送。
  • 结果如右图所示Webservice回复“意外的元素”。所以这样发送是不行的。

发送的XML报文内容接收到的Webservice回执

 

使用字符串传输报文时要用“<![CDATA[string]]>”把字符串框起来

  • 经过和开发确认中间的内容(string)需要使用“<![CDATA[string]]>”框起来。
  • 这样的原因是,在做webservice接口时,对实际内容是作为字符串解析的,因此需要以字符串的形式来传送报文。

使用CDATA包裹XML报文

 

在jmeter中调试报文

报文调试通过-在jmeter中试验

  • 将调试通过的报文放入Jmeter SOAP请求的Soap/XML-RPC Data中。
  • 参照SOAPUI中的地址栏,写上URL。

调试好的报文放到SOAP请求框中

 

添加“查看结果树”和“聚合报告”

  • 为了查看报文发送的结果,必须得有个查看回执的东西,这个东西就是“查看结果树”
  • 测试一般要添“聚合报告”,作用是将整体响应、延时等放到这个基本报告中。

添加“查看结果树”和“聚合报告”

 

运行一下看看结果

为了测试,一般都需要运行一次看看脚本写的对不对;

因为我们只需要运行一次,所以在“线程组”中将线程数和次数都设置为“1”。

第一次运行试验

 

对“SUCCESS”做断言

  • 因为只要有回执,无论任何回执jmeter都判断为成功。
  • 这样就不能确定报文是否正确处理了。因此要对回执做断言,这里用的是“SUCCESS”
  • 在线程组上点右键,添加一个“断言”中的“响应断言”

对“SUCCESS”做断言

 

对单个请求设置断言

如右图所示方法设置断言,就可以只对某个特定的请求断言(订单),而不会影响其他请求结果。

这样做的好处是,每个请求所需要断言的结果可能不一样,以此进行区分

对单个请求设置断言

 

参数化

对报文做参数化

参数主要有两个做参数化的组件:

  • “用户定义的变量”
  • “CSV数据选择器”
用户定义的变量用户定义变量示例
CSV数据选择器CSV数据选择器示例

 

报文中不停变动的参数

另外我们还有一个不停变化的号码,来使单号不重复。这时就得使用函数了。

选择Jmeter函数助手

选择counter函数

这个Counter函数,可以在每次提交时+1,其中说明中有说参数使用FALSE的话,就是全局计数器,这样可以保证所有线程用的都是同一个计数器,不会产生重号。

 

用户自定义变量中的参数化

对固定的单号、webservice地址和其他的东西进行参数化。

下面将“用户定义的变量”中的名称用${   }括起来,然后在后面添加${__counter(FALSE)}就是定义好的自增变量了。

用户定义变量填好的实例

 

 

在报文中参数化的方法

  • 使用${参数}在报文中写参数化的内容,比如:
  • ${__ORDERIDdemo}d${__counter(FALSE)}
  • 里面有两个参数化的参数。
  • Orderid是参数化的id
  • 中间还有个“d”作为不同类型单号区分(这个就是在单号和数字之间用d做了个分隔。
  • Counter是每次运行均加1。
    • 参数true是每个线程都有各自的计数器
    • False是全部线程共用计数器。

报文的参数化

 

增加请求头管理器

发送报文测试

报文发送后发现,在页面上显示的是乱码。但使用SoapUI发送的报文就没有问题,仔细检查发现发送的HTTP信息头是有问题的。

报文编码格式问题

 

增加HTTP信息头管理器

在“配置元件”中找到“HTTP信息头管理器”并添加到线程组中。

增加一个名称为“Content-Type”的信息头,并填写值为“text/xml;charset=UTF-8”

增加HTTP信息头管理器

 

添加监控

添加服务器资源监控PerfMon Metrics Collector

  • 下图所示位置填写IP、端口、监控项目和监控内容。
  • 上面的端口是ServerAgent使用的端口,这个端口可以进行设置。
  • 可以在应用服务器和数据库服务器各部署一个,以便确认瓶颈

添加服务器资源监控PerfMon Metrics Collector

 

在服务器上部署ServerAgent

  • 只有在服务器上启动了ServerAgent后,jmeter才能获取到服务器运行的相关资源情况。
  • 此应用默认的端口是4444,如果需要修改,则增加以下参数即可。
    • startAgent.bat --tcp-port 3401 --udp-port 3402 –sysinfo
  • 运行后效果如下图

在服务器上部署ServerAgent

 

添加其他监听器

根据自己需要可以添加针对线程、相应时间、每秒事务数、每秒点击数、吞吐量等监听器。

  • 这里添加了如右图几个监听器。
  • 其中包括了(对于webservice这些足够了)
    • 应用和数据库资源监控
    • 响应时间随时间的变化
    • 相应时间对应于线程的变化
    • 事务吞吐量对应于线程的变化
    • 每秒事务数、每秒点击数
    • 聚合报告
    • 查看结果树(实际测试时需要勾选“仅日志错误”,不然jmeter会崩溃)
添加其他监控器

 

各个监控的介绍

每秒点击数

每秒点击数量

每秒响应代码(在http测试中有些用)

每秒响应代码(在http测试中有些用)

响应时间随时间变化

响应时间随时间变化

响应时间随线程变化

响应时间随线程变化

每秒事务数

每秒事务数

数据库响应时间(JDBC Request)

数据库响应时间(JDBC Request)

服务器资源监控-应用

服务器资源监控-应用

服务器资源监控-数据库(后面因为应用性能下降造成数据库负荷降低)

服务器资源监控-数据库(后面因为应用性能下降造成数据库负荷降低)

聚合报告

聚合报告

 

数据库响应时间监控

我们虽然监控了数据库的资源情况,但对于数据库实际的响应时间是不清楚的。因此需要增加一个对数据库的操作,并记录其响应时间。这时就要用到以下两个工具:

  • JDBC Connection Configuration(JDBC连接配置器)
  • JDBC Request(JDBC请求)

jdbcRequest

添加方法:

  1. 在配置元件里面添加JDBC Connection Configuration
  2. 在sampler中添加JDBC Request
  3. 配置jar包:
    • 将数据库服务器(我用的是Oracle)上的“ojdbc14.jar”文件复制到jmeter下的lib文件夹内。

 

JDBC Connection Configuration设置方法(Oracle)

如下图方法设置

  • Variable Name需要和JDBC请求中的一致。
  • 数据库的设置,参考右图即可。
  • 其他的默认就行了。

JDBC Connection Configuration设置方法(Oracle)

 

JDBC Request编辑

 

JDBC Request中只要设置Variable Name和JDBC设置器一致即可。

其次要根据需要写一个select或update或insert的语句,来测试对应方法的响应时间。

  • 如果只是查看select响应时间,可以使用这个语句: select * from dual(dual是Oracle中的一个公共表,可以对这个表进行很多操作,具体可以问度娘)
  • 注意语句后面不能跟分号“;”,不然会出错。

也可以做复杂的select,但是要考虑是不是会对服务器产生压力。比如:

  • select ceil((max(stime)-min(stime))*24*60*60) AS 耗时,
  • trunc(count(*)/ceil((max(stime)-min(stime))*24*60*60),2) AS 每秒单量,
  • min(stime) as 开始时间,max(stime) as 结束时间,count(*) as 总单量
  • FROM TB_xxx_xxx_xxx WHERE ORDERNO like '${__ORDERIDdemo}%'

JDBCRequest编辑

 

将数据库监控线程与压力线程分开

为了避免数据库监控对数据库服务器造成不必要的压力

  • 应用测试的时候可能会每秒几十个线程同时发送请求,而数据库监控的请求不需要这么多

因此需要新建一个线程,然后把JDBC Request这些全部放到新线程中去。

另外还需加一个定时器,来保证每隔一定时间才会对服务器进行一次请求。

为了查看响应时间,再增加一个响应时间图表。

将数据库监控线程与压力线程分开

 

使用场景(JMeterPlugins中的线程组)

使用“线程组”不能满足场景测试需要,因此需要更高级的场景才行

使用场景(JMeterPlugins中的线程组)使用场景(JMeterPlugins中的线程组)2

 

配置单元优化

由于“变量”、“JDBC配置”和“HTTP信息头”是所有线程都要用的,所以可以将这几个配置单元移动到测试计划下面,和线程组处在同一级。

这样就可以让每个线程都共享这些配置单元了,不用每个线程都配置一遍。

配置单元优化

转载于:https://my.oschina.net/zhv/blog/896371

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值