python利用requests库进行接口测试的方法详解


Posted in Python onJuly 06, 2018

前言

之前介绍了接口测试中需要关注得测试点,现在我们来看看如何进行接口测试,现在接口测试工具有很多种,例如:postman,soapui,jemter等等,对于简单接口而言,或者我们只想调试一下,使用工具是非常便捷而且快速得,但是对于更复杂得场景,这些工具虽然也能实现,但是难度要比写代码更大,而且定制化受到工具得功能影响,会
遇到一些障碍,当然我们还要实现自动化等等,鉴于以上因素,我们还是要学会使用代码进行接口测试,便于维护与扩展,或者算是我们知识得补充把~

requests库是python用来发起http/https请求得第三方库,支持get,post,put,delete等,requests特点是简单便捷、功能丰富,能够满足日常测试需求,所以我们选取requests库进行接口测试

运行环境:

  • 系统:mac os 10.13.5
  • python:3.6.4
  • requests:2.19.1

接口为自己编写得测试接口,测试请使用自己得接口

第一部分:安装

1.安装python(自行安装),不会的朋友们可以参考这篇文章:https://3water.com/article/112486.htm

2.安装requests(linux和mac os可能会遇到权限问题,sudo安装即可)

pip install -U requests

3.验证

localhost:~ mac$ python3
Python 3.6.4 (v3.6.4:d48ecebad5, Dec 18 2017, 21:07:28)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>>

没有报错说明python与requests环境都没问题

第二部分:基础部分

以一个简单的get接口为例

import requests #导入requests模块
response=requests.get("http://localhost:5000/hello")#对hello接口进行get请求,并获取响应信息

1.响应信息(response)解析

print(response.text) 
print(response.content)
##输出
你好
b'\xe4\xbd\xa0\xe5\xa5\xbd'

response.text是以str得形式返回得响应信息

response.content是以bytes形式返回

实际使用中根据自己得情况进行选择

2.获取状态码

print(response.status_code)
##输出
200

3.获取headers信息

print(response.headers)
##输出
{'Content-Type': 'text/html; charset=utf-8', 'Content-Length': '6', 'Server': 'Werkzeug/0.14.1 Python/3.6.4', 'Date': 'Sun, 24 Jun 2018 02:55:27 GMT'}

4.获取cookies信息

print(response.cookies)
##输出
<RequestsCookieJar[]>

注意:这里与其他部分稍有不同,返回cookies的信息为cookies对象,而不是像前面部分返回得是字符串或者字典,cookies解析部分在后面会进行单独说明

5.获取请求url

print(response.url)
###输出
http://localhost:5000/hello

6.获取反序列化后的得信息:

print(response.json())
###输出:
{'name': 'john'}

注意:只有在返回信息为json格式时才能使用,否则会报json异常

7.获取响应时间

print(response.elapsed)
print(response.elapsed.microseconds)
print(response.elapsed.seconds)
print(response.elapsed.total_seconds())
##输出
0:00:00.003773
3773
0
0.003773

第三部分:进阶部分

通常我们要想获取正确得响应信息需要传递一些参数,针对不同得请求,传参方式稍有不通,下面我们来看一下
这里我部署了一个get接口和一个post接口,功能都是讲获取得请求参数返回回来,以便我们查看效果

1.get请求传递参数

params={"name":"john","age":17}
response=requests.get("http://localhost:5000/get_params",params=params)
print(response.text)
print(response.url)
##输出
{"name": "john", "age": "17"}
http://localhost:5000/get_params?name=john&age=17

说明:

这里做了三件事,先定义一个参数字典p,然后将参数字典以params参数传递给get方法,最后将响应信息打印出来,从响应信息可以看到参数被正确得传递进去,requests帮我们把参数组合到了url里面

2.post请求传递参数

post传递参数和get有所不同,根据服务端取值方式进行不同方式得传递

如果是传递得json格式得参数

