jmter

课程内容:JMeter接口测试和requests接口测试

什么是接口

接口一般来讲分为两种:

①程序内部的接口:方法与方法、模块与模块之间的交互,程序内部抛出的接口,如登录发帖,发帖就必须要登录,如果不登录不能发帖,发帖和登录这两个模块之间就要有交互,就会抛出一个接口,进行内部系统调用。

②系统对外的接口:从别人的网站或服务器上获取资源或信息,对方不会提供数据库共享,只能提供一个写好的方法来获取数据,如购物网站和第三方支付之间,购物网站支付时可选择第三方支付方法,但第三方不会提供自己的数据库给购物网站,只会提供一个接口,供购物网站进行调用。

接口的分类(主要根据协议类型分)

①webService接口:走soap协议通过http传输,请求报文和返回报文都是xml格式的。测试该类型接口可以直接通过soupUI导入wsdl格式的路径(即可获得对应的即接口选择信息)。少数公司还在使用这种接口,如医院等行业。

②http api接口:走http协议,通过路径来区分调用的方法,请求和报文都是key-value形式的,返回报文一般都是json串,有get和post等方法。目前来讲,是最常用的。

③websocket:基于tcp/udp传输层上进行封装出来的抽象层;双向通讯协议;客户端与服务器只要一旦建立连接,则客户端与服务器之间都可以相互传送数据

常见的外部接口有哪些:微信支付宝支付接口、打车定位接口、平台客服接口,查看物流接口、查看天气接口、调用短信接口

接口的交互过程

示意图


接口测试

接口测试是测试系统组件间接口的一种测试。主要用于检测外部系统与系统之间以及内部各子系统之间的交互点。

接口测试也是输入功能测试。区别就是功能测试是界面看得到的,接口测试是通过传参得出返回值的。

接口的本质

数据的输入与输出

接口的作用

传输数据,相当于水管输送水

网络协议:为计算机网络中进行数据交换而建立的规则、标准或约定的集合。

HTTP协议

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。

HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

