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

时间:2023-03-09 18:56:17
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文件运行所有所测的接口:统一管理所有接口,方便接口的运行与后期的调试,若不运行某个接口则直接进行注释即可。

文件的结构介绍如下:

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

详细的每个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": ""
"os": "ios"
"sign": ""
"is-test": ""

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": "",
"password": "33a7d3da476a32ac237b3f603a1be62fad00299e0d4b5a8db8d913104edec629"
}
headers = {
"version": "2.3.0",
"version-id": "",
"device-id": "8BAFD18C-61E3-4BAF-8AB1-0BC16E567633",
"time": "",
"channel-id": "",
"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 = "" 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": "",
"todo_remind_type": "",
"cate_uuid": "86799e50d9890ade579c4ac88059a5ff",
"all_day": "",
"todo_start": "2019-05-13",
"todo_end": "",
"type": "",
"repeat_tyep": "",
"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()