一纸荒年 发表于 2019-2-12 16:58:14

使用JMeter对SOAP应用进行压力或性能测试

Appache JMeter 以及 SOAP 协议简述
开源测试工具:Appache JMeter

JMeter 是 Apache 基金会 Jakarta 上的一个纯 Java 开源项目,起初用于基于 Web 的压力测试(pressure test),后来其应用范围逐渐扩展到对文件传输 FTP, 大型数据库(JDBC 方式),脚本程序(CGI, Perl 等),Web Services,Java 应用系统等方面的测试。JMeter 本身主要用于性能测试,如系统压力等。除此之外,JMeter 能够对应用系统做功能测试和回归测试,并且能够通过使用带有断言的脚本程序来验证系统然后返回用户期望的结果。为了提高工具的应用灵活性,JMeter 允许使用正则表达式创建断言。正是由于它的灵活性和可扩展性,JMeter 逐渐成为流行的开源测试工具。

消息传递协议:SOAP
  SOAP(Simple Object Access Protocol)称为简单对象访问协议, 是 W3C 定义的一种标准消息传递协议,而它通常被认为是 Web Services 的事实标准。SOAP 协议使用 XML 语言来描述,SOAP 消息格式是由 XML Schema 模式定义,因而通过使用 XML 命名空间使得 SOAP 具有很强的可扩展性。
  SOAP 是在去中心化(Decentralized)分布式(Distributed)环境中用来信息交换的一个轻量级协议。SOAP 本身并不定义像程序模型或实施声明等形式的语法,而只定义了一种简单机制:通过提供模块化的包装模型编码机制来传输应用信息。

SOAP 基本结构:
  1) 信封 Envelope Envelope 元素是 SOAP 中的根元素,并且定义为在 SOAP 消息中必须出现。Envelope 元素中可以包含多可选的 Header 元素,但同时必须要包含一个 Body 元素。
  2) 消息头 Header Header 可能出现在 SOAP 消息中,是一个可选元素。如果出现在消息中,那么 Header 一定要是 SOAP 中的第一个元素。SOAP Header 在 Web Services 中的应用越来越广泛,例如在应用程序的安全性事物中使用标准的消息头文件,因而成为扩展 SOAP 协议的一个非常有效的方法。
  3)消息体 Body Body 元素是 SOAP 中必须出现的一个元素,它要包含应用程序中的传输数据或者反馈消息。 应用程序中的传输数据可以是任意形式的 XML 数据。SOAP 消息接收者最终来处理 SOAP Body 体。

JMeter 调用 SOAP 框架机制
  SOAP 使用 RPC(远程过程调用)和消息传递来建立通信服务,SOAP RPC 定义了用于表示远程过程调用和应答的协议。SOAP 协议本身仅仅定义了消息的交换结构,它可以和许多现存因特网协议结合在一起使用,其中包括超文本传输协议( HTTP),多用途网际邮件扩充协议(MIME),Java 消息服务(JMS)以及简单邮件传输协议(SMTP)等。目前与 SOAP 应用最为广泛的是 HTTP 协议和 JMS 协议,而与之相对应的两种应用就是 SOAP Over HTTP 和 SOAP Over JMS。
  根据 JMS 的规范,消息交换有 2 种方式:消息发布 / 订阅方式和点对点方式。由这两种交换方式所建立的消息收发系统都是异步的,即 JMS 客户机可以发送消息而不必等待回应。如果应用程序测试者或测试脚本开发者希望每一条消息都能够被处理并且消息总是能够被传送到指定的位置,那么应该使用点对点消息模型而不是消息发布 / 订阅模型。
  HTTP(超文本传送协议)是属于应用层的面向对象的协议,是万维网 (WWW) 的基础,由于其简单快速、灵活、无连接、无状态的方式,适用于分布式网络信息系统。SOAP Over HTTP 应用就是指的是遵守 SOAP 编码规则的 HTTP 请求 / 响应,我们可以用简单的公式来对此作一个描述:HTTP + XML = SOAP。
  JMeter 也同样提供了两种 Sampler 分别建立对这两种服务的调用:Web Services (SOAP) Request 和 JMS Point-to-Point。前者使用互联网中最为广泛的超文本传输协议( HTTP)而后者使用 JMS 协议,JMS 是 Java 平台面向消息中间件的技术规范,用它来提供创建、发送、接收、读取消息的服务。许多厂商目前都支持 JMS,包括 BEA 的 WebLogic JMS service,IBM 的 MQSeries 和 Progress 的 SonicMQ。

图 1.JMeter 框架基于上述两种不同的协议对 SOAP 消息的一次简单调用机制流程
  