p={"name":"john","age":17}
response=requests.post("http://localhost:5000/post_params",json=p)
print(response.text)
###输出:
{"name": "john", "age": 17}

如果是以html中form得形式传递参数,

response=requests.post("http://localhost:5000/post_params",data=p)
print(response.text)

如果form传递得是json格式需要以下面得方式

import json
response=requests.post("http://localhost:5000/post_params",data=json.dumps(p))
print(response.text)

说明:

需要将字典行驶得参数转换为json格式,再进行传递

根据服务端得情况选中一种方式进行传递参数,通常情况下这三种情况可以满足测试需求

第四部分:高级部分

1.操作cookies

有时候由于服务端需要取得cookies信息来进行用户身份验证, 或者另外一些用户信息来进行逻辑处理,这时候我们在测试接口时需要手动获取cookies信息和添加cookies信息到请求中

先看设置cookies信息

注:我这里部署了一个set_cookies接口,将cookies信息作为响应信息返回

my_cookies={"name":"john"}
response=requests.get("http://localhost:5000/set_cookies",cookies=my_cookies)
print(response.text)
##输出
{"name": "john"}

说明:

这段代码先定义了一个cookies字典,然后通过get方法,以cookies参数传入,最后打印出响应信息,可以看到cookies被成功种入请求中

我们再说说如何获取cookies并解析cookies信息

注:这里我部署了一个get_cookies接口,将{"name":"john"}作为cookies置入响应中

response=requests.get("http://localhost:5000/get_cookies")
cookies=response.cookies
print(cookies["name"])
##输出:
john

说明:

获取cookies对象得信息,我们只需要像获取字段得value一样即可,可以看到我们成功获取到了john

2.headers

看完了cookies之后,header就一目了然了,但是我还是同样部署两个接口(一个set_headers,一个get_headers)

#设置headers
my_headers={"name":"john"}
response=requests.get("http://localhost:5000/set_headers",headers=my_headers)
print(response.text)
#获取headers
response=requests.get("http://localhost:5000/get_headers")
print(response.headers.get("name"))
##输出:
{"name": "john"}
john

3.session

session可以理解为一段对话,而这段对话会纪录这次会话中得一些内容和状态,当中断这段对话,这些信息与状态就丢失了session对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 urllib3 的 connection pooling 功能。所以如果你向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来显著的性能提升

使用方法

注:我这里部署两个接口,一个hello接口(用来演示使用全局cookies,将请求cookies返回),一个world接口(用来演示使用全局headers,将请求headers返回)

#设置headers
my_info={"name":"john"}
#创建全局session对象
my_session=requests.session()
#设置全局cookies信息
my_session.cookies.set("name","john")
#设置全局headers信息
my_session.headers.update(my_info)
#演示全局cookies使用
response=my_session.get("http://localhost:5000/hello")
print(response.text)
#演示全局headers使用
response=my_session.get("http://localhost:5000/world")
print(response.text)
##输出
{"name": "john"}
{"Host": "localhost:5000", "User-Agent": "python-requests/2.19.1", "Accept-Encoding": "gzip, deflate", "Accept": "*/*", "Connection": "keep-alive", "Name": "john", "Cookie": "name=john"}

4.设置timeout

通常接口都是为上游服务得,由于上游不能够长时间等待接口返回信息,都会设置一个超时时间,超过了这个时间,会将这个结果丢弃,如果我们要监控线上接口有没有超时情况,这时候我们发起请求的时候就需要设置一个超时时间,如果超过这个时间,就会抛出一个异常

response=requests.get("http://www.baidu.com",timeout=5)

说明:

将5这个超时时间以timeout参数传入,这里得单位是秒

如果要想将连接(connect)与读取(read)都进行设置,则需要传入一个元组,第一个元素为connect超时事件,第二个元素为read超时时间

response=requests.get("http://www.baidu.com",timeout=(1,2))

5.hook

