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使用CMD模块更优雅的运行脚本
May 11 Python
python计算文本文件行数的方法
Jul 06 Python
Python数组遍历的简单实现方法小结
Apr 27 Python
Python字典简介以及用法详解
Nov 15 Python
Python用threading实现多线程详解
Feb 03 Python
Python安装lz4-0.10.1遇到的坑
May 20 Python
python多线程并发让两个LED同时亮的方法
Feb 18 Python
PyCharm2018 安装及破解方法实现步骤
Sep 09 Python
python 实现绘制整齐的表格
Nov 18 Python
python下载卫星云图合成gif的方法示例
Feb 18 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
Feb 28 Python
Python scrapy爬取小说代码案例详解
Jul 09 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
Look And Say 序列php实现代码
2011/05/22 PHP
PHP pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
在WINDOWS中设置计划任务执行PHP文件的方法
2011/12/19 PHP
php _autoload自动加载类与机制分析
2012/02/10 PHP
PHP图片等比缩放类SimpleImage使用方法和使用实例分享
2014/04/10 PHP
ThinkPHP中使用ajax接收json数据的方法
2014/12/18 PHP
Symfony2框架学习笔记之HTTP Cache用法详解
2016/03/18 PHP
完美解决Thinkphp3.2中插入相同数据的问题
2017/08/01 PHP
JS原型对象通俗&quot;唱法&quot;
2012/12/27 Javascript
JavaScript网页定位详解
2014/01/13 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(上)
2015/10/28 Javascript
js自定义瀑布流布局插件
2017/05/16 Javascript
Angular2生命周期钩子函数的详细介绍
2017/07/10 Javascript
Node.js五大应用性能技巧小结(必须收藏)
2017/08/09 Javascript
对vue.js中this.$emit的深入理解
2018/02/23 Javascript
使用layer弹窗和layui表单实现新增功能
2018/08/09 Javascript
jQuery 操作 HTML 元素和属性的方法
2018/11/12 jQuery
Next.js实现react服务器端渲染的方法示例
2019/01/06 Javascript
vue动态添加路由addRoutes之不能将动态路由存入缓存的解决
2019/02/19 Javascript
Vue服务端渲染实践之Web应用首屏耗时最优化方案
2019/03/22 Javascript
Angular4.0动画操作实例详解
2019/05/10 Javascript
angular inputNumber指令输入框只能输入数字的实现
2019/12/03 Javascript
[45:46]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS DT
2014/05/23 DOTA
分享一个常用的Python模拟登陆类
2015/03/29 Python
对Python中实现两个数的值交换的集中方法详解
2019/01/11 Python
python实现登录与注册系统
2020/11/30 Python
CSS3中animation实现流光按钮效果
2020/12/21 HTML / CSS
Volcom英国官方商店:美国殿堂级滑板、冲浪、滑雪服装品牌
2019/03/13 全球购物
高三政治教学反思
2014/02/06 职场文书
毕业生写求职信的要点
2014/03/04 职场文书
检讨书范文
2015/01/27 职场文书
青年教师个人总结
2015/02/11 职场文书
理解深度学习之深度学习简介
2021/04/14 Python
python中的sys模块和os模块
2022/03/20 Python
Android自定义双向滑动控件
2022/04/19 Java/Android
Go获取两个时区的时间差
2022/04/20 Golang