zoukankan      html  css  js  c++  java
  • Python接口自动化之接口依赖

    以下主要介绍如何提取token、将token作为类属性全局调用及充值接口如何携带token进行请求。

    场景说明

     

    在面试接口自动化时,经常会问,其他接口调用的前提条件是当前用户必须是登录状态,如何处理接口依赖?

     

    在此之前我们介绍过session管理器保存会话状态。如果接口请求需要携带token,那么又如果处理呢?以下详细介绍。

     

    未登录状态下,直接请求充值接口的异常场景:

    import unittest
    import requests
    class TestRecharge(unittest.TestCase):
        def setUp(self):
            pass
        def tearDown(self):
            pass
        def test_recharge(self):
            url = 'http://127.0.0.1:8888/recharge'
            payload = {
                "member_id": 100004312,
                "amount": 80
            }
            res = requests.post(url,json=payload)
            print(res.json())
    if __name__ == '__main__':
        unittest.main()
    

      

    运行结果如下:

    {'code': 1003, 'msg': '未授权或token已过期'}
    

      

    token处理思路

    在处理之前,token灵魂三连问:

    • 如何获取token?

    • 获取的token如何管理?

    • 其他接口如何携带token?

     

    思路如下:

    1.抽取登录接口返回值中的token;

    2.使用全局变量存储token。token可以存到yaml或者json或者ini的配置文件里,以下介绍将token作为类属性;

    3.其他接口将token值放入请求头,发送请求;

     

    JsonPath基本用法

    我们需要从登录接口中提取出token,这里介绍JsonPath基本用法。

    JsonPath介绍

    JsonPath为Json文档提供了解析能力,通过使用JsonPath,你可以方便的查找节点、获取想要的数据,JsonPath是Json版的XPath。

    JsonPath语法

    JsonPath说明
    $ 文档根元素
    @ 当前元素
    .[] 匹配下级元素
    .. 递归匹配所有子元素
    * 通配符,匹配下级元素
    [] 下标运算符,根据索引获取元素,JsonPath索引从0开始
    [,] 连接操作符,将多个结果拼接成数组返回,可以使用索引或别名
    [start:end:step] 数据切片操作
    ?() 过滤表达式

     

    这么多语法规范,大家会觉得一脸懵逼吧,细心的小伙伴会发现语法中 .. 表示递归匹配所有子元素,简单粗暴,用..获取所有匹配的子元素,通过索引拿到想要的值,以下以实战进行演练。

     

    JsonPath源码

    def jsonpath(obj, expr, result_type='VALUE', debug=0, use_eval=True):
        """traverse JSON object using jsonpath expr, returning values or paths"""

    obj: 需要解析的对象,比如接口的返回值。expr: 匹配的表达式。


    JsonPath实战

    以下编写代码进行演示。

    from jsonpath import jsonpath
    
    # json格式结果
    res = {
        "code": 0,
        "msg": "OK",
        "data": {
            "token_info": {
                "token_type": "Bearer",
                "expires_in": "2020-05-28 13:07:29",
                "token": "eyJhbGciOiJIUzUxAiJ9.eyJtZW1iZZJfaWQiOjEwMDA1MTMxNSwiZXhwIjoxNTkwNjQyNDQ5fQ.s6A7pzLILf9tqpEDAU9wIPGGLGkgKEQ6EBHq26l-eUM5seCb48DWalkE7u16iRZv3uzD5hIDFbw41Jmi9V0T_Q"
            }
        }
    }
    # 获取res中的token
    token = jsonpath(res,'$..token')[0]
    print(token)
    

     

    响应结果为:

    eyJhbGciOiJIUzUxBiJ9.eyJtZW1iZZJfaWQiOpEwMDA1MTMxNSwiZXhwIjoxNTkwNjQyNDQ5fQ.s6A7pzLILf9tqpEDAU9wIPGGLGkgKEQ6EBHq26l-eUM5seCb48SWalkE8u16iRZv3uzD5hIDFbw41Jmi9V0T_Q
    
    

    token依赖实例

    ①在config/setting.py配置文件中,配置全局的域名或IP。

    class DevConfig():
        # 项目的域名或IP
        host='http://127.0.0.1:8888'
    config = DevConfig()
    

      

    ②在config/config.yaml文件中,存入登录账号。

    config.yaml

    user:
      mobile_phone: '155********'
      pwd: '12345678'
    

     

    ③在项目根目录下,新建文件夹middleware,文件夹下新建文件helper.py,用于处理token。

    图片

    ④首先编写登录接口,返回接口数据。

    helper.py

    from common.requests_handler import RequestsHandler
    from config.setting import config
    from common.yaml_handler import yaml_data
    def login():
        """登录,接口返回token"""
        req = RequestsHandler()
        res = req.visit('post', config.host+'/login', json=yaml_data['user'])
        return res
    print(login())
    

     

    运行结果如下:

    {
        'code': 0,
        'msg': 'OK',
        'data': {
            'token_info': {
                'token_type': 'Bearer',
                'expires_in': '2020-05-26 13:31:41',
                'token': 'eyJhbGciOiJIUpUxMiJ9.eyJtZW1iZXJfaWQiOjEwMDA1MTMxNSwiZXhwIjoxNTkwNDcxMTAxfQ.4QDNdQ-Wyecvpv7yRnMlCx1ZXpAlb8vpohxHht5OfNcjGn_yTaISyhmn7OMzjMGlz68sJ_uFbCh2NhIaO2p_Lg'
            }
        }
    }
    

      

    ⑤接下来编写函数,获取登录接口返回值并提取token和token_type进行拼接 。这里要使用jsonpath模块提取返回的token和token_type。

    helper.py

    def save_token():
        """保存token信息"""
        res = login()
        token = jsonpath(res,'$..token')[0]
        token_type = jsonpath(res,'$..token_type')[0]
        token = " ".join([token_type, token])
        return token
    print(save_token())
    

      

    运行结果如下:

    Bearer eyJhbGciOJIPzUxMiJ9.eyJtZW1iZXJfaWQiOjEwMDA1MTMxNSwiZXhwIjoxNTkwN
    
    

    ⑥最后定义类,将token作为类属性,整体代码如下:helper.py

    from common.requests_handler import RequestsHandler
    from config.setting import config
    from common.yaml_handler import yaml_data
    from jsonpath import jsonpath
    def login():
        """登录,返回token信息"""
        req = RequestsHandler()
        res = req.visit('post', config.host+'/login', json=yaml_data['user'])
        return res
    def save_token():
        """保存token信息"""
        res = login()
        token = jsonpath(res,'$..token')[0]
        token_type = jsonpath(res,'$..token_type')[0]
        token = " ".join([token_type, token])
        Context.token = token
        return token
    class Context:
        """将token作为类属性"""
        token = ''
    if __name__ == '__main__':
        print(save_token())
    

      

    运行结果如下:

    Bearer eyJhbGciOiJIUzUxMiJ9.eyJtZW1iZXJfaWQiOjEwMDA1MTMxNSwiZXhwIjoxNTkwNDcz
    
    

    ⑦充值接口携带token请求。

    import unittest
    import requests
    from middleware.helper import Context, save_token
    class TestRecharge(unittest.TestCase):
        def setUp(self):
            pass
        def tearDown(self):
            pass
        def test_recharge(self):
            save_token()
            token = Context.token
            url = 'http://127.0.0.1:88888/recharge'
            payload = {
                "member_id": 100051315,
                "amount": 80
            }
            res = requests.post(url,json=payload)
            print(res.json())
    if __name__ == '__main__':
        unittest.main()
    

     

    运行结果为:

    {
        'code': 0,
        'msg': 'OK',
        'data': {
            'leave_amount': 240.0,
            'mobile_phone': '155********',
        }
    }
    

      

    总结:本文主要介绍如何提取token、将token作为类属性全局调用及充值接口如何携带token进行请求。

  • 相关阅读:
    波段是金牢记六大诀窍
    zk kafka mariadb scala flink integration
    Oracle 体系结构详解
    图解 Database Buffer Cache 内部原理(二)
    SQL Server 字符集介绍及修改方法演示
    SQL Server 2012 备份与还原详解
    SQL Server 2012 查询数据库中所有表的名称和行数
    SQL Server 2012 查询数据库中表格主键信息
    SQL Server 2012 查询数据库中所有表的索引信息
    图解 Database Buffer Cache 内部原理(一)
  • 原文地址:https://www.cnblogs.com/chenyablog/p/15171216.html
Copyright © 2011-2022 走看看