JSON:(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。

{

            "id": "WS10730EM8EV",

            "name": "深圳",

            "country": "CN",

            "path": "深圳,深圳,广东,中国",

            "timezone": "Asia/Shanghai",

            "timezone_offset": "+08:00"

        }

字典:Python中的一种数据结构。

dict = {

            "id": "WS10730EM8EV",

            "name": "深圳",

            "country": "CN",

            "path": "深圳,深圳,广东,中国",

            "timezone": "Asia/Shanghai",

            "timezone_offset": "+08:00"

        }

JSON与字典的异同点

从形式上看,都是“Key:Value”的形式。

但是从本质上讲,字典是一种数据结构,而json是一种数据格式

字典有很多内置函数,有多种调用方法,而json是数据打包的一种格式,并不像字典具备操作性

格式的限制,json的key和value值两边必须使用双引号,不能使用单引号,但字典没有严格规定,单引号和双引号都可以。

get请求方法

一般是用来获取服务器的资源信息。

post请求方法

一般是用来提交表单数据。

put:修改数据

delete:删除数据

在软件开发过程中,是先开发接口还是UI界面?

先开发接口,后对接前端界面

后端接口主要用来处理业务逻辑,前端主要负责显示内容

为什么要做接口测试

节约项目的开发时间

节约人力和时间成本

提高项目的开发效率

在一个迭代中的什么时候做接口测试

在对接UI前端之前测试接口

使用工具测试接口

因为测试接口的时候UI界面还没有开发出来,没有地方可以输入内容和操作功能

手工测试中,如果给一个功能测试需要考虑哪些方面的测试点?

基本的功能需求(迭代的功能、数据库、与本次迭代有关联的功能模块,不同客户端之间)

兼容性测试

功能的易用性(用户的操作习惯和功能的易操作性)

GUI 界面测试(文字、图片、页面布局,按钮,输入框)

安全测试

性能测试

接口测试中,如果给一个功能测试需要考虑哪些方面的测试点?

基本的功能需求

测试工具代替UI界面测试功能

示意图


常见的接口数据格式

JSON

XML

HTML

接口测试的工具

JMeter

Postman

SoapUI

LoadRunner

Java+httpclient

Python+Requests

手工测试功能的流程(流程环节有待补充)

开需求会议,领取需求

提取测试点,编写测试用例,评审用例

部署测试环境(熟悉搭建过程可以说搭建过,如果不熟悉说公司管理比较严格,有专门的运维人员搭建)

冒烟测试(在测试所有系统功能之前先挑选用例级别较高,功能比较重要的,流程性的用例执行),如果冒烟测试不通过则测试会被挂起

系统测试,执行系统功能所有的用例

提交bug单

回归测试

评审产品(演示产品功能,展示bug,让产品经理了解产品的质量情况,产品上线由产品经理安排)

测试报告

安排上线,产品经理安排时间,开发、测试和运维等人员提供技术支持

线上验证,产品发布后需要在生产环境验证主要的功能和流程

进入维护阶段,产品发布后给用户去使用,如果有问题则修复

接口测试流程

开需求会议,领取需求

提取测试点,编写测试用例,评审用例

部署测试环境(熟悉搭建过程可以说搭建过,如果不熟悉说公司管理比较严格,有专门的运维人员搭建)

编写用例的脚本

执行脚本

提交bug

回归测试

接口测试参考文档有:需求文档(产品经理编写)、API 文档(开发人员编写),API,全称Application Programming Interface,即应用程序编程接口。

接口项目需求:

投资人、借款人注册(member)

投资人登录去充值(member)

借款人登录去提交借款申请资料,平台加项目标(loan)

平台人员审核(新增标后状态是1,运营人员审核2、运营主管审核3、运营总监审核4)(loan)

投资人登录投标(invest)

投标期限内达到借款总金额,即满标

投标期限内未达到借款总金额,即流标,余额返回投资人账户

满标生成借款人回款计划

提取测试点,与手工测试相同

获取API文档信息:接口地址、请求方法、请求参数、响应参数

JMeter环境安装

jdk(建议用java8(1.8))

jmeter

JMeter目录结构

bin目录

bin 目录存放的是Jmeter的主jar包、Jmeter的启动脚本、配置文件等。

ApacheJmeter.jar:主jar包,Jmeter自己的主类

Jmeter.bat\Jmeter.sh:Jmeter的启动脚本。

Jmeter.properties:Jmeter的配置文件,Jmeter界面无法配置的东西,都基本上在该文件中实现配置。修改配置文件后需要重启jmeter。

docs目录

docs 目录存放的是Jmeter的API文档,主要是二次开发需要。

extras目录

扩展目录,存放的是Jmeter和其他软件集成所需要的一些文件。

lib目录

lib目录是JMeter启动时默认的classpath,意味着Jmeter在使用过程中,所有需要被引用(import)的类都需要存放在该目录下。

该目录下的内容变更,是需要重启Jmeter才会生效。

lib/ext目录

lib\ext 目录是Jmeter的第三方组件、插件。

licenses目录

licenses目录存放的是licenses相关的说明文件。

Printable_docs目录

存放的是Jmeter的官方帮助文档。

jmeter功能介绍

主界面


菜单栏

工具栏

JMeter八大元件

取样器,HTTP请求

监听器,察看结果树

后置处理器,JSON提取器

配置元件

固定定时器

修改JMeter页面显示的语言

进入安装目录:apache-jmeter-5.1.1\bin\

找到 jmeter.properties,打开

搜索“ language=en ”,前面带有“#”号

去除“#”号,并修改为:language=zh_CN

保存。

重启Jmeter

创建线程组

新增HTTP请求

添加察看结果树

接口金融项目地址:120.77.247.164:8080

协议的默认端口:http(80),https(443)

发送请求

数据关联

断言,检测业务功能是否成功。

断言结果

数据参数化

方式1:CSV 数据文件设置配置元件


方式2:在数据后拼接time函数,${__time(,)},如小花${__time(,)}

方式3:添加前置处理器的用户参数,这种方式一般用来做配置信息比较多,业务的数据不用这种方式。

示意图


方式4:读取数据库数据

创建配置元件 JDBC Connection Configuration示意图


配置


Variable Name:变量名称,需要变量名绑定到池。需要唯一标识。与JDBC取样器中的相对应,决定JDBC取样的配置。简单理解就是在JDBCrequest的时候确定去哪个绑定的配置。

Max Number of Connection:数据库最大链接数

PoolTimeout:数据库链接超时,单位ms

Idle Cleanup Interval (ms):数据库空闲清理的间隔时间,单位ms

Auto Commit:自动提交。有三个选项,true、false、编辑(自己通过jmeter提供的函数设置)

Transaction Isolation:  事务间隔级别设置,主要有如下几个选项:(对JMX加解密)

TRANSACTION_NODE  事务节点 、

TRANSACTION_READ_UNCOMMITTED  事务未提交读、

TRANSACTION_READ_COMMITTED  事务已提交读 、

TRANSACTION_SERIALIZABLE  事务序列化 、

DEFAULT  默认、

TRANSACTION_REPEATABLE_READ事务重复读、编辑

Keep-Alive:是否保持连接Max  Connection age(ms):最大连接时长,超过时长的会被拒绝Validation Query:验证查询,检验连接是否有效(数据库重启后之前的连接都失效,需要验证查询)。。。。。。

Database URL:如jdbc:mysql://localhost:3306/test  表示本地数据库,3306端口,数据库名称为test

JDBCDriver Class:JDBC的类,如org.gjt.mm.mysql.Driver

创建JDBC Request

示意图


配置 JDBC Request


添加 ForEach 控制器


读取数据


循环控制器

if 控制器

JMeter乱码情况

固定定时器

相当于代码中的sleep

后置处理器,在请求发送之后运行,即运行取样器后再运行后置处理器。

前置处理器,在请求发送之前运行,先运行前置处理器再运行取样器。

注意前置和后置处理器作用的对象是取样器。

作用域

察看结果数监听器能监听到与它同级的取样器运行的结果

配置元件(config elements ),元件会影响其作用范围内的所有元件。

前置处理程序(Per-processors),元件在其作用范围内的每一个sampler元件之前执行。

定时器(timers ),元件对其作用范围内的每一个sampler 有效。

取样器(sampler),元件不和其它元件相互作用,因此不存在作用域的问题。

后置处理程序(Post-processors),元件在其作用范围内的每一个sampler元件之后执行。

断言(Assertions),元件对其作用范围内的每一个sampler元件执行后的结果执行校验。

监听器(Listeners),元件收集其作用范围的每一个sampler元件的信息并呈现。

逻辑控制器(Logic Controller),元件只对其范围内的取样器和逻辑控制器作用。

作用顺序

1.配置元件(configelements )

2.前置处理程序(Per-processors)

3.定时器(timers)

4.取样器(Sampler)

5.后置处理程序(Post-processors)(除非Sampler 得到的返回结果为空)。

6.断言(Assertions)(除非Sampler得到的返回结果为空)。

7.监听器(Listeners)(除非Sampler得到的返回结果为空)。

作用域原则

取样器(sampler):元件不和其它元件相互作用,因此不存在作用域的问题。

逻辑控制器(LogicController):元件只对其子节点中的取样器 和 逻辑控制器作用。

除取样器和逻辑控制器元件外其他6类元件:如果元件是某sampler的子节点,则该元件只对其父子节点(即sampler)起作用。

除取样器和逻辑控制器元件外的其他6类元件:如果其父节点不是sampler ,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点等)。

