python+pytest接口自动化(12)-参数关联

Posted 一个处女座的测试

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python+pytest接口自动化(12)-参数关联相关的知识,希望对你有一定的参考价值。

什么是参数关联?

参数关联,也叫接口关联,即接口之间存在参数的联系或依赖。在完成某一功能业务时,有时需要按顺序请求多个接口,此时在某些接口之间可能会存在关联关系。比如:B接口的某个或某些请求参数是通过调用A接口获取的,即需要先请求A接口,从A接口的返回数据中拿到需要的字段值,在请求B接口时作为请求参数传入。

有哪些场景?

最常见的场景之一便是:请求登录接口后获取到token值,后续其他接口请求时需要将token作为请求参数传入。

再比如下单-->支付场景,调用下单接口生成订单后会返回订单号,订单号传给支付接口进行支付。

一. 参数关联场景


以最常见的网上购物为例,对应的场景及请求我们可以大致简化如下(可联想某宝购物流程):

  1. 用户在购物车选择商品点击【去结算】进入订单确认页,订单确认页点击【提交订单】这时会先请求下单接口创建订单

  1. 紧接着会拿创建的订单去请求获取支付凭证接口,这个接口会调起支付页面,也就是输入密码的支付界面

  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\\" method=\\"post\\" action=\\"https://openapi.alipay.com/gateway.do?charset=UTF-8&method=alipay.trade.wap.pay&sign=aTKlfEnYgR7x9xs1Eyjipo0S%2BFtQ6AKu9d%2Brb7iieMThz2Dq7zp4h8QH4lelTKovOloT%2FPiNXR5miwKgOWW3K6pl0TFO5XX5NSZNBmU%2BPd5ogeo0YT0vCqWUM60rqbYLNtZmvyx%2BAR4Z2SOnqs0CYqVIbZAhpn1Bd5HsdcCCYVgsgOdbEE60Cfu3LG3Z%2FQ0GQIdW24uTyr%2BojRc25ipOC9NIYwtba8UjRw18Z3e7sj75qoIg%2FipICH7FCJBJEdlgBGlNxIjKzhYj4OBg93D&return_url=https%3A%2F%2Fblog.csdn.net%2Fa032788aotify_url=http%3A%2F%2F82.157.145.132%3A8089%2Ftest%2Fnotify%2Fgateway&version=1.0&app_id=2021001105644746&sign_type=RSA2&timestamp=2021-150&alipay_sdk=alipay-sdk-java-4.9.5.ALL&format=json\\">\\n<input type=\\"hidden\\" name=\\"biz_content\\" value=\\"&quot;time_expire&quot;:&quot;2022-12-31 22:00:00&quot;,&quot;out_trade_no&quot;:&quot;123213213219379213&quot;,&quot;total_amount&quot;:0.01,&quot;subject&quot;:&quot;测试商品&quot;,&quot;product_code&quot;:&quot;QUICK_WAP_WAY&quot;\\">\\n<input type=\\"submit\\" value=\\"立即支付\\" style=\\"display:none\\" >\\n</form>\\n<script>document.forms[0].submit();</script>","t":1639659171031

其中orderNo字段使这两个接口关联了起来。因为每次生成的订单号都不一样,所以在测试这个场景的时候,就需要使这两个接口的参数进行关联,才能走通。

二. 脚本编写


那么在pytest框架的自动化测试中,参数关联可以怎样处理呢?这里提供两种思路,如下:

  • 根据业务场景的调用时序,在用例中按顺序调用接口

  • 将依赖的接口编写成fixture函数,并使用yield返回下个接口需要的参数

1. 在用例中按顺序调用

代码示例如下:

import requests
import json
import pytest

deftest_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"]==0assert res_pay["data"]["payNo"]
    assert res_pay["data"]["certificate"]
    
    
if __name__ == '__main__':
    pytest.main()

上面的代码只是流水式的进行调用,我们还可以先将每个接口请求封装成单独的函数,在测试用例中只需按照顺序调用这些函数即可,这个我们会在后续的文章中进行说明。

2. 使用Fixture函数

pytest中Fixture函数可以参考我之前的文章pytest-Fixture(固件)

定义Fixture函数,代码示例如下:

@pytest.fixture()defget_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函数,代码示例如下:

deftest_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"] == 0assert res_pay["data"]["payNo"]
    assert res_pay["data"]["certificate"]

三. 总结


参数关联在接口自动化测试中是必然会遇到的场景,设计关联参数的用例会直接影响到用例的维护,当然这也是在接口自动化项目的架构设计时就需要考虑的问题。

对于刚入门的同学而言,我们需要明白的是,什么是参数关联,以及可以怎样去处理它。

实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。

如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。

我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,

测试开发视频教程、学习笔记领取传送门!!!

以上是关于python+pytest接口自动化(12)-参数关联的主要内容,如果未能解决你的问题,请参考以下文章

python+pytest接口自动化-请求参数格式的确定

python+pytest接口自动化-请求参数格式的确定

python接口自动化12-pytest前后置与fixture

python接口自动化11-pytest入门

python+requests+pytest接口自动化

python(pytest)+allure+jenkins 实现接口自动化的思路