在编写网关自动化脚本以前,得先学会如何抓包,这里以Fiddler为例。会抓包的同窗能够跳过这一步,固然看看也是没坏处的……html
将要进行抓包的手机与电脑连入同一局域网,电脑才可以抓到手机APP的请求,这里介绍一种咱们在使用的网络配置方法。git
首先使用电脑A布置一个咱们抓包须要的局域网。下载猎豹WiFi(网上有不少这种工具360免费WiFi、百度WiFi等,随意下载一个就好,这里咱们以猎豹WiFi为例),安装完后建立一个WiFi便可。web
而后使用抓包的电脑B链接刚刚创建的WiFi,链接好后查看电脑B的IP地址。正则表达式
用测试手机链接刚刚创建的WiFi,在局域网设置中将其代理改成电脑B的IP地址,端口号:8888,保存便可。express
Fiddler的安装,在网上下载最新的版本就能够,这里给出一个我安装的4.5版本的连接http://sq.jd.com/bFPg1z ,下载安装,步骤就省略了,下一步..下一步便可。apache
安装完成后打开Fiddler,在菜单栏Tools->Fiddler Options->Connections,勾选Allow remote computers to connect,默认的端口号为8888,这里不须要修改,在修改手机代理设置时注意与这里一致。数组
由于咱们所须要抓取的基本上都是京东到家有关的请求,因此咱们能够设置只抓取咱们所须要的请求,如图,选中右方Filters,在下方 Hosts设置中选择Show only the follow Hosts,而后填入咱们所须要抓取请求的Host,好比这里填入的是京东到家Android线上和预发布的Host。网络
到这里Fiddler的基本配置就完成了,接下来就能够开始抓包啦。数据结构
本机IP:192.168.191.2 app
Fiddler端口号:8888
提示:在每次抓取时重复下步骤3中清空结果列表的操做,能够更容易地找到须要抓取的请求。
这里很难对Jmeter作一个全面的介绍,并且我也只是了解了一些皮毛,因此就在实例中一一介绍吧,全部配置齐全以后,就开始咱们的第一条脚本吧。下面的步骤说得比较详细,比较啰嗦,请勿急躁。
注意:HTTP请求有GET和POST两种,不一样的请求记得选择不一样的请求方法!!!
这样咱们的第一条Jmeter脚本就基本完成了,基本全部的HTTP请求都是大同小异,多练习写几条基本就能手到擒来了。结果树和Cookie管理器每一个线程组添加一个就够用了。
实际上,完成上面两个步骤并不算是真正学会了脚本的编写,由于脚本中最重要的一部分是它的断言,断言是来判断网关返回JSON结果是否正确和完整的重要手段。下面的内容写得比较啰嗦,麻烦你们必定要耐心点,别睡着!
在写过一些脚本以后你们可能就会发现,所谓的写脚本无非就是不停地复制,粘贴,复制,粘贴……因而你们确定会想一些让本身能更快复制粘贴的方法。参数化的方法就能在简化这个过程的同时让你们更清晰地认识到URL的结构。
URL其实就是不少个参数组成的,而里面的参数通常是会加密的,为了更好地了解URL的结构,能够对URL进行解码,这个百度一下大把解码工具能够用,都是在线的,非常方便。这里给个参考的连接http://meyerweb.com/eric/tools/dencoder/ ,URL粘进去点Decode便可。
解码结果以下:
从解码后的URL里能够看出其中不少参数的值,appName、signKey、screen、body等都是。通过对大量URL的分析, 发现全部京东到家请求URL中有不少参数是不变的。更具体来讲,根据请求的不一样,只有signKey、body和functionId这三个参数是发生改 变的,其他的参数,在帐号和手机设备不变的状况下是不会发生变化的。这样的话,咱们把那些不变的参数放在一块儿统一管理,每次在写新的脚本的时候,只须要改 变那三个不一样的参数就能够了。
1)设置参数。在线程组右键选择添加->配置原件->用户定义的变量。
而后在定义变量的页面点击下方添加按钮进行URL参数的添加,这里参考解码后的URL,将其中的参数逐一进行添加。从下图中能够看到,除了 signKey、body和funtionId这三个参数外,其与参数都被添加。咱们也可以发现这些参数大都是和手机型号、系统、app名称版本等信息有 关的,只要手机设备不更换、到家版本不更新,这套参数是能够一直用下去的。固然你们在使用本身设备和帐号的时候记得更新下这些参数。
2)给请求添加参数。回到到家首页的HTTP请求,这时候咱们已经不须要在路径的框里粘贴上那条很长很长的URL了。那么怎么使用上一步中的参数 呢?看了下面这张图就明白了。这里引用参数的方法是${参数名}。能够看到下面的表中的参数是通请求一块儿发送的参数,也就是说是这些参数组成了原来的那条 很长很长的URL。
注意下图表中框出的三个参数,就是前面一直在提到的每一个请求都不一样的那三个参数,signKey、body、functionId。那么之后再写新的脚本的时候,只须要改这三个参数,其余的地方都不须要改动。注意:下面的body参数是通过解码的,因此应当勾选后面的编码框。
说了这么多,你们确定会以为没有必要这么麻烦,直接复制粘贴不就行了么,那么下面就举一个例子来体现下参数化的好处。按照上面的步骤设置添加好参数后,首页的脚本应当是能够运行了,下面咱们以首页为基准,来写一条新的脚本,以秒杀页面为例。
第一步:使用Fiddler抓取秒杀页面的请求,对URL进行解码。注意标记的三个参数一会要用。
第二步:选择"首页"脚本,右键点击选择复制,选择"京东到家"线程组,右键点击粘贴,其实就是把首页的脚本复制一份。因而线程组里又出现了一个新的首页。
第三步:选择新复制的首页脚本,将其名称改成"秒杀页面",而后把参数列表中的那三个参数改成第一步中对应的值,而后Ctrl+S保存就能够啦。
是的,只须要这三步,就能够完成一个脚本,整个过程不超过一分钟。之后写每一个脚本均可以用这三步实现。固然,后续给脚本加上断言以后还须要改动断言。
若是你是从开头一步一步读过来的,那么你如今必定可以很快地写出一条脚本,这时候就有一个问题出现了,脚本写完了,能够运行了,也能够看到运行返回的结果了,那怎么能知道返回的结果是否是正确呢?是否是完整呢?这里先介绍一种简单的判断方式:响应断言。
右键点击HTTP请求添加->断言->响应断言。
这里的响应断言主要是针对HTTP请求返回的JSON字符串的,咱们通常使用的是包括断言,就是返回的结果是否包含咱们须要的信息。断言文 本的截取能够在运行结果树里进行,将结果显示类型改成Text(固然也能够JSON格式和Text格式对比着找),找出须要断言的信息。
须要注意的是响应断言支持正则表达式,这能够对一些常常变化但格式固定的内容作一些断言。下图中最后一条断言就是正则表达式,其内容表达的是秒杀剩余时间是否大于0小于3600秒。这个能够根据检测点的须要去添加。想学习正则表达式的同窗能够戳连接:http://deerchao.net/tutorials/regex/regex.htm 。
固然,响应断言的缺点很明显,它的格式过于固定,不能知足一些检查点的需求操做,好比比较大小,检查字段值是否为空。还有就是正则表达式会将全部符合格式的内容都筛选出来,不容易具体查出咱们须要的内容。
它的优势就是比较简单,对于一些固定的内容能够起到很好的判断做用,好比下面第一条断言,这个能够基本断言出请求是成功的,另外对于首页楼层之类的信息也很适合用响应断言。
在写完正则断言后,要验证它的正确与否,能够在结果树中,将结果显示类型改成RegExp Tester,而后将断言复制到下方的Regular expression中,点击Test就能够看到匹配的结果。
使用了响应断言以后,可能可以解决一部分的检查点,可是确定还有不少检查点是经过响应断言覆盖不了的。这里给你们介绍另一种断言的方 式,Bean Shell断言,说白了也就是经过写代码来解析返回的JSON字符串,提取有用的信息,进行相应的检测。我对于Bean Shell的脚本语言也没有什么了解,基本都是使用简单的JAVA代码来实现的(真的是很简单的代码,除了if仍是if,连else都没有)。在响应断言 里实现不了的功能,也基本均可以经过代码来实现。
要解析JSON字符串,就要对JSON作必定的了解,实际只要知道JSON的基础结构就能够。JSON有两种结构,对象和数组,经过这两种结构能够表示各类复杂的结构。但愿你们可以本身百度了解下JSON的结构,下面大概对JSON的基础结构介绍一下,仅供参考。
对象:表示为用"{}"括起来的内同,其数据结构为 {name1:value1,name2:value2,…}的键值对的结构,name为属性名,value为对应的属性值,这个属性值的类型有数字、字 符串、对象、数组几种。以下图的例子,返回的JSON字符串中,result就是一个对象,其中的city、address、title等都是对象的属性 值。
数组:表示为用"[]"括起来的内容,其数据结构为[object1,object2,…],其中object是JSON对象。以下图中的例子,result表示的是一个数组,它的第0个和第1个元素分别是一个对象,对象中又有各自的属性。
通过对象、数组的组合就能够组成复杂的数据结构了,明白了上面两点,就基本够用了,JSON的解析就是一个不断深刻寻找所需信息的过程。
Bean Shell断言实际上就是经过对JSON字符串的解析找到须要检测的数据进行相应的检测比对的过程。下面经过一个例子来具体说明下其编写方式。
由于手机APP上会显示商店名称、商店图片、营业时间、商店评分和满免运费的信息,因此这里咱们对这些信息作一下检查,在请求返回的 JSON结果中找到对应的字段:storeName、imgUrl、serviceTimes、shopFreeFreight和scoreAvg。
在HTTP请求点击右键,选择Bean Shell断言,添加Bean Shell元件。
添加完成后就能够开始编写Bean Shell脚本了,这里的代码就是对上方JSON返回串的解析,其中JSONObject是前面所说的对象,JSONArray就是数组了。里面输出的错 误信息会输出到Jmeter刚打开时后面的那个黑框里。其他的JAVA语句都是很经常使用的if、for语句,相信只要明白了JSON结构,编写这里就很 easy啦!
固然了,为何不用一些更复杂的代码实现更强大的功能呢,缘由有两个,一个是个人编码水平还颇有限,之后会不断学习增长代码实现的功能,另外一个缘由就是 Jmeter里的Bean Shell感受比较low,若是代码出现错误(语法错误之类的),很难定位到是什么地方出现了问题,因此简单的代码可以让你更容易地运行和维护代码。
这个教程可能仍是会漏掉不少东西,你们在一开始编写脚本的时候可能还会遇到一些不懂的地方,这个能够去git上下载我最新上传的脚本以供参考,或者直接来问我就好,脚本地址:
1.4.1线上地址:http://source.jd.com/app/gateway-auto-ant141
1.4.1预发地址:http://source.jd.com/app/gateway-auto-ant141-pre
由于脚本常常会Cookie过时或者有新的更新,因此git上的脚本会实时更新,当发现脚本出现大量错误的时候,试试去git上下载份新的脚本试试看。