python-使用requests库进行接口测试

之前介绍了接口测试中需要关注得测试点,现在我们来看看如何进行接口测试,现在接口测试工具有很多种,例如: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(自行安装)
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, 期间使用 urllib3connection 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
太晚了,先睡觉,明天补上~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 155,958评论 4 358
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,179评论 1 286
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 105,792评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,409评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,723评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,174评论 1 204
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,543评论 2 306
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,270评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,899评论 1 236
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,235评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,771评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,139评论 2 249
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,688评论 3 228
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,936评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,646评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,194评论 2 265
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,145评论 2 258

推荐阅读更多精彩内容