前置处理器、后置处理器和断言等元件只能对取样器作用,因此,如果在它们的作用域内没有任何取样器,则不会被执行。

点击启动脚本按钮后没有执行脚本原因

csv配置元件没有写数据文件的路径

脚本代码被注释了

查看if控制器的条件是否有问题,特别注意从数据文件中读取中文过来时出现乱码问题

读取csv数据行数的beanshell脚本

import java.io.BufferedReader;

import java.io.FileReader;

BufferedReader br=new BufferedReader(new FileReader("D:\\jmeter\\data\\webtours.csv"));

String tmpStr="";

int rowCount=0;

while(tmeStr=br.readLine()!=null){

    rowCount++;

}

rowCount=rowCount-1;

vars.put("rowCount",String.valueOf(rowCount));

jmeter内置函数使用

${__time(,)},获取当前时间。

第一部分参数是时间格式


第二部分参数是变量名,把当前时间保存到变量中。

${__setProperty(,,)},设置JMeter属性(参数)的值,属性是JMeter的全局属性,因此可用于在线程和线程组之间进行通信,即调用。


例子: ${__setProperty(new_member_id,${member_id},)}

${__P(,)},这是一个简化的属性函数,旨在与命令行上定义的属性一起使用。


例子:${__P(new_member_id,)}