太晚了,先睡觉,明天补上~~

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python解决鸡兔同笼问题的方法
Dec 20 Python
用Python编写简单的定时器的方法
May 02 Python
python 找出list中最大或者最小几个数的索引方法
Oct 30 Python
详解Python数据分析--Pandas知识点
Mar 23 Python
pandas数据筛选和csv操作的实现方法
Jul 02 Python
python 梯度法求解函数极值的实例
Jul 10 Python
python 提取文件指定列的方法示例
Aug 07 Python
python logging设置level失败的解决方法
Feb 19 Python
python绘制分布折线图的示例
Sep 24 Python
python绘制高斯曲线
Feb 19 Python
python 基于pygame实现俄罗斯方块
Mar 02 Python
python 离散点图画法的实现
Apr 01 Python
python生成密码字典的方法
Jul 06 #Python
Python 3.x 判断 dict 是否包含某键值的实例讲解
Jul 06 #Python
使用python中的in ,not in来检查元素是不是在列表中的方法
Jul 06 #Python
python 实现将字典dict、列表list中的中文正常显示方法
Jul 06 #Python
Python判断中文字符串是否相等的实例
Jul 06 #Python
Python中使用Counter进行字典创建以及key数量统计的方法
Jul 06 #Python
python 字典 按key值大小 倒序取值的实例
Jul 06 #Python
You might like
上海无线电三厂简史修改版
2021/03/01 无线电
YII实现分页的方法
2014/07/09 PHP
php写入数据到CSV文件的方法
2015/03/14 PHP
PHP封装cURL工具类与应用示例
2019/07/01 PHP
判断脚本加载是否完成的方法
2009/05/26 Javascript
Jquery 基础学习笔记
2009/05/29 Javascript
jquery isEmptyObject判断是否为空对象的函数
2011/02/14 Javascript
JavaScript 高级篇之闭包、模拟类,继承(五)
2012/04/07 Javascript
web的各种前端打印方法之jquery打印插件jqprint实现网页打印
2013/01/09 Javascript
解析使用JS 清空File控件的路径值
2013/07/08 Javascript
JQuery插件fancybox无法在弹出层使用左右键的解决办法
2013/12/25 Javascript
纯javascript制作日历控件
2015/07/17 Javascript
Javascript 创建类并动态添加属性及方法的简单实现
2016/10/20 Javascript
学习使用Bootstrap栅格系统
2017/05/11 Javascript
Vue中使用vue-i18插件实现多语言切换功能
2018/04/25 Javascript
JS工厂模式开发实践案例分析
2019/10/17 Javascript
[01:28:24]NAVI vs VG Supermajor 败者组 BO3 第三场 6.5
2018/06/06 DOTA
[45:52]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第二场 12.09
2020/12/12 DOTA
python flask 多对多表查询功能
2017/06/25 Python
python 将print输出的内容保存到txt文件中
2018/07/17 Python
Python修改列表值问题解决方案
2020/03/06 Python
基于Tensorflow一维卷积用法详解
2020/05/22 Python
Python监听键盘和鼠标事件的示例代码
2020/11/18 Python
python字典按照value排序方法
2020/12/28 Python
用pip给python安装matplotlib库的详细教程
2021/02/24 Python
改变生活的男士内衣:SAXX Underwear
2019/08/28 全球购物
幼儿园亲子活动方案
2014/01/29 职场文书
小学美术教学反思
2014/02/01 职场文书
信息与计算科学专业推荐信
2014/02/23 职场文书
文明城市创建标语
2014/06/16 职场文书
大学生个人求职信例文
2014/07/07 职场文书
先进事迹材料怎么写
2014/12/30 职场文书
2015年求职自荐信范文
2015/03/04 职场文书
八年级作文之感恩
2019/11/22 职场文书
解决pytorch 损失函数中输入输出不匹配的问题
2021/06/05 Python
搞笑Gif:这么白这么长的腿像极了一楼的女朋友
2022/03/21 杂记