• Python+pytest接口自动化之参数关联


    一、什么是参数关联?

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

    二、有哪些场景?

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

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

    三、参数关联场景

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

    1. 用户在购物车选择商品点击【去结算】进入订单确认页,订单确认页点击【提交订单】这时会先请求下单接口创建订单
    2. 紧接着会拿创建的订单去请求获取支付凭证接口,这个接口会调起支付页面,也就是输入密码的支付界面
    3. 输入支付密码后会请求支付服务的支付接口进行实际支付,支付的结果会返回给请求方,告知是否支付成功

    这个流程中涉及到的接口其实都是有关联的,我们要对整个流程进行测试那么就需要按顺序调用所有这些涉及到的接口。

    但这里我们只需要弄明白参数关联,那么以下单接口和获取支付凭证接口为例,举例说明就够了,即先请求下单接口生成订单号,再拿这个订单号去请求获取支付凭证接口,才能调起支付界面并进行支付。

    下单接口如下:

    • 接口地址:<服务器>/trade/order/purchase
    • 请求类型:post
    • 请求参数:
    1. {
    2. "goodsId": 10, //商品id
    3. "goodsSkuId": 33, //sku id
    4. "num": 2, //购买数量
    5. "tradePromotion": { //选择的优惠项
    6. "type": 1, //类型<1:优惠券>
    7. "promotionId": 1 //优惠id
    8. }
    9. }
    • 返回值data:
    1. {
    2. "code": 0,
    3. "msg": "成功",
    4. "data": {
    5. "tradeNo": "0020220116204344962706666" //交易订单号
    6. },
    7. "t": 1639658625474
    8. }

    获取支付凭证接口如下:

    • 接口地址:<服务器>/pay/pre/consum
    • 请求类型:post
    • 请求参数:
    1. {
    2. "orderNo":"0020220116204344962706666", //交易订单号
    3. "product":"alipayWapClient" //支付渠道<alipayWapClient:支付宝手机网页支付>
    4. }
    • 返回值 data:
    1. {
    2. "code": 0,
    3. "msg": "成功",
    4. "data": {
    5. "payNo":"123213213219379213",
    6. "certificate": "
      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\">\nhidden\" 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;}\">\nsubmit\" value=\"立即支付\" style=\"display:none\" >\n\n"
    7. },
    8. "t": 1639659171031
    9. }

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

    四、脚本编写

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

    • 根据业务场景的调用时序,在用例中按顺序调用接口
    • 将依赖的接口编写成fixture函数,并使用yield返回下个接口需要的参数

    1、在用例中按顺序调用

    代码示例如下:

    1. import requests
    2. import json
    3. import pytest
    4. def test_order_pay():
    5. '''
    6. 创建订单->获取支付凭证,调起支付界面
    7. :return:
    8. '''
    9. # 先调用下单接口生成订单
    10. url_order = "https://gouwu.com/trade/order/purchase"
    11. data_order = {
    12. "goodsId": 10,
    13. "goodsSkuId": 33,
    14. "num": 2,
    15. "tradePromotion": {
    16. "type": 1,
    17. "promotionId": 1
    18. },
    19. "tradeDirectionArticle": {
    20. "articleId": 1
    21. }
    22. }
    23. res_order = requests.post(url=url_order, json=data_order).text
    24. tradeNo = json.loads(res_order)["tradeNo"]
    25. # 再请求获取支付凭证接口
    26. url_pay = "https://gouwu.com/pay/pre/consum"
    27. data_pay = {
    28. "orderNo": tradeNo, # tradeNo通过下单接口获取
    29. "product": "alipayWapClient"
    30. }
    31. res_pay = requests.post(url=url_pay, json=data_pay).text
    32. res_pay = json.loads(res_pay)
    33. # 断言
    34. assert res_pay["code"]==0
    35. assert res_pay["data"]["payNo"]
    36. assert res_pay["data"]["certificate"]
    37. if __name__ == '__main__':
    38. pytest.main()

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

    2、 使用Fixture函数

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

    1. @pytest.fixture()
    2. def get_order():
    3. '''
    4. 请求下单接口,创建订单
    5. :return:
    6. '''
    7. url_order = "https://gouwu.com/trade/order/purchase"
    8. data_order = {
    9. "goodsId": 10,
    10. "goodsSkuId": 33,
    11. "num": 2,
    12. "tradePromotion": {
    13. "type": 1,
    14. "promotionId": 1
    15. },
    16. "tradeDirectionArticle": {
    17. "articleId": 1
    18. }
    19. }
    20. res_order = requests.post(url=url_order, json=data_order).text
    21. tradeNo = json.loads(res_order)["tradeNo"]
    22. yield tradeNo

    在测试函数中调用上面定义的fixture函数,代码示例如下:

    1. def test_pay(get_order):
    2. '''
    3. 下单->支付场景校验
    4. :param get_order: 调用上面的Fixture函数,函数名get_order即返回的tradeNo
    5. :return:
    6. '''
    7. url_pay = "https://gouwu.com/pay/pre/consum"
    8. data_pay = {
    9. "orderNo": get_order, # get_order即为上面定义的fixture函数返回值
    10. "product": "alipayWapClient"
    11. }
    12. res_pay = requests.post(url=url_pay, json=data_pay).text
    13. res_pay = json.loads(res_pay)
    14. # 断言
    15. assert res_pay["code"] == 0
    16. assert res_pay["data"]["payNo"]
    17. assert res_pay["data"]["certificate"]

    五、 总结

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

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

    最后:下面是配套学习资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!【100%无套路免费领取】

    软件测试面试小程序

    被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

    涵盖以下这些面试题板块:

    1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux

    6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础

      全套资料获取方式:点击下方小卡片自行领取即可

  • 相关阅读:
    图像Star特征提取
    DevOps|服务治理与服务保障实践指南
    【nacos】Java调用nacos SDK获取配置信息为null
    小侃设计模式(九)-组合模式
    js JSON.stringify 对象转字符串
    添加过的PDF注释可以修改吗?怎么修改PDF注释?
    如何创建书画家百度百科词条?书画家百度百科怎么做?
    C++:运算符重载简介
    echart简单组件封装
    窗口函数大揭秘!轻松计算数据累计占比,玩转数据分析的绝佳利器
  • 原文地址:https://blog.csdn.net/weixin_47648853/article/details/133170814