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方式请求服务器的时候,会面临着许多的安全性问题,例如:
- 请求来源(身份)是否合法?
- 请求参数被篡改?
- 请求的唯一性(不可复制)
为了保证数据在通信时的安全性,我们可以采用参数签名的方式来进行相关验证。
那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接口包括两层:
- JDBC API支持Java应用程序与JDBC管理器之间的通信。
- JDBC驱动程序支持JDBC管理器和数据库驱动程序之间的通信。
JDBC是您的应用程序代码与之交互的通用API。下面是您正在使用的数据库的JDBC兼容驱动程序。
下图是Java持久层中JDBC的体系结构概述。
配置JDBC
想要使用jmeter连接什么数据库,就需要提前下载相关数据库驱动:
- MySQL:https://dev.mysql.com/downloads/connector/j/
- SQLite-jdbc:https://bitbucket.org/xerial/sqlite-jdbc/downloads/
然后,将下载驱动地址,添加到测试计划中:
除此之外,也可以将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