一、录制脚本
操作步骤
①打开浏览器的代理服务器(IP设置为127.0.0.1,端口自己设置,比如6666,强制让浏览器访问本机)------浏览器此时无法正常打开网页
②打开jmeter,添加非测试元件-->HTTP代理服务器(设置端口要与浏览器的代理服务端口一致,6666)
③jmeter中添加一个线程组
④http代理服务器中-->目标控制器,选择③中添加的线程组
⑤过滤无用的脚本,http代理服务器中,选择Requests Filter---->选择排除模式----->添加,过滤不需要的gif,php,txt,png,比如 .*\.gif.* , .*\.php.* , .*\.txt.*
⑥点击启动按钮
⑦浏览器访问网页
⑧成功后,将没用的脚本删除,留下可用的脚本,运行,是否会成功。
二.参数化
参数化的方式 .*\.gif.*
参数化的步骤
1.首先设置测试计划--添加线程组(1个)---添加登录的http请求---查看结果树
下面的例子,登录需要有请求头cookie,cookie是从登录首页中获取的,直接再添加一个首页的http请求(参数设置同登录基本一致,路径直接写个/),再在线程组上添加一个cookie管理器,在登录请求下面,添加响应断言,断言一定要放在登录请求的下面!!!(这个只能在登录局域内,否则会出问题)
※httpcookie管理器会自动从首页中获取cookie,给后面访问的请求使用。
查看结果:看响应数据,是否和文档一致。注意在取样器结果中的status_code:200只是表示发送的数据有响应,并不是代表成功。
2.参数化
1).CSV文件
将登录的username,password参数化在CSV文件中,添加配置元件-----CSV DATA set config(Csv数据控件)
将传入的参数username,password参数化
语法:${}
{}里面填写的事CSV数据控件中设置的参数名
在运行之前,可以在线程组中---取样器----添加Debug Sample,在运行后,可以在调试取样器中查看参数的值,比如username,password 的值。
在线程组中设置,循环3次,那么运行查看,依次取文件里面的前3组数据。
上面的文件格式是txt格式,也可以使用CSV文件
csv文件可以将txt文件或者excel文件,直接修改后缀名为CSV即可。
csv文件中,用编辑器打开,列分割符是逗号, 如下:用户名,密码
2)注意事项
① 如果CSV文件中,有空列,在CSV控件中也要用个空(一个空格键即可)去接收。如下:
如果txt文件中,列分隔符不是逗号,是一个tab,那么CSV控件中也要修改分隔符为\t
②CSV控件中的特殊设置
②-1:遇到文件结束符再次循环?----True False
True的情况:
比如,CSV文件中只要有10条数据,而线程组要循环12次,前面10次循环会依次读取CSV中的10条数据,从第11次循环,又返回到CSV文件的第一条数据开始读取。
False:上面的例子,前10次循环读取CSV文件的数据,从第11次开始,读取的数据是空
②-2:遇到文件结束符停止线程?----True False
False的情况:CSV文件中只要有10条数据, 而有12个线程组(循环1次),前面10个线程组会依次读取CSV中的10条数据,从第11个线程组开始,又返回到CSV文件的第一条数据开始读取。
True:前10次线程组读取CSV文件的数据,后面的进程就结束没有了。
③CSV控件,路径设置
上面的例子中,选择txt或者CSV文件都是使用的绝对路径,在项目中,可能需要跨平台,那么使用相对路径就会很方便。
相对路径的写法:./data.txt (./data/csv) 或者 /data.txt (/data.csv)
使用相对路径的条件:读取的文件要在jmeter脚本的相同目录下----下面的data.txt放在作业这个目录里面
④ txt 、CSV文件,优先选择txt文件
CSV文件,消耗的内存更大,jmeter消耗的内存更多,会直接影响性能。
2)类似于注册接口,每次请求都需要一个未注册的手机号,才能注册成功,需要用到参数化;
可以使用 (1)配置元件 -->用户定义变量 或者测试计划中的用户定义变量 ;(2)前置处理器-->用户参数 来设置参数
(1)-1 配置元件 -->用户自定义变量
首先,用函数助手 随机生成手机号后8位
将随机生成手机号的字符串,直接粘贴的用户定义的变量中的value中;手机号前3位号段,可以自行定义:
再将用户定义的变量:user_mobile作为参数,设置到注册请求中:
查看结果树,运行。
这样,就可以重复发送注册接口的请求,不需要每次修改一次手机号了。
(1)-2 测试计划--->用户定义变量
将上面的用户定义变量的值,设置在测试计划中的用户定义变量,也可以实现。
总结:
①用户定义变量的设置方式有2种:测试计划中的用户定义变量 和 线程组-->配置元件-->用户定义的变量
②用户定义的变量是全局变量----可以跨线程组被引用
即不管是测试计划中的设置的用户定义的变量 还是线程组中添加的用户定义的变量,在整个测试计划中,都可以使用。
比如:测试计划中的用户定义的变量glob_user_mobile,在该计划下的所有线程组,都可以使用
线程组1中添加的用户定义的变量,user_mobile,在线程组2中也可以使用。
扩展:用户定义的变量,在一个线程组循环3次 跟 3跟线程组,每个线程组循环1次的区别:
一个线程组,循环3次:
得到的结果是,第一次注册成功,后面2次,注册失败----------手机号已注册!!
也就是说,一个线程组,循环多少次,得到的手机号都是相同的。
多个线程组,每个线程组循环一次:结果与上面一样
总结来说:用户定义的变量 ,在jmeter启动时获取一次值,在运行过程中,不会发生改变。-----上面的手机号,随机生成后,在运行过程中,不管怎么循环都不会发生变化。
(2) 前置处理器-->用户参数
用户参数:是局部变量。-----在哪个线程组中设置的,就只能在当前线程组中被引用(“私人定制”),不能跨线程组使用。
跨线程组引用user_2变量,无法读取到数据。
在(1)中用户定义的变量,循环多次,手机号是不变的,但是在用户参数中,是可以变化的。----多线程组循环1次或者单线程组循环多次,手机号码都是不一样的。
即:用户参数,在jmeter启动时获取一次值,在运行过程中,还会动态获取值。
用户参数的一个注意事项:每次迭代,更新一次
举个栗子:
线程组中,有注册请求和登录请求,引用的是用户参数的变量,注册成功了,到登录的时候,手机号又发生了变化(新的手机号没有注册成功),无法登录
解决上面的问题,就需要在设置用户参数的时候,勾选✔上:每迭代一次,更新一次
即,每迭代一次(注册+登录一次),才会更新一次手机号。-----循环一次,就是一次迭代。
总结:用户定义的变量 和 用户参数 在使用上的区别:根据场景不同,进行选择
2)函数:双下划线开头,名称区分大小写
下面说几个比较重要的函数
①__digest 加密
除了MD5加密,还支持哪些加密算法呢?
选择digest,点击右侧的【帮助】按钮,查看帮助文档,支持下面几种加密算法:
②__IterationNum 迭代数
③__threadNum 线程号 (起始值是1)
④__property / __P获取属性
⑤__setProperty 动态的设置属性
上面的用户参数的变量,是不能跨线程组的,注册手机号的变量就不能多线程组使用。可以将手机号设置成动态属性。
⑥__randomString 生成随机字符串
有些用户名是随机用户,可以随机生成,就i可以用这个函数
⑦ __time 获取时间戳
可以设置的格式有:
⑧__V 拼接函数
3).扩展--http请求默认值
一个系统的测试,需要重复输入http,ip等值,比较麻烦,可以在线程组中添加http默认值,后面再添加http请求时,就不需要填写http,IP,端口之列的数据了
步骤:线程组----添加--配置元件----http请求默认值
3.集合点---同步定时器
集合点的目的:让各个线程(用户)步调一致,对系统进行加压
步骤:线程组---定时器---Synchronize timer
注意:定时器对那个请求进行集合点设置,就放在那个请求的下面,定时器会默认先进行集合,再一并发请求!
首先,对于网页,没有文档,只用用抓包工具,进行抓包,使用fiddler进行抓包
打开fiddler,设置过滤,只抓包一下域名/ip的数据
进行数据抓包,结合页面信息+fiddler中的数据,把抓到的路径、请求参数等输入到jmeter中。
下面添加同步定时器(集合点),让所有的用户在同一时间点并发!
下面进行登录的并发!!!设置5个并发,在5s内完成,查看结果。
集合点参数设置的注意事项:
模拟用户组的数量,不大于线程组包含的用户数
①比如,线程组中的用户数是5个人,这里的参数设置是6,超时时间设置为0,运行时会一致等待集合到6个用户才会并发。
②如果设置参数是2,线程中的用户数是5,那就每集合2个用户并发一次,再集合2个,又并发一次。。。。。最后只剩一个,超时时间不设置的话,就会一直等。
设置超时时间,到了时间还没等到,就释放集合的线程,直接发送测试请求。
超时时间从什么时候开始计算?----线程组的5个用户,每集合2个用户为一组,第三组只有一个用户,从第二组结束开始计算,超时时间没有等到第三组的2个用户,就释放,直接发送测试请求。
③注意事项
总结: