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循环监控远程端口的方法
Mar 14 Python
Python StringIO模块实现在内存缓冲区中读写数据
Apr 08 Python
在 Python 应用中使用 MongoDB的方法
Jan 05 Python
Python中pow()和math.pow()函数用法示例
Feb 11 Python
python读取中文txt文本的方法
Apr 12 Python
用python 实现在不确定行数情况下多行输入方法
Jan 28 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
Feb 18 Python
Python动态赋值的陷阱知识点总结
Mar 17 Python
Django ORM 常用字段与不常用字段汇总
Aug 09 Python
python属于跨平台语言码
Jun 09 Python
Python爬虫爬取糗事百科段子实例分享
Jul 31 Python
Python获取excel内容及相关操作代码实例
Aug 10 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
libmysql.dll与php.ini是否真的要拷贝到c:\windows目录下呢
2010/03/15 PHP
PHP Class&amp;Object -- PHP 自排序二叉树的深入解析
2013/06/25 PHP
php遍历文件夹所有文件子文件夹函数代码
2013/11/27 PHP
用PHP和Shell写Hadoop的MapReduce程序
2014/04/15 PHP
thinkPHP的表达式查询用法详解
2016/09/14 PHP
js获取图片长和宽度的代码
2009/11/24 Javascript
JQuery index()方法使用代码
2010/06/02 Javascript
StringTemplate遇见jQuery冲突的解决方法
2011/09/22 Javascript
Javascript Objects详解
2014/09/04 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
jQuery实现contains方法不区分大小写的方法
2015/02/13 Javascript
jQuery实现radio第一次点击选中第二次点击取消功能
2017/05/15 jQuery
基于nodejs 的多页面爬虫实例代码
2017/05/31 NodeJs
基于JSONP原理解析(推荐)
2017/12/04 Javascript
Vue项目中使用Vux的安装过程
2018/05/01 Javascript
vue权限问题的完美解决方案
2019/05/08 Javascript
Vue实现根据hash高亮选项卡
2019/05/27 Javascript
使用Python的Scrapy框架编写web爬虫的简单示例
2015/04/17 Python
Python实现简单HTML表格解析的方法
2015/06/15 Python
详解Django通用视图中的函数包装
2015/07/21 Python
python开发之函数定义实例分析
2015/11/12 Python
python记录程序运行时间的三种方法
2017/07/14 Python
numpy.std() 计算矩阵标准差的方法
2018/07/11 Python
使用python serial 获取所有的串口名称的实例
2019/07/02 Python
Python list与NumPy array 区分详解
2019/11/06 Python
Python通过format函数格式化显示值
2020/10/17 Python
CSS3文本换行word-wrap解决英文文本超过固定宽度不换行
2013/10/10 HTML / CSS
详解HTML5 Canvas绘制不规则图形时的非零环绕原则
2016/03/21 HTML / CSS
Urban Outfitters美国官网:美国生活方式品牌
2016/08/26 全球购物
美国在线轮胎零售商:SimpleTire
2019/04/08 全球购物
Carmen Sol官网:购买果冻鞋、手袋和配件
2021/01/01 全球购物
先进德育工作者事迹材料
2014/01/24 职场文书
初一新生军训方案
2014/05/22 职场文书
党员三严三实对照检查材料
2014/10/13 职场文书
中学生打架检讨书
2014/10/13 职场文书
创业开店,这样方式更合理
2019/08/26 职场文书