• Python+request 分模块存放接口,多接口共用参数URL、headers的抽离,添加日志打印等《三》


    主要介绍内容如下:

      1、分模块存放接口

      2、多接口共用参数URL、headers的抽离为配置文件

      3、添加日志打印

      4、一个py文件运行所有所测的接口

    如上介绍内容的作用:

      1、分模块存放接口:方便多人协作,对模块接口的分开存放,方便后期新增模块接口的录入,也方便接口出现报错后,定位模块

      2、多接口共用参数URL、headers的抽离为配置文件:

        (1)URL:单独进行配置文件中的修改,主要是方便后期接口域名出现变化,方便更改,示例,本次URL前缀为:https://127.0.0.1,下次开发更改为:https://127.0.0.2,如果不对此URL的前缀做单独的处理,则出现此情况需要单独对所有的接口进行URL前缀的修改,若实现了全局配置,则出现此类问题,更改一处则所以的接口均会共用此url的前缀。

        (2)headers:将headers抽离的作用也是与URL相同,此处需要单独抽出共用的headers中的参数即可。

      3、添加日志打印:只要是为了方便查看自己对测试结果的打印和新增的提示语的查看

      4、一个py文件运行所有所测的接口:统一管理所有接口,方便接口的运行与后期的调试,若不运行某个接口则直接进行注释即可。

    文件的结构介绍如下:

      

    详细的每个py文件中的代码写法:

    1、logs.py中的写法,主要是log的打印

    # coding=UTF-8
    '''
    date:2017/6/12
    @author: SYW
    用途:控制台log的打印形式修改,并且在module中调用
    '''
    import logging
    import os
    
    Log_FileName = os.getcwd()[:-4] +'Run_logs'      #获取到当前文件的目录,并检查是否有logs文件夹,如果不存在则自动新建logs文件
    if not os.path.exists(Log_FileName):
        os.makedirs(Log_FileName)
    
    
    # logging.basicConfig(level=logging.NOTSET,     #旧的log打印形式
    #                 format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
    #                 datefmt='%Y-%m-%d %X',
    #                 filename=Log_FileName,
    #                 filemode='w')
    
    '''以下修改log的打印方式-----SYW'''
    logging.basicConfig(level=logging.NOTSET,
                    format='[%(asctime)s] [line:%(lineno)d] [%(levelname)s] %(message)s',
                    datefmt='%Y-%m-%d %X',
                    #filename=Log_FileName+ r"log.txt",
                    filename=Log_FileName+ r"/log.txt",
                    filemode='w')
    
    console = logging.StreamHandler()
    #console.setLevel(logging.INFO)   #显示等级为INFO,则自动过滤掉了系统debug提示
    console.setLevel(logging.DEBUG)
    formatter = logging.Formatter('[%(asctime)s] [line:%(lineno)d] [%(levelname)s]: %(message)s')
    console.setFormatter(formatter)
    logging.getLogger('').addHandler(console)
    
    #logging.info("jaskdfjkajfkdl")   #运行写法示例

    2、host_header.yaml 此配置文件中的编写

    #请求接口的url的域名
    host: https://dev1app.goodiber.com/v2/
    
    #请求接口的请求头中的共用参数
    headers:
      "version": "2.3.0"
      "version-id": "235"
      "os": "ios"
      "sign": "123456"
      "is-test": "1"

    3、login.py,主要是登录接口,会返回token和uuid,供后期接口使用。

    #!/usr/bin/env python
    # coding=UTF-8
    import requests
    from Common import gol
    from Common.logs import logging
    import yaml,sys,os
    
    # 导入yaml中的host
    reload(sys)
    sys.setdefaultencoding("utf-8")
    
    root_path = os.getcwd()
    with open(root_path + "/Configuration/host_header.yaml", 'rb') as f:
        data = yaml.load(f)
    host = data["host"]
    
    class login:
    
        gol._init()
    
        def __init__(self):
            self.log = logging
    
        def test_login(self):
            url = host+"user/login"   #接口
    
            data = {
                "mobile": "12606666333",
                "password": "33a7d3da476a32ac237b3f603a1be62fad00299e0d4b5a8db8d913104edec629"
            }
            headers = {
                "version": "2.3.0",
                "version-id": "235",
                "device-id": "8BAFD18C-61E3-4BAF-8AB1-0BC16E567633",
                "time": "1557728866628",
                "channel-id": "001",
                "os": "ios",
                "Accept-Language": "zh-tw",
                "device-name": "iPhoneX",
                "User-Agent": "iBer/235 CFNetwork/976 Darwin/18.2.0",
                #注:一定不能加content-type,否则报签名错误
                # Content-Type: multipart/form-data; boundary=vHsPJ5s6grMzpmWoZxd3T3o6.LcUWBvUUu0gDNubaf05Ve7kv6bAkH3s_rr0AEc2D6AbEh
                "sign": "a81b4379f504f330e83792ce2015e629"
            }
    
            r = requests.post(url=url, data=data, headers=headers, verify=False)
            uuid = str(r.json()["data"]["uuid"])
            gol.set_value("uuid", uuid)
            token = str(r.json()["data"]["token"])
            gol.set_value("token", token)
            version = "2.2.1"
            version_id = "232"
    
            self.log.info("登录成功,如下是reponse返回的内容")
            self.log.info(r.text)

    4、create_todo.py文件,承接登录后的操作,说明,因为其他的接口headers中使用到的token和uuid均来自login,因此不能讲token和uuid加入到headers的配置文件中,具体的用法详见如下:

    #!/usr/bin/env python
    # coding=UTF-8
    import requests
    from Common import gol
    import yaml,sys,os
    from Common.logs import logging
    
    # 导入yaml中的host
    reload(sys)
    sys.setdefaultencoding("utf-8")
    
    with open(os.getcwd() + "/Configuration/host_header.yaml", 'rb') as f:
        data = yaml.load(f)
    host = data["host"]   #获取到url
    header = data["headers"]  #获取到host
    
    class todo:
    
        def __init__(self):
            self.log = logging
    
        def test_create_todo(self):
            url = host+"todo/create"
            data = {
                "name": "1239",
                "todo_remind_type": "0",
                "cate_uuid": "86799e50d9890ade579c4ac88059a5ff",
                "all_day": "1",
                "todo_start": "2019-05-13",
                "todo_end": "",
                "type": "0",
                "repeat_tyep": "0",
                "c_user_uuid": ""
            }
            headers = header
            headers.update(uuid=gol.get_value("uuid"),token=gol.get_value("token"))
            r = requests.post(url=url, data=data, headers=headers, verify=False)
            self.log.info("创建待办成功,如下是reponse返回的内容")
            self.log.info(r.json())

    5、run_test.py,所有接口的集合。每次运行即可,点击此文件即可,不需要运行哪个接口则直接注释掉。

    #!/usr/bin/env python
    # coding=UTF-8
    
    import unittest
    from Module.login.login import login
    from Module.Todo.Create_todo import todo
    from Module.Todo.Todo_report import share_report
    
    
    class run(unittest.TestCase):
        def test_01_login(self):
            a = login()
            a.test_login()
    
        def test_02_Create_todo(self):
            self.todo = todo()
            self.todo.test_create_todo()
    
        def test_03_Todo_report(self):
            self.todoreport = share_report()
            self.todoreport.get_share_code()
    
    if __name__ == "__main__":
       unittest.main()
  • 相关阅读:
    十五周作业
    第十四周总结
    十三周总结与感想
    排球比赛积分规则
    Centos + nginx + JBOSS AS 7 搭建Java web application
    eclipse + maven + jboss 遇到ClassNotFoundException
    “/”应用程序中的服务器错误。 纠错方法
    Sharepoint 问题集锦
    Sharepoint 问题集锦
    Sharepoint 问题集锦
  • 原文地址:https://www.cnblogs.com/syw20170419/p/10908333.html
Copyright © 2020-2023  润新知