目录:导读
- 前言
- 一、Python编程入门到精通
- 二、接口自动化项目实战
- 三、Web自动化项目实战
- 四、App自动化项目实战
- 五、一线大厂简历
- 六、测试开发DevOps体系
- 七、常用自动化测试工具
- 八、JMeter性能测试
- 九、总结(尾部小惊喜)
前言
什么是参数关联?
参数关联,也叫接口关联,即接口之间存在参数的联系或依赖。在完成某一功能业务时,有时需要按顺序请求多个接口,此时在某些接口之间可能会存在关联关系。
比如:B接口的某个或某些请求参数是通过调用A接口获取的,即需要先请求A接口,从A接口的返回数据中拿到需要的字段值,在请求B接口时作为请求参数传入。
参数关联有哪些场景?
最常见场景:请求登录接口后获取到token值,后续其他接口请求时需要将token作为请求参数传入。
再比如下单–>支付场景,调用下单接口生成订单后会返回订单号,订单号传给支付接口进行支付。
1、参数关联场景
以最常见的网上购物为例,对应的场景及请求我们可以大致简化如下(可联想某宝购物流程):
用户在购物车选择商品点击【去结算】进入订单确认页,订单确认页点击【提交订单】这时会先请求下单接口创建订单
紧接着会拿创建的订单去请求获取支付凭证接口,这个接口会调起支付页面,也就是输入密码的支付界面
输入支付密码后会请求支付服务的支付接口进行实际支付,支付的结果会返回给请求方,告知是否支付成功
这个流程中涉及到的接口其实都是有关联的,我们要对整个流程进行测试那么就需要按顺序调用所有这些涉及到的接口。
但这里我们只需要弄明白参数关联,那么以下单接口和获取支付凭证接口为例,举例说明就够了,即先请求下单接口生成订单号,再拿这个订单号去请求获取支付凭证接口,才能调起支付界面并进行支付。
下单接口如下:
接口地址:<服务器>/trade/order/purchase
请求类型:post
请求参数:
{
"goodsId": 10, //商品id
"goodsSkuId": 33, //sku id
"num": 2, //购买数量
"tradePromotion": { //选择的优惠项
"type": 1, //类型<1:优惠券>
"promotionId": 1 //优惠id
}
}
返回值 data:
{
"code": 0,
"msg": "成功",
"data": {
"tradeNo": "0020220116204344962706666" //交易订单号
},
"t": 1639658625474
}
获取支付凭证接口如下:
接口地址:<服务器>/pay/pre/consum
请求类型:post
请求参数:
{
"orderNo":"0020220116204344962706666", //交易订单号
"product":"alipayWapClient" //支付渠道<alipayWapClient:支付宝手机网页支付>
}
返回值 data:
{
"code": 0,
"msg": "成功",
"data": {
"payNo":"123213213219379213",
"certificate": "<form name=\"punchout_form\xxxxxxx >\n</form>\n<script>document.forms[0].submit();</script>"
},
"t": 1639659171031
}
其中orderNo字段使这两个接口关联了起来。因为每次生成的订单号都不一样,所以在测试这个场景的时候,就需要使这两个接口的参数进行关联,才能走通。
2、脚本编写
那么在pytest框架的自动化测试中,参数关联可以怎样处理呢?这里提供两种思路,如下:
根据业务场景的调用时序,在用例中按顺序调用接口
将依赖的接口编写成fixture函数,并使用yield返回下个接口需要的参数
1)在用例中按顺序调用
代码示例如下:
import requests
import json
import pytest
def test_order_pay():
'''
创建订单->获取支付凭证,调起支付界面
:return:
'''
# 先调用下单接口生成订单
url_order = "https://gouwu.com/trade/order/purchase"
data_order = {
"goodsId": 10,
"goodsSkuId": 33,
"num": 2,
"tradePromotion": {
"type": 1,
"promotionId": 1
},
"tradeDirectionArticle": {
"articleId": 1
}
}
res_order = requests.post(url=url_order, json=data_order).text
tradeNo = json.loads(res_order)["tradeNo"]
# 再请求获取支付凭证接口
url_pay = "https://gouwu.com/pay/pre/consum"
data_pay = {
"orderNo": tradeNo, # tradeNo通过下单接口获取
"product": "alipayWapClient"
}
res_pay = requests.post(url=url_pay, json=data_pay).text
res_pay = json.loads(res_pay)
# 断言
assert res_pay["code"]==0
assert res_pay["data"]["payNo"]
assert res_pay["data"]["certificate"]
if __name__ == '__main__':
pytest.main()
上面的代码只是流水式的进行调用,我们还可以先将每个接口请求封装成单独的函数,在测试用例中只需按照顺序调用这些函数即可,这个我们会在后续的文章中进行说明。
2)使用Fixture函数
pytest中Fixture函数可以参考我之前的文章pytest-Fixture(固件)
定义Fixture函数,代码示例如下:
@pytest.fixture()
def get_order():
'''
请求下单接口,创建订单
:return:
'''
url_order = "https://gouwu.com/trade/order/purchase"
data_order = {
"goodsId": 10,
"goodsSkuId": 33,
"num": 2,
"tradePromotion": {
"type": 1,
"promotionId": 1
},
"tradeDirectionArticle": {
"articleId": 1
}
}
res_order = requests.post(url=url_order, json=data_order).text
tradeNo = json.loads(res_order)["tradeNo"]
yield tradeNo
在测试函数中调用上面定义的fixture函数,代码示例如下:
def test_pay(get_order):
'''
下单->支付场景校验
:param get_order: 调用上面的Fixture函数,函数名get_order即返回的tradeNo
:return:
'''
url_pay = "https://gouwu.com/pay/pre/consum"
data_pay = {
"orderNo": get_order, # get_order即为上面定义的fixture函数返回值
"product": "alipayWapClient"
}
res_pay = requests.post(url=url_pay, json=data_pay).text
res_pay = json.loads(res_pay)
# 断言
assert res_pay["code"] == 0
assert res_pay["data"]["payNo"]
assert res_pay["data"]["certificate"]
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 |
一、Python编程入门到精通
二、接口自动化项目实战
三、Web自动化项目实战
四、App自动化项目实战
五、一线大厂简历
六、测试开发DevOps体系
七、常用自动化测试工具
八、JMeter性能测试
九、总结(尾部小惊喜)
岁月如梭,机会稍纵即逝。抓住每一个宝贵的时刻,用汗水浇灌梦想的花朵。奋斗不止,追求卓越,唯有努力,才能开启辉煌的人生征程!相信自己,勇往直前!
虽然生活充满了挑战和不确定性,但坚定的信念和不懈的努力将会赢得成功。相信自己,勇敢前行,去追求那属于你的无限可能!
奋斗是生命的旋律,坚持是成功的密码。不论遇到多少困难,保持梦想的火焰燃烧,勇往直前,你将开创属于自己的辉煌篇章!相信自己,无所不能!