接口测试工具jmetet之参数化、关键、断言
接口测试-知识点
1: Jmeter的参数化
2: Jmeter正则表达式(关联)
3: 断言
前期提要:
接口分类:内/外部、类型/协议: http、 soap(webservice)
接口数据格式: xml、 json
请求方式: get、post区別? 历史文章;
jmeter:测试计划、线程组、请求(http、 soap、 jdbc)、查看结果树
soap请求:soapui辅助自动解析类和方法,body+ 请求头
jdbc请求: url、 driver class,添加lib目录驱动jar包
一、参数化
---先设置一个变量将值传入变量,对变量进行变量引用
1、参数化的三种方式(必问)
在jmeter中,通过${变量名}来获取参数值。
方式1-用户定义的变量
方式2-函数助手中的函数获取参数值Random函数_RandomString函数
方式3-配置元件CSV Data Set Config
--详解--
1)用户定义的变量
☞实例:前程带项目中有注册、登录、充值三种接口,其中都包含手机号这个参数,如果要使用jmeter跑注册、登录、充值的流程,那么每一次要经历一个流程时,每个请求都需要改参数手机号的值吗?
▶思路:我们可以将手机号这个参数单独拿出来,单独只修改变量这一个地方就可以
▷解决:添加用户定义的变量
步骤①:线程组右键添加-->配置元件-->用户定义的变量
出现如下设置页面后
输入名称、值;
♦注意:名称(变量名)可以自定义设置
步骤②然后将设置后的变量名称,在注册、登录、充值请求中进行参数化引用${phone}
♦注意:引用的参数名与用户定义变量设置的名称必须保持一致
登录请求中手机号
步骤③点击运行,查看结果树,显示成功
♦注意:考虑哪些可以使用固定一样的值
2)函数助手中的函数获取参数值Random函数_ RandomString函 数
☞实例:模拟多个用户注册,需要用到不同用户信息注册,要求手机号不重复,但不需要手机号真实存在,该怎么做?
▶思路:设置随机的手机号作为注册接口的测试用例,手机号假设固定号段为189,那么剩下的8位使用随机函数生成
▷解决:使用函数获取参数
步骤①选择菜单栏 选项-->函数助手对话框
弹出函数助手框,功能下面有多个函数可供选择,我们主要看下__RandomString,其他可以自行了解下哟
步骤②要进行多个账号注册(比如10个用户),注册信息要求手机号mobilephone不能重复;所以可以这么来思考,手机号前3位号段固定,那就对手机号后8位进行随机,页面设置如下:
步骤③拷贝生成的函数字符串,粘贴进行参数引用
步骤④设置线程组线程数为10,模拟10个虚拟用户的注册
步骤⑤点击运行,查看结果树,显示成功
看到数据库中插入了10条以189开头的随机的手机号的数据
♦注意:密码不建议随机,因为密码加密了,随机后就不知道加密后是什么内容,除非对密码有特殊要求,一般密码都一样
♦注意:如果号段不一样就不能使用这个方法
3)配置元件CSV Data Set Config---文档参数化,用法多,用处大
☞实例:模拟多个用户注册,需要用到不同用户信息注册,若需要注册的手机号不能随机,必须是用户真实提供的手机号进行注册的话,该怎么做?
▶思路:提前收集数据放入一个文件中,读文本进行导入数据;提前收集用户真实手机号及昵称,存放在本地txt或者CSV文件(CSV文件默认逗号隔开)
♦注意:尽量使用TXT,CSV格式,使用其他格式比较容易出问题
♦CSV文档---类似于Excel,后缀为csv
▷解决:创建信息文本,使用CSV Data Set Config进行获取
步骤①创建数据
步骤②线程组右键添加-->配置元件-->CSV Data Set Config
填写信息
参数解释:
●Filename:需要传入文件的完整路径。是绝对路径,要加上后缀
●File encoding:参数文件的编码格式。可以不填。若果是TXT,CSV格式可不做额外设置
●Variable Names:对应参数文件中每列的变量名,也是你要引用到请求中的参数变量名。这里第一列是手机号、第二列是昵称。变量名可以自定义。
igonre first line(only used if Variable Names is not empty):当 CSV 文件中首行设置了变量名时,该项设为 true,此时每次请求读取文件时会自动忽略首行,直接读取第二行的数据。若首行未设置,则选择False
●Delimiter:文件中的分隔符,默认英文的逗号分隔。所以注意txt文档中每行多个参数用英文逗号分隔。
●Recycle on EOF: 设置为True后,允许重头循环取值;为False,当读取文件到结尾时,停止读取文件
●Stop Thread EOF: 当Recycle on EOF为false并且Stop Thread EOF 为true,则读完csv文件中的记录后,停止运行,线程数及执行次数无效。
●Sharing Mode:共享模式。All threads:所有线程,所有线程循环取值,线程1取第一行,线程2取下一行;Current thread group:当前线程组,各个线程组分别循环取值;Current thread:当前线程,该测试计划内的所有线程都取第一行。
步骤③使用CSV Data Set Config中定义好
a、直接参数化引用
b、通过函数助手进行参数化引用
步骤④设置线程组中线程数为10,执行后,输出如下结果:成功
♦注意:如果文档中数据小于10,会对文档一直循环读取,一般登录会如此,循环登录
数据中结果
注意:测试注册接口细节,可以将用例数据写入文档,进行一次性运行
接口测试时可以这么去设计,把数据准备好,接口测试需要准备很多数据,先跑正常流程,再针对细节参数去测试,将数据准备好,放入脚本,工具跑数据,jmeter是手动测试,但不完全是,半自动。
★参考:https://www.cnblogs.com/tudou-22/p/9197992.html
附加了解:
1)如何设置循环次数。
2)根据参数化设计测试用例以及测试点。
3)这些元件都是有作用域的,看放在哪里,就对它的兄弟和兄弟下方的子集有作用,元件可以进行拖动
作用域---放在测试计划下,针对所有线程有效--全局
二、正则表达式提取器
1、关联
关联概念:两个请求,上一个请求的响应结果,作为下一个请求的传入
关联运用的场景:下一个请求的参数值是变化的------关联--至少涉及2个请求
☞实例:接口测试过程中,发现登录后去进行充值,但是充值会提示请登录?不是先做了登录吗?
充值没有权限(充值需要先登录,没有检测到登录信息),跳转到登录页面,地址被重定向
★参考:https://www.cnblogs.com/nickjiang/p/9148136.html
2、页面重定向问题:
要确保是一个用户登录,并确保登录用户是同一个用户,jsessionid就像一个通行证,必须要登录后才有jsessionid,cookies一直在变化,每次登录不一样
当服务器收到这个请求的“Cookie”请求头里的会话id去服务器匹配,判断是同一个session会话,会话中有登录用户的信息,从而判断这个请求是一个登录用户发出的,从而放行这个请求。
▶思路:登录后的jsessionid,登录状态没有传给充值接口,找到这个参数做一个参数传递
▷解决:设置一个HTTP Cookie 管理器
步骤①线程组右键添加-->配置元件-->HTTP Cookie 管理器
注意:添加一个后对所在区域都有效(此时是在这个线程组下方有效),设置后会自动获取当前的Cookie信息,自动传递所在区域有需要的请求
步骤②点击运行,查看结果树,显示成功
♡对比:
✘未添加
✔有添加
注意:有两个请求从上到下
3、关联方式
Jmeter中的关联是通过“添加一后置处理器一正则表达式提取器” 来获取数据,传给后面的请求使用。
正则表达式:常见的形式(.+?)
模板:用$$引用起来,如果是多个提取表达式,则可以是$1$$2$等匹配数字: 0随机,1代表所有,通常取0
缺省值:如果返回结果中没有匹配的值,则变量的值采用默认值。
注意:正则表达式放在请求的后面,数据从“查看结果树“的响应数据获取。从接口请求的响应结果中获取;或者数据库中获取
☞实例:接口测试过程中,发现登录后去进行充值,但是充值会提示请登录?不是先做了登录吗?不使用HTTP Cookie 管理器的情况下,怎么解决?
▶思路:不使用HTTP Cookie 管理器,从上一个请求的结果中取值,
▷解决:添加正则放在要请求的子集,相当于提取,不放
步骤①请求右键添加-->后置处理器-->正则表达式提取器
步骤②填写正则表达式内容
说明:
(1)引用名称:下一个请求要引用的参数名称,如填写title,则可用${title}引用它。
(2)正则表达式:一般值的名称(键)是不会发生改变的。要获取特定的数据,都会结合不变的内容(左右边界),然后将需要提取的服务器数据替换为(.*?)即可。
注意:上一个请求(如登录)的结果中提取关键词jsessionid,和它前后的字符,以便jmeter去查找到关键词jsessionid,需要传递部分使用()先括起来,在()中间写正则表达式/匹配表达式,左边界( )右边界
():括起来的部分就是要提取的。
.:匹配任何字符串。
+:一次或多次。
?:不要太贪婪,在找到第一个匹配项后停止。
(3)模板:用$$引用起来,如果在正则表达式中有多个正则表达式,则可以是$2$$3$等等,表示解析到的第几个值给title。如:$1$表示解析到的第1个值,$N$:表示将第N对括号的值赋给参数。
(4)匹配数字:该处可以填写的是正整数N,数字0,负数三种,0代表随机取值,1代表全部取值,通常情况下填0
(5)缺省值:如果参数没有取得到值,那默认给一个值让它取。
注意:要检查字段要选择对应,结果不对的话,请每个都做尝试
学习/测试要抱有试错、专研精神!!
步骤③请求右键添加-->后置处理器-->Debug PostProcessor
Debug PostProcessor是常用的一个调试工具
4:正则表达式
正则表达式概念:匹配内容的一个表达式。error.log ==查找==结果包含: rerror.log、error.log(结果:模糊匹配/完全匹配)
表1.常用的元字符
代码 |
说明 |
. |
匹配除换行符以外的任意字符 |
\w |
匹配字母或教字或下划线或汉字 |
\s |
匹配任意的空白符 |
\d |
匹配数字 |
^ |
匹配单词的开始或结束 |
$ |
匹配字符串的开始 |
表2.常用的限定符
代码/语法 |
说明 |
* |
重复零次或更多次 |
+ |
重复一次或更多次 |
? |
重复零次或一次 |
(n) |
重复n次 |
(n,) |
重复n次或更多次 |
(n.m) |
重复n到m次$匹配字符串的结束 |
元字符:用来匹配相关字符
限定符:限定元字符匹配的次数
如何判断你自己的正则表达式是否正确?可以在线去检验一下。
★参考:http://tool.oschina.net/regex/ 30分钟入门正则表达式
♦注意:作为测试人员不需要了解太深,万能表达式 .*? 和 .*
♦注意:在需要的地方做变量引用
步骤④引用变量
步骤⑤点击运行,查看结果树,显示成功
问题?
1、正则表达式有多个值?怎么获取?
2、关联拓展:登录--->用户member表-jdbc请求----->获取用户所有投递记录(参数memberid)
5:Jmeter断言----可以看成检查点----预期
通过添加——断言——响应断言;
还需添加监听器——预言结果,才能在执行后查看断言结果是否正确
如果请求成功了,那么断言结果就会正常显示的接口,否則会报错,显示红色。
断言结果
每个请求添加断言,然后直接查看结果---测试主流程
添加完响应断言,需要添加断言结果来判断断言是否成功。