1-性能测试 - JMeter特殊接口练习

about

本篇,我们来使用JMeter处理常见的特殊接口,如:

  • cookies接口
  • token接口
  • 签名接口
  • webservice接口

cookies接口

cookie这里处理起来有两种方式:

  • 手动,自己登陆,然后手动获取cookie,然后其他请求再携带cookie值,cookie过期需要手动再次获取。
  • 自动,让jmeter帮我们处理cookie值,每次先获取cookie,然后依赖cookie的接口直接携带。

来看看两种方式都是怎么玩的。

上URL:

# 登录接口
http://www.neeo.cc:6002/pinter/bank/api/login  # POST
# 参数   userName=admin&password=1234
# 查询余额
http://www.neeo.cc:6002/pinter/bank/api/query   # GET
# 参数 userName=admin

很明显,如上URL中,查询余额接口依赖登录接口返回的cookie值

手动

这种方式,就是首先访问登录接口,这里可以通过浏览器和jmeter或其他方式都可以;然后jmeter在访问查询接口中携带cookie值。

这里演示都在jmeter中的操作,即jmeter先访问登录接口,然后使用后置处理器提取cookie中,查询余额再携带。

在线程组内新建"HTTP请求"取样器,因为返回的cookie值在响应头中:

来为登录接口添加一个"正则表达式提取器"这个后置处理器:

cookie值已经提取出来了,我们在查询接口中携带,首先要知道cookie值是携带在查询接口的请求头中的,所以,这里还要了解一个"HTTP Cookie管理器"这个配置元件。

"HTTP Cookie管理器"中携带cookie:

注意,"域"选项是必填的。

来看最终的执行结果:

OK,完美!

但是非常的麻烦,我们来看看简单的。

自动

自动的套路跟手动的基本一致,只不过提取和携带都交给jmeter来完成,其实,还是"HTTP Cookie管理器"在起作用,开看看吧。

新建一个空的(啥都不要配置)"HTTP Cookie管理器",并保持跟登录和查询接口同级:

这样就OK啦:

是不是非常简单?!不过要注意的是,"HTTP Cookie管理器"只要跟登录和查询接口保持同级,谁在上谁在下无所谓;但是登录接口必须在查询余额接口上面!

token接口

token跟cookie的处理方式,手动的从响应中提取,然后再携带。

/pinter/bank/api/login2     userName=admin&password=1234   post请求
/pinter/bank/api/query2     userName=admin      			get请求

如上URL中,登录接口返回的token值,在响应体的data字段,然后查询接口的token值要携带在请求头中。

在线程组内新建登录和查询"HTTP请求"取样器:

来为登录接口添加json提取器,提取token值:

现在,可以在查询接口携带了, 我们也知道需要携带在请求头中,那这里就要用到"HTTP信息头管理器"这个配置元件,用来携带自定义的请求头:

这样就没问题了:

只要搞懂了token和cookie的原理,用jmeter处理起来就不难。

签名接口

问题来了,在写开放的API接口时是如何保证数据的安全性的?先来看看有哪些安全性问题在开放的API接口中,我们通过POST或者GET方式请求服务器的时候,会面临着许多的安全性问题,例如:

  1. 请求来源(身份)是否合法?
  2. 请求参数被篡改?
  3. 请求的唯一性(不可复制)

为了保证数据在通信时的安全性,我们可以采用参数签名的方式来进行相关验证。

那jmeter中怎么校验这种类型的接口呢?

使用如下URL来演示一下:

/pinter/com/userInfo     # post请求

# 参数,其中sign字段按照特定的算法进行加密
{"phoneNum":"123434","optCode":"testfan","timestamp":"12112121212","sign":"fdsfdsaafsasfas"}

这个接口的签名算法为:

sign = Md5(手机号+盐+时间戳)
# 其中,盐是固定值,手机号和时间戳都是动态的

来看jmeter中怎么用。

在线程组内,创建一个"HTTP请求":

参数需要特殊处理:

{"phoneNum":"${__Random(100000,999999,myPhone)}","optCode":"testfan","timestamp":"${__time(,myTime)}","sign":"${__MD5(${myPhone}testfan${myTime},)}"}

手机号和时间戳用内置函数来代替,而sign字段则是使用md5将手机号、盐、时间戳一起哈希了。

PS:你的函数助手对话框内没有md5的话,就去插件管理中心下载Custom JMeter Functions插件,完事重启jmeter就有了。

另外,由于参数是json类型的, 所以,还要为请求添加一个请求头,携带参数Content-Type:application/json,不然汇报415错误。

然后接口就通了:

签名接口的难点在于分析签名的规则。

webservice接口

简单来说,webservice是通过xml进行交互的web请求。

Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。

XML:(Extensible Markup Language)扩展型可标记语言。面向短期的临时数据处理、面向万维网络,是Soap的基础。

Soap:(Simple Object Access Protocol)简单对象存取协议。是XML Web Service 的通信协议。当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。