准备测试环境
  当精心编写好测试脚本满怀信心的去运行测试计划时,发现所有的测试脚本都 failed 掉了,原因可能是你的测试环境中并没有完全准备好。下面给出了准备测试环境的详细步骤:
  1.环境变量设置:JMeter 运行在 JRE/JDK 之上,在所有开始之前要设置 JMeter 自动检测的环境变量 JAVA_HOME=#JAVA INSTALL DIRECTORY#.
  2.JMeter 安装:本文下面下载栏提供了 Apache JMeter 下载地址,首先要取得最新版本的 JMeter 测试工具,JMeter 最新版本包含了构建和运行绝大部分测试类型的文件,包括 Web (HTTP/HTTPS), FTP, JDBC, LDAP, Java, 和 JUnit 等。
  3.准备 jar 包:JMeter 虽然提供了对 SOAP Over HTTP 以及 SOAP Over JMS 测试的 Sampler,但是出于对 licence 的考虑它本身并没有提供 JMS 需要使用的 jar 包。因此,在运行测试之前需要将这些包复制到 JMeter 的 lib 目录下,下面列表对测试所需 jar 包作了详细说明。
  4.BeanShell 脚本处理:如果在测试用例中用到了 BeanShell 脚本,则需要将 BeanShell 包拷贝到 JMeter bin 目录下。BeanShell 是一种兼容 Java 语言的轻量级脚本语言,JMeter 脚本中可能会经常用它来做日志处理,正则表达式后处理(Post- Process)等。如果在测试用例中用到了 Mail Visualiser, Mail Reader 以及 Web Services (SOAP) sampler,则需要将 MAIL 包拷贝到 JMeter bin 目录下。如果在测试用例中用到了 JMS 相关的 sampler,则需要将 JMS 包拷贝到 JMeter bin 目录下。

下面的列表列出了不同的测试用例所需要的 jar 包,以及其下载地址:
  bsh-2.0b4.jarhttp://www.beanshell.org/
  mail.jar http://java.sun.com/products/javamail/index.jsp
  jms.jarhttp://java.sun.com/products/jms/docs.html
  调试脚本中非常有用的信息日志:jmeter.log 在脚本的调试和运行过程中,所以的日志信息都会记录在 jmeter.log 中,因此你会在这个文件中找到比较有用的信息。

注意事项
  如果 JMeter 在执行测试脚本过程中应该修改 jmeter.bat 文件中的一些参数,参数大小可以根据测试计划合理确定:
  HEAP=-Xms256m – Xmx1024m
  NEW=-XX:NewSize=128m -XX:MaxNewSize=128m
  TENURING=-XX:MaxTenuringThreshold=2
  EVACUATION=-XX:MaxLiveObjectEvacuationRatio=20%
  PERM=-XX: PermSize=64m -XX:MaxPermSize=64m
  DEBUG=-verbose:gc -XX:+PrintTenuringDistribution
  此外,在搭建测试环境时还需要更多注意的地方:
  JMeter 使用兼容 JKD1.4 或者更高版本
  JMeter 无法识别 zip 格式的包文件,所以需要的包文件均要求以 .jar 结尾
  JMeter 会自动在 JMETER_HOME/lib 和 ext 目录下寻找需要的类
  对于使用 CSVDataSet, 那么不要勾选 "Memory Cache"否则数据无法迭代
  使用 JMeter 连接 SOAP Over HTTP 服务
  JMeter 提供了 Web Service (SOAP) sampler,用以调用基于 HTTP 的 Web 服务。下面详细说明 SOAP Over HTTP 服务调用的各个属性。
SOAP Over HTTP 服务调用的各个属性说明:
  WSDL URL:指定 WSDL 文件的目标地址
  Web Methods:选择本次请求调用的方法
  Protocol:指定使用的协议,默认为 HTTP
  Server Name Or IP:服务的地址(服务器名或 IP 地址)
  Path:调用方法所在的位置
  Timeout:设置请求超时限制
  SOAPAction:存在于 WSDL 文件中的调用方法,默认不必填写
  Soap/XML-RPC Data:请求数据

下面是一次完整的 HTTP 请求与 HTTP 响应 SOAP 数据:
HTTP Request
<soapenv:Envelope>
<soapenv:Body>
<q0:getEndDate>
<ip_id>12</ip_id>
</q0:getEndDate>
</soapenv:Body>
</soapenv:Envelope>
HTTP Response
<soapenv:Envelope>
<soapenv:Header/>
<soapenv:Body>
<p928:getEndDateResponse>
dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,
startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,
endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]],
firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2005,MONTH=8,
WEEK_OF_YEAR=37,WEEK_OF_MONTH=2,DAY_OF_MONTH=7,DAY_OF_YEAR=250,DAY_OF_WEEK=4,
DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,
MILLISECOND=0,ZONE_OFFSET=-18000000,DST_OFFSET=3600000]
</p928:getEndDateResponse>
</soapenv:Body>
</soapenv:Envelope>




页: [1]
查看完整版本: 使用JMeter对SOAP应用进行压力或性能测试