${__CSVRead(,)},读取csv列数据。


例子:${__CSVRead(D:\jmeter\data\webtours注册.csv,0)}${__CSVRead(D:\jmeter\data\webtours注册.csv,next)}


${__counter(,)},每次调用计数器都会生成一个新数字,从1开始,每次递增+1。


例子:Java请求--线程号是:${__threadNum}--${__counter(True,num)}


${__Random(,,)},随机函数返回位于给定最小值和最大值之间的随机数。


例子:


多个线程组依次运行

示意图


局部参数转化为全局参数

步骤1:


String member_id=bsh.args[0];

${__setProperty(new_member_id,${member_id},)};

步骤2:


HTTP请求默认值

HTTP请求默认值,是一个配置元件,在执行所有脚本之前先执行。

如果用例的http请求没有写配置信息,如协议,ip,端口,编码格式等等,那么工具会自动把HTTP请求默认值中的相对应值写入到用例的http请求中。

如果HTTP请求默认值和用例的http请求配置都有值,优先使用用例http请求的配置信息。

示意图


HTTP信息头管理器

HTTP信息头管理器,也叫header请求头,是一个配置元件。

一般参数为非业务信息,比较常见的是token,身份认证key等认证信息。如果服务端可以识别的话,当然放哪里都没区别,但按照协议约定,这种东西一般还是放header比较好。

例子


插件管理

步骤

下载jmeter-plugins-manager-1.3.jar插件,放入JMeter\lib\ext文件夹中。

重启 Jmeter,在option-- plugins manager中进入插件管理页面下载插件。


websocket协议请求

WS协议和WSS协议两个均是WebSocket协议的SCHEM,两者一个是非安全的,一个是安全的。

安装


添加


脚本


session &  cookie & token关系

session

Session是服务器在和客户端建立连接时添加客户端连接标志,建立连接时生成Session,最终会在服务器转化为一个临时Cookie发送给给客户端,当客户端发送第一请求时服务器会检查是否携带了这个Session,如果没有则会添加Session,如果有就拿出这个Session来做相关操作。

session可以理解为一个状态列表,拥有一个唯一识别符号sessionId,通常存放于cookie中。服务器收到cookie后解析出sessionId,再去session列表中查找,才能找到相应session。

说明:session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。

cookie

Cookie 是一个存储在客户端浏览器目录中的文本文件。

携带记录了服务器返回来的 session信息。

具有时效性,有些是临时的,有些是持续的。临时的 Cookie只在浏览器上保存一段规定的时间,一旦超过规定的时间,该 Cookie 就会被系统清除。

说明:cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗。

token

token有两种,一种是跟cookie一样,存在客户端,携带sessionid,也就是跟cookie是一样性质的东西,只是名字不一样而已。另外一种是令牌。

token是用户身份的验证方式,我们通常叫它:令牌。

最简单的token组成:

1.uid(用户唯一的身份标识)

2.time(当前时间的时间戳)

3.sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)

4.固定参数

session存在服务器,cookie存在客户端。当客户端与服务器第一次连接时会产生session,然后session在服务器转化为携带sessionid的cookie,接着返回给客户端。客户端第二次发送请求时携带cookie信息,服务器接收到请求后校验sessionid。

示意图


JMeter 性能测试

线程组