WSDL:(Web Services Description Language) WSDL 文件是一个 XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。大多数情况下由软件自动生成和使用。

UDDI (Universal Description, Discovery, and Integration) 是一个主要针对Web服务供应商和使用者的新项目。在用户能够调用Web服务之前,必须确定这个服务内包含哪些商务方法,找到被调用的接口定义,还要在服务端来编制软件,UDDI是一种根据描述文档来引导系统查找相应服务的机制。UDDI利用SOAP消息机制(标准的XML/HTTP)来发布,编辑,浏览以及查找注册信息。它采用XML格式来封装各种不同类型的数据,并且发送到注册中心或者由注册中心来返回需要的数据。

可以通过soupui来测试,也可以通过jmeter来测试。

常用webservice接口网站:

http://www.webxml.com.cn/zh_cn/index.aspx # 这个网站提供了很多webservice接口

来个查询手机号归属地的请求,参考地址:http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?op=getMobileCodeInfo

http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx   # post请求

# 参数
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <getMobileCodeInfo xmlns="http://WebXml.com.cn/">
      <mobileCode>string</mobileCode>
      <userID></userID>
    </getMobileCodeInfo>
  </soap:Body>
</soap:Envelope>

上述参数的mobileCode字段内需要替换为真实的手机号。

在线程组内新建一个"HTTP请求"取样器:

因为是xml格式的参数,这里只能写在消息体数据栏中了。又因为是xml格式的参数,服务器不加一个标识没法识别,所以,再添加一个"HTTP信息头管理器",填写:

Content-Type: text/xml

现在就可以查看执行结果了:

没问题!

JDBC请求

什么是JDBC

JDBC(Java Database Connectivity)是Java API,用于管理与数据库的连接,发出查询和命令以及处理从数据库获得的结果集。JDBC在1997年作为JDK 1.1的一部分发布,是为Java持久层开发的首批组件之一。

JDBC最初被认为是一种客户端API,它使Java客户端能够与数据源进行交互。JDCB 2.0改变了这一点,JDCB 2.0包括一个支持服务器端JDBC连接的可选软件包。从那时起,每个新的JDBC版本都对客户端包(java.sql)和服务器端包(javax.sql)进行了更新。JDBC 4.3是撰写本文时的最新版本,已于2017年9月作为Java SE 9的一部分发布。

JDBC如何工作

JDBC作为基于C的ODBC(开放数据库连接)API的替代产品而开发,提供了编程级别的接口,该接口处理Java应用程序与数据库或RDBMS通信的机制。JDBC接口包括两层:

  1. JDBC API支持Java应用程序与JDBC管理器之间的通信。
  2. JDBC驱动程序支持JDBC管理器和数据库驱动程序之间的通信。

JDBC是您的应用程序代码与之交互的通用API。下面是您正在使用的数据库的JDBC兼容驱动程序。

下图是Java持久层中JDBC的体系结构概述。

参考:https://www.javaworld.com/article/3388036/what-is-jdbc-introduction-to-java-database-connectivity.html

配置JDBC

想要使用jmeter连接什么数据库,就需要提前下载相关数据库驱动:

然后,将下载驱动地址,添加到测试计划中:

除此之外,也可以将jar包添加到jmeter安装目录的lib目录也行。

接下来,就是配置数据库连接信息了。

我们分别演示一个sqlite和MySQL的例子。

MySQL

确保jar包添加到了测试计划中。

表信息如下:

开搞吧:

在线程组内新建一个"JDBC Connection Configuration"配置元件:

重要的参数:

  • variable name for created pool:连接池名称。
  • database url:
jdbc:database://ip:port/dbname
# 示例
jdbc:mysql://{ip}:{port}/{dbname}
jdbc:mysql://{ip}:{port}/{dbname}?useUnicode=true&characterEncoding=utf8
  • jdbc driver class:下拉选择跟你数据库对应的驱动即可。
  • username和password就不用多说了。

然后,现在可以在线程组内新建一个JDBC Request取样器了:

结果也有了:

上图中,"调试取样器"中的变量都可以在请求中使用。

SQLite3

确保jar包添加到了测试计划中。

表信息如下:

使用套路和MySQL基本一致,区别也就是databases URL的链接方式不一样,SQLite的这么玩:

jdbc:sqlite:sqlite_database_file_path

# 示例
jdbc:sqlite:C:/sqlite/db/chinook.db
jdbc:sqlite:C:\Users\Anthony\Desktop\db.sqlite3

"JDBC Connection Configuration"配置元件

JDBC Request取样器:

结果也有了:

参考:https://www.sqlitetutorial.net/sqlite-java/sqlite-jdbc-driver/

更多关于数据库的操作,会在数据库压测部分再聊。


欢迎斧正,that's all
posted @ 2020-06-10 16:53  听雨危楼  阅读(321)  评论(0编辑  收藏  举报