主要介绍内容如下:
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()