线程数就是虚拟用户数,如100就是100个用户。

Ramp-up 时间是用户的启动时间,如10就是10秒,也就是平均每秒启动10个用户。

循环次数是线程组的循环次数。

badboy录制JMeter脚本

babboy录制浏览器操作的行为步骤。

badboy录制脚本导出成JMeter脚本,然后用JMeter打开调试。

Badboy 录制出来的脚本有 Bug ,会影响线程组的循环次数 功能,导致在线程组设置了多次循环但最终只会循环一次。

解决:先把循环控制器设置成简单控制器,再把简单控制器设置成循环控制器。


添加断言(检查点)

添加CSV数据文件配置元件(注册500个新用户)

添加聚合报告,监听测试的结果,可以把结果保存到文件中。

示意图


思考:录制登录脚本,登录成功后断言(检查点)

脚本关联

后置处理器--正则表达式提取器,确定左右边界,左右边界尽量保持唯一性

需要关联的数据用 (.*?)替换,如:Thank you, <b>(.*?)</b>, for registering,.点代表单个字符内容,*星代表多个字符内容,?问号代表匹配到内容后停止。

示意图:


引用名称:获取到的数据保存到变量中,即将结果存储在其中的JMeter变量的名称。

正则表达式:使用正则表达式在请求的响应信息中获取数据

模板:查找内容的匹配项,格式:$数字$

匹配数字:使用第几个匹配项的值,第一个写1,第二个写2,......注意0代表随机

缺省值:如果正则表达式不匹配,则引用变量将设置为默认值。

JMeter 查看结果树的脚本名称为绿色,不一定代表业务运行成功。这里的绿色代表脚本的格式没有问题,但不能代表业务是成功的。

并发测试

并发测试:多个人同时去做同一件事情。

集合点:是实现并发测试的一个策略。

并发一般出现在各种抢票、抢购,同时打卡,同时登录系统等等场景。

集合点通过定时器--同步定时器实现。

示意图


同步定时器设置

示意图


释放用户的策略

模拟用户组的数量:等到有10个用户达到集合点就释放用户

超时时间:从第一个用户到达集合点开始算时间,等了20秒后如果还没有等到10个用户,那么不等其他用户了,等到几个用户就释放几个用户。

练习:测试本机最大能承受的并发数。

监控插件

下载地址:https://jmeter-plugins.org/downloads/old/

客户端(JMeter安装的机器):

JMeterPlugins-Standard

JMeterPlugins-Extras

服务端(被测对象部署的机器):

ServerAgent

把JMeterPlugins-Standard.jar和JMeterPlugins-Extras.jar插件,放入\lib\ext 目录下。

把ServerAgent.jar插件放到服务器任意目录下,点击startAgent.bat文件启动监控。

监控项目:

jp@gc - Hits per Second,每秒点击数(请求数)

jp@gc - Transactions per Second,每秒事务数

jp@gc - Response Times Over Time,响应时间

抓包工具

fiddler,代理抓包

Charles

Wireshark

httpwatch

浏览器的F12

fiddler抓包

代理抓包

通过端口监听浏览器信息

fiddler示意图


浏览器示意图


fiddler功能介绍

请求和响应信息界面


总结JMeter测试

功能

接口手工测试,一般是接口刚开发出来进行测试。

接口自动化测试,一般在功能稳定后实现。(重点掌握)

性能

接口性能测试,单单测试接口性能。

系统的性能测试,录制用户在浏览器上的操作过程,模拟做性能测试。

录制脚本可以使用badboy,也可以使用JMeter代理录制。

面试题:

你们一个迭代写多少接口测试的用例

每天你能写多少接口测试的用例

整个项目总共有多少接口测试的用例

在公司里做接口测试,如果没有api文档,如何开展测试?

问开发要

问了开发说没有,要求开发编写

在产品开发前期,界面没有出来之前如果没有api文档是没有办法做接口测试的,一定要求开发编写

在产品开发后期,界面已经实现出来如果没有api文档,可以通过抓包获取接口信息然后再开展接口测试

https://www.jianshu.com/p/7231e902c775

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容