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": ""
"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()
Python+request 分模块存放接口,多接口共用参数URL、headers的抽离,添加日志打印等《三》的更多相关文章
- Python学习--Selenium模块学习(2)
Selenium的基本操作 获取浏览器驱动寻找方式 1. 通过手动指定浏览器驱动路径2. 通过 `$PATH`环境变量找寻浏览器驱动 可参考Python学习--Selenium模块简单介绍(1) 控制 ...
- python+request接口自动化框架
python+request接口自动化框架搭建 1.数据准备2.用python获取Excel文件中测试用例数据3.通过requests测试接口4.根据接口返回的code值和Excel对比 但本章只讲整 ...
- python+request+HTMLTestRunner+unittest接口自动化测试框架
转自https://my.oschina.net/u/3041656/blog/820023 正在调研使用python进行自动化测试,在网上发现一篇比较好的博文,作者使用的是python3,但目前自己 ...
- python+request+robot framework接口自动化测试
python+requests实现接口的请求前篇已经介绍,还有不懂或者疑问的可以访问 python+request接口自动化框架 目前我们需要考虑的是如何实现关键字驱动实现接口自动化输出,通过关键字的 ...
- Python+request 将获取的url和接口响应时间(timeout)写入到Excel中《八》
使用场景: 在工作中,常见某个功能的查询,当查询关联表特别多时,开发写的SQL语句等等问题导致响应时间较慢,那么作为测试需要将每个接口的响应时间进行测试,对同个接口多次执行,并将测试结果写入到exce ...
- 我的第一个python web开发框架(39)——后台接口权限访问控制处理
前面的菜单.部门.职位与管理员管理功能完成后,接下来要处理的是将它们关联起来,根据职位管理中选定的权限控制菜单显示以及页面数据的访问和操作. 那么要怎么改造呢?我们可以通过用户的操作步骤来一步步进行处 ...
- python 全栈开发,Day21(抽象类,接口类,多态,鸭子类型)
一.昨日复习 派生方法和派生属性 super 只有在子父类拥有同名方法的时候, 想使用子类的对象调用父类的方法时,才使用super super在类内 : super().方法名(arg1,..) 指名 ...
- python之路----继承的抽象类和接口类
抽象类与接口类 接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数 ...
- Python之requests模块-request api
requests所有功能都能通过"requests/api.py"中的方法访问.它们分别是: requests.request(method, url, **kwargs) req ...
随机推荐
- udevdm命令详解
udevadm 后接一个命令和命令指定选项.它控制了udev运行的行为,处理内核事件,控制事件队列,并且提供简单的调试机制. 选项: --debug 打印错误信息 --version 打印版本信息 - ...
- Python hashlib加密模块
hashlib模块 简介: hashlib模块是一个提供了字符串加密功能的模块,包含MD5和SHA的加密算法.具体的加密支持有: MD5,sha1,sha224,sha256, sha384, sha ...
- Oracle 数据库 alert日志及trace日志的清理
Oracle 数据库 alert日志及trace日志的清理 方案一: 暂停数据库的trace 登录到数据库 sqlplus / as sysdba 修改参数: SQL> alter system ...
- 《Mysql - SQL优化》
一:在查询语句时,应该注意的优化问题 - SELECT语句务必指明字段名称 - SELECT * 会增加很多不必要的消耗(CPU.IO.内存.网络带宽) - 同时会让 Mysql 优化器无法优化 - ...
- 剑指offer52:正则表达式匹配
1 题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符‘.’表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个 ...
- ESP32 - 乐鑫官方Flash烧录工具使用
第一步:打开软件flash_download_tools_v3.6.6.exe 第二步:点击ESP32 DownloadTool,启动我们板子的烧录工具 第三步:按照下图顺序,加载bin_prog目录 ...
- yii2中通过migration创建数据表
### yii2中通过migration创建数据表 准备工作: 1.首先保证php写入了环境变量 2.在项目内创建migrations目录(base版的需要手动创建) 3.配置文件中正确配置了数据库信 ...
- Python列表推导
一. 列表推导式 ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数, 它以一个字符(长度为1的字符串)作为参数,返回 ...
- 【Polya计数】Buildings II
Buildings II 题目描述 As a traveling salesman in a globalized world, Alan has always moved a lot. He alm ...
- Sonya and Bitwise OR CodeForces - 1004F (线段树,分治)
大意: 给定序列$a$, 给定整数$x$. 两种操作(1)单点修改 (2)给定区间$[l,r]$,求有多少子区间满足位或和不少于$x$. 假设不带修改. 固定右端点, 合法区间关于左端点单调的. 可以 ...