目录结构
一、用户登录脚本开发
1.用Badboy录制登录脚本
2.导出脚本添加到JMeter中
3.优化脚本:设置对登录用户名进行参数化,调用csv读取登录数据
4.添加定时器(控制登录步骤的等待时间)
5.设置响应断言,判断登录是否成功
6.执行1个线程1次循环,检验脚本运行效果
二、随机购买商品脚本开发
1.用Badboy录制商品购买业务的脚本
2.导入脚本到JMeter中,设置对登录用户名进行参数化
3.利用Fiddler抓包获取添加商品到购物车的请求数据,补充添加到JMeter
4.利用Regex Tester正则表达式测试器,检验获取随机商品id的正则表达式效果
5.配置JMeter中的正则表达式提取器,设置goods_id为随机变量
6.添加定时器
7.设置响应断言,判断是否购买成功
8.添加查看结果树、聚合报告,统计脚本运行的数据
9.执行检验脚本运行效果
本次ECShop测试站点:http://localhost/ecshop36/ecshop/
一、用户登录脚本开发
测试要点:
1.利用BadBoy录制用户登录ECShop站点的过程,生成JMeter脚本
2.在JMeter中对登录用户名进行参数化。为模拟不同用户登录,更符合实际业务场景,因此需要针对用户名进行参数化
具体操作过程如下:
1.用Badboy录制登录脚本
2.导出脚本添加到JMeter中
3.优化脚本:设置对登录用户名进行参数化,调用csv读取登录数据
添加 CSV Data Set Config
登录信息中设置用户名为参数化对应的变量
4.添加定时器(控制登录步骤的等待时间)
脚本录制过程中,用户输入帐号及密码,大概需5s左右,其余操作则不考虑等待时间(可根据具体需求确定),需添加3个计时器:
>> 用户登录前等待信息输入:5s 计时器
>> 登录成功等待返回首页:3s 计时器
>> 用户退出等待返回首页:3s 计时器
以上时间的设置是基于前文 [JPT_03]性能测试-测试模型构建 & 用例设计 中登录业务线程数确定时假定的模拟用户的时间花费而定。
添加 Constant Timer(固定定时器):
5.设置响应断言,判断登录是否成功
添加 Response Assertion(响应断言):
设置断言内容为:"登录成功"
若Response数据中包含此字符串,则代表登录成功
添加View Results Tree(查看结果数)、Summary Report(聚合报告),用于统计测试脚本执行过程中的数据表现
6.执行1个线程1次循环,检验脚本运行效果
以上,本次ECShop站点登录业务的脚本开发完成
二、随机购买商品脚本开发
测试要点:
1.用BadBoy录制用户登录、浏览商品、加入购物车、设置物流方式、支付方式及收货信息提交订单等过程,生成JMeter脚本
2.为了实现随机选择某种商品,然后进行购买的行为,需在页面中随机获取商品的id。登录成功后,通过分析商品首页的HTML源代码,利用JMeter正则表达式提取器实现随机获取商品id
3.在实际测试中,可利用Regex Tester正则表达式测试器运行获取脚本所需的动态数据,当确定数据获取正确后,再配置JMeter中的正则表达式提取器
4.参数化:登录用户名、商品随机浏览的id、商品随机购买添加到购物车的id
具体操作过程:
1.用Badboy录制商品购买业务的脚本
2.导入脚本到JMeter中,设置对登录用户名进行参数化
3.利用Fiddler抓包获取添加商品到购物车的请求数据,补充添加到JMeter
分析脚本请求,发现Badboy并未录制到将所选商品具体属性添加到购物车的请求,因此需要手动添加补充才能完整运行脚本。此时利用Fiddler工具抓包分析,可找出对应请求,包括:Request url、Body Data数据...
Request url:http://.../ecshop/flow.php?step=add_to_cart
POST Data:goods={"quick":1,"spec":[],"goods_id":72,"number":"1","parent":0}
配置项 | 取值设置 | |
---|---|---|
1 | Name | 自定义的名称,如:添加商品到购物车 |
2 | Server Name or IP | 服务器域名或IP |
3 | Port Number | 设置服务器提供服务的端口号,ECShop使用的Apache+PHP模式,常规情况端口号为80 |
4 | Implementation | 客户端执行语言。与其他请求一样,选择Java即可 |
5 | Protocol | HTTP协议 |
6 | Method | Fiddler抓包分析,为POST请求 |
7 | Path | 发送请求的路径,Fiddler抓包获取添加购物车请求的路径:.../ecshop/flow.php?step=add_to_cart |
8 | Body Data | 利用Fiddler抓包,Body Data:goods={"quick":1,"spec":[],"goods_id":72,"number":"1","parent":0} 设置“goods_id”为随机参数 |
PS:BadBoy录制过程中,①若使用的帐号是已经购买过商品的帐号,且收货信息已经存在于数据库中,则录制不到新添加收货地址的操作,此时亦可利用Fidller抓包获取相应请求数据,手动添加到JMeter中;②当然也可以用全新未购买过商品的账号进行录制,就不需要单独去抓取添加收获地址的操作请求
4.利用Regex Tester正则表达式测试器,检验获取随机商品id的正则表达式效果
Regex Tester工具下载传送门:https://www.jb51.net/tools/regex_tester/
利用Regex Tester正则表达式测试器对所设置的正则表达式进行测试验证效果,源文本是从商品首页对应的HTML源代码获取,运行匹配规则之后,从运行结果可以看出已经匹配获取到商品的id编号(72,70,69,68,...)
5.配置JMeter中的正则表达式提取器,设置goods_id为随机变量
2个地方对商品id参数化:根据goods_id进入商品详细页;添加对应goods_id的商品到购物车
对登录成功后的商品首页,右键添加正则表达式提取器,以获取商品的随机id编号,用于后续步骤中
JMeter中正则表达式提取器的用法:
配置项 | 取值设置 | |
---|---|---|
1 | Name | 便于识别组件,可将名称改为直观的文字。如:“获取商品id编号” |
2 | Name of created variable | 表示JMeter其他组件调用该变量时的名称。此处设置为"goods_id",表示商品id |
3 | Regular Expression | 设置为goods.php\?id=(.*)\"> |
4 | Template | 表示取哪个匹配值,本处只有一个,故设置为“$1$” |
5 | Match No. | 表示获取数据的方式,0代表随机获取 |
6 | Default Value | 当没有获取到匹配的数据时,可取此处的缺省值(id=72,即首页默认的第一个商品) |
将获取到的随机商品id,替换到后续请求中进行引用
6.添加定时器
脚本录制过程中,用户输入用户名及密码,需5s左右;用户登录成功后,系统默认有3s左右的用户选择操作时间;用户选择某件商品,然后添加到购物车,这个过程可增加计时器5s;编写收货信息5s;填写快递信息及付款方式5s;用户退出系统时,也存在同样的选择时间,大约3s。
>> 用户登录前等待信息输入:5s 计时器
>> 登录成功等待返回首页:3s 计时器
>> 选择商品、添加到购物车:5s 计时器
>> 填写收货信息:5s 计时器
>> 填写物流信息、支付方式选择:5s 计时器
>> 用户退出等待返回首页:3s 计时器
7.设置响应断言,判断是否购买成功
Add-->Assertions-->Response Assertion
Add-->Listener-->Assertion Results
PS: 订单是否成功,也可在ECShop后台直接查询
同时通过Fiddler抓包分析,发现"填写收货信息进行提交"请求存在POST请求的302定向,此时为了确保前后页面登录信息的关联性,需要勾选"Follow Redirects", 或者两种定向方式都不勾选则默认"Follow Redirects"
8.添加查看结果树、聚合报告,统计脚本运行的数据
添加View Results Tree、Summary Report,便于统计测试脚本执行过程中的数据表现
9.执行检验脚本运行效果
配置项 | 配置数值 |
---|---|
Thread Group | Number of Thread: 1 |
Step 1 | Loop Count: 1 |
按照1个线程循环1次进行检验效果,已执行成功提交订单,如下:
在本地数据库中,也可查询到刚才在JMeter中执行脚本获取到用户的收获地址信息、订单信息的记录,如下:
以上,本次ECShop站点随机浏览购买商品业务的脚本开发完成