主要介绍内容如下:

  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的抽离,添加日志打印等《三》的更多相关文章

  1. Python学习--Selenium模块学习(2)

    Selenium的基本操作 获取浏览器驱动寻找方式 1. 通过手动指定浏览器驱动路径2. 通过 `$PATH`环境变量找寻浏览器驱动 可参考Python学习--Selenium模块简单介绍(1) 控制 ...

  2. python+request接口自动化框架

    python+request接口自动化框架搭建 1.数据准备2.用python获取Excel文件中测试用例数据3.通过requests测试接口4.根据接口返回的code值和Excel对比 但本章只讲整 ...

  3. python+request+HTMLTestRunner+unittest接口自动化测试框架

    转自https://my.oschina.net/u/3041656/blog/820023 正在调研使用python进行自动化测试,在网上发现一篇比较好的博文,作者使用的是python3,但目前自己 ...

  4. python+request+robot framework接口自动化测试

    python+requests实现接口的请求前篇已经介绍,还有不懂或者疑问的可以访问 python+request接口自动化框架 目前我们需要考虑的是如何实现关键字驱动实现接口自动化输出,通过关键字的 ...

  5. Python+request 将获取的url和接口响应时间(timeout)写入到Excel中《八》

    使用场景: 在工作中,常见某个功能的查询,当查询关联表特别多时,开发写的SQL语句等等问题导致响应时间较慢,那么作为测试需要将每个接口的响应时间进行测试,对同个接口多次执行,并将测试结果写入到exce ...

  6. 我的第一个python web开发框架(39)——后台接口权限访问控制处理

    前面的菜单.部门.职位与管理员管理功能完成后,接下来要处理的是将它们关联起来,根据职位管理中选定的权限控制菜单显示以及页面数据的访问和操作. 那么要怎么改造呢?我们可以通过用户的操作步骤来一步步进行处 ...

  7. python 全栈开发,Day21(抽象类,接口类,多态,鸭子类型)

    一.昨日复习 派生方法和派生属性 super 只有在子父类拥有同名方法的时候, 想使用子类的对象调用父类的方法时,才使用super super在类内 : super().方法名(arg1,..) 指名 ...

  8. python之路----继承的抽象类和接口类

    抽象类与接口类 接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数 ...

  9. Python之requests模块-request api

    requests所有功能都能通过"requests/api.py"中的方法访问.它们分别是: requests.request(method, url, **kwargs) req ...

随机推荐

  1. C++编译器、链接器工作原理

    1 几个基本概念 编译:编译器对源文件的编译过程,就是将源文件中的文本形式代码翻译为机器语言形式的目标文件的过程,此过程中会有一系列语法检查.指令优化等,生成目标(OBJ)文件. 编译单元:每一个CP ...

  2. 【C++札记】指针函数与函数指针

    指针函数 指针函数是一个函数,只不过指针函数返回的类型是某一类型的指针. 格式: 类型名* 函数名(函数参数列表) 如下代码存在问题 void test(char *p) { p = (char*)m ...

  3. 制作一个centos+jdk8+tomcatd9镜像

    docker解析:     1.登录docker             docker ecex –it 容器名/容器id /bin/bash         例如:             dock ...

  4. 理解Python函数和方法

    什么是函数? 函数是抽象出的一组执行特定功能的重复代码,通俗理解,就是对一些重复的工作进行封装和然后直接调用,避免重复造轮子. Python中的函数如何定义? 使用def关键字,结构如下: def 函 ...

  5. 1269: 划分数(Java)

    WUSTOJ 1269: 划分数 参考博客 果7的博客 题目   将 1 个数 n 分成 m 份,求划分的种数.更多内容点击标题. 分析   唯一需要注意的地方是不考虑顺序.其他的直接看代码即可. 代 ...

  6. 1190: 零起点学算法97——A == B ?(Java)

    WUSTOJ 1190: 零起点学算法97--A == B ? Description Give you two integer numbers A and B, if A is equal to B ...

  7. matplotlib笔记2

    颜色和样式 八种内建默认颜色缩写b:blue g:green r:red c:cyan m:magenta y:yellow k:black w:white其它颜色表示方法可以参照百度给的值https ...

  8. css 动画(一)transform 变形

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 有段时间我是没理清 transform.translate.transition 和 animation之 ...

  9. PAT-1013 Battle Over Cities (25 分) DFS求连通块

    It is vitally important to have all the cities connected by highways in a war. If a city is occupied ...

  10. Linux通用小技能

    Linux通用小技能 前言 无论你用ubuntu还是centos,通通没问题,运维这东西,踩坑写文档就是了. 小技能 新磁盘挂载 不管是阿里云还是腾讯云,还是自己的机器,请记住这条命令. mkfs.e ...