初识jmeter是在半年前,这半年也做了不少东西是时候来个总结了。
为什么要做接口自动化?
1.版本迭代后,如何保证老的接口依然正常使用,通过对接口进行可用性测试,可快速对其进行验证,但这也只是确认接口可用。
2.如何保证老接口可用,并且接口的业务功能正确?当然最简单的办法便是对所有可自动化的接口,进行自动化用例的编写。
3.如何避免手工接口测试时的遗漏,以及接口文档前后不一致的情况(实际工作中遇到不少)。通过接口的自动化测试提前设定好,不仅可以保证接口测试的稳定性,还可以节省不少时间,提升测试效率。有闲的时间喝喝茶不好吗?哈哈
那何为自动化?又如何去做呢?自动化用例设计又该遵循什么原则?
我的原则是首先评估可做自动化的接口,然后按模块进行划分。最重要的原则是:你编写的用例,在每次自动化执行时,用例的稳定性。这点是说每次自动化执行脚本后,不会对下一次执行脚本产生影响。
现在开始啦!
业务背景说明:这是一款直播软件,其中有一个功能模块名叫部落,部落中有一个神秘商店,只有加入部落的人才能够看到此商店,我们要测试的接口就是神秘商店列表。
此接口的接口文档:
请求url:
/tribe/queryShopList
请求方式:
POST
参数:
tribeId 必传,long,部落id
返回示例:
{
"code": 1000,
"msg": "成功",
"data": {
"refreshNum": 8,
"amountId": 1,
"refreshAmount": "50",
"shopList": [
{
"id": 446,
"goodsId": 60,
"goodsName": "魔法扫帚",
"goodsNum": 1,
"goodsType": 2,
"goodsPrice": 5000,
"goodsURL": "https://cdn-live.maopp.cn/live/gift/33.png",
"backgroundColor": "#F9FAFC",
"goodsStatus": 0,
"unlockType": 0,
"unlockValue": 1,
"unlockDesc": "",
"various": 1
},
{
"id": 447,
"goodsId": 116,
"goodsName": "白龙碎片",
"goodsNum": 1,
"goodsType": 2,
"goodsPrice": 800,
"goodsURL": "https://cdn-live.maopp.cn/live/tribe/shop/[email protected]",
"backgroundColor": "#F9FAFC",
"goodsStatus": 0,
"unlockType": 0,
"unlockValue": 2,
"unlockDesc": "",
"various": 1
},
{
"id": 448,
"goodsId": 6,
"goodsName": "别克碎片",
"goodsNum": 3,
"goodsType": 2,
"goodsPrice": 90,
"goodsURL": "https://cdn-live.maopp.cn/live/tribe/shop/[email protected]",
"backgroundColor": "#F9FAFC",
"goodsStatus": 0,
"unlockType": 0,
"unlockValue": 3,
"unlockDesc": "",
"various": 3
},
{
"id": 449,
"goodsId": 125,
"goodsName": "幻夜灵骑碎片",
"goodsNum": 1,
"goodsType": 2,
"goodsPrice": 800,
"goodsURL": "https://cdn-live.maopp.cn/live/tribe/shop/[email protected]",
"backgroundColor": "#E4EFFF",
"goodsStatus": -1,
"unlockType": 0,
"unlockValue": 4,
"unlockDesc": "Lv1部落可解锁",
"various": 1
},
{
"id": 450,
"goodsId": 63,
"goodsName": "复活天使",
"goodsNum": 1,
"goodsType": 2,
"goodsPrice": 5000,
"goodsURL": "https://cdn-live.maopp.cn/live/gift/497.png",
"backgroundColor": "#F9FAFC",
"goodsStatus": -1,
"unlockType": 0,
"unlockValue": 5,
"unlockDesc": "Lv2部落可解锁",
"various": 1
},
{
"id": 451,
"goodsId": 3,
"goodsName": "奔驰",
"goodsNum": 7,
"goodsType": 2,
"goodsPrice": 5000,
"goodsURL": "https://cdn-live.maopp.cn/live/car/benz.png",
"backgroundColor": "#F9FAFC",
"goodsStatus": -1,
"unlockType": 0,
"unlockValue": 6,
"unlockDesc": "Lv3部落可解锁",
"various": 7
}
]
}
}
错误码说明:
71000:部落不存在
71002:用户不在该部落
71038:商店初始化失败
如何对此接口进行自动化呢?
1.巧用逻辑控制器中的简单控制器作为文件夹,命名规则自主定义
2.根据接口功能列出需要测试的用例
3.对列出的测试用例添加前置条件,断言结果,后置扫尾完成自动化
如第一条case,对未加入部落的用户,访问神秘商店列表进行验证,在这里我们传入的tribeId是已存在的部落Id,用户userid则是未加入任何部落的用户。
那这个tribeId怎么获得呢?
当然我们可以直接从mysql里的表里找一个tribeId填进去,但是这样一个固定的值很容易受到影响,一旦该tribeId发生改变,那么结果将有可能与预期不一致,这样的用例是不稳定的。
要想让这个tribeId变得稳定起来,我们最稳妥的方法有两种:一种是新建一个部落,另外一个便是从数据中查询一个现有存在的部落id。
如果采用第一种新建部落的方法,那么我们的后置必然还需将此部落解散,涉及到后置,我们先采用最简单的从数据库查询的方法。
1)首先在配置元件添加一个数据库连接配置,网上教程非常多,这里不详细说明。值得注意的是需要下载一个mysql的驱动包放在jmeter的lib目录下。
2)添加一个jdbc的请求,输入sql语句,查询有效的部落id,将它赋值给tid
3)通过tid获得部落id
这时可以通过添加debug sampler 来查看下tid 的数据 tid_#代表一共查询出多少条数据。tid_1,tide_2等等就是取出来的部落id
4)将取得的部落id,作为部落列表的传参
5)加一个断言
到此为止,就是部落列表的一个完整用例。