0


接口自动化测试之requests的使用

一、requests库简介

request库用来发送http请求以及接受http响应的python第三方库,主要用于接口自动化。
安装命令如下:

$  pip install request

二、requests库常用方法

1、requests.get()
在这里插入图片描述
url接口地址;params传递参数
2、requests.post()
在这里插入图片描述
url接口地址;data用于传参;json也适用于传参;

【data和json传参的区别】

主要通过请求头Contetn-Type区分
请求分四部分(缺一不可):请求方式、请求路径、请求头、请求正文
**Contetn-Type:作用是服务器要求传入的报文的内容类型**
Postman四种传参方式对应的Contetn-Type如下:
form-data:Contetn-Type:multipart/form-data;boundary=<calculated when request is sent>
x-www-form-urlencoded:Contetn-Type:application/x-www-form-urlencoded(通过表单方式上传)
raw:
    text:Contetn-Type:text/plain(通过文本)
    javascript:Contetn-Type:application/javascript
    json:Contetn-Type:application/json(json格式)
    html:Contetn-Type:text/html
    xml:Contetn-Type::application/xml
binary:Contetn-Type:application/binary(二进制文件格式)
data和json传参以及Content-Type关系如下:
(1)data传参方式:(如果服务器用的是text/plain,那么使用data,报文类型为str)
报文是dict类型(字典类型),默认Contetn-Type使用application/x-www-form-urlencoded(相当于表单上传)
报文是str类型,那么默认Contetn-Type使用text/plain类型
(2)json传参,报文可以是str也可以是dict类型(字典类型用的多),默认Contetn-Type使用application/json

【注意】data不能传递嵌套的dict型数据,可以使用json.loads() 把json字符串转化为dict格式

json.loads() 把json字符串转化为dict格式
json.dumps() 把dict格式转化成json字符串

【如何知道服务器用的什么类型】

接口文档说明、通过抓包工具抓取
data可以传纯键值对的dict,也可以传str格式(不包括嵌套)
json可以传任何形式的dict。如下图包括嵌套,tag为键,后面嵌套dict键值对
在这里插入图片描述
3、requests.put()
在这里插入图片描述
4、requests.delete()
在这里插入图片描述

5、request.request() 可以发送所有类型的请求

在这里插入图片描述
【参数】
method 请求方式
url 请求路径
params=None get方式传参
data=None post方式传参
json=None post方式传参
headers=None 请求头
cookies=None 请求cookie
files=None 文件上传
【使用示例】

url='https://eolink.o.apispace.com/456456/function/v001/city'payload={"location":"上海","items":"10","area":"china","language":"","withTz":"","withPoi":"false"}headers={"X-APISpace-Token":"自己的Token", "Authorization-Type":"apikey"}res=requests.request("GET", url, params=payload, headers=headers)

三、requests模块返回的response对象详解

res.json() 获得返回的json对象(字典格式的数据)
res.text() 获得返回的字符串格式的数据
res.content() 获得返回的bytes字节类型的数据
res_status_code() 返回状态码
res.reason 返回状态信息
res.cookies 返回cookie信息
res.headers() 返回响应头
res.request.XXX 返回请求的数据,如:请求头,请求参数。。
【json格式】
①键值对 ②数组 json是字典类型的字符串格式
【示例代码】

#get接口地址APIspace(手机号码归属地和运营商,200次,可QQ登录,不需要实名验证):https://www.apispace.com/console/api?orgId=18467#post接口地址APIspace(手机号码归属地,200次,可QQ登录,不需要实名验证):https://www.apispace.com/eolink/api/teladress/introduction#接口实现过程(需要从接口文档获得的数据):#url接口地址:#params接口参数:用户名 个人信息(哪些是必填,哪些是不填,哪些是可填可不填)#请求方式:get、post、delete#响应结果import requests

classTestRequests:#request.get() url接口地址;params传递参数# post请求,查询手机号归属地和运营商deftest_rget(self):

        url='https://eolink.o.apispace.com/phone/api/v1/forward/china/phone/attribution'
        payload={"phone_number":"13610048587"}
        headers={"X-APISpace-Token":"mhb9k3ivo75m2putbal*******","Authorization-Type":"apikey"}#使用request.request()方法实现
        res=requests.request("GET", url, params=payload, headers=headers)#res.text()  获得返回的字符串格式的数据print('\n'+res.text)#res.json()  获得返回的json对象(①键值对②字典格式的数据,不能包含嵌套)print(res.json())print('\n---------------------------')#requests.post():url接口地址;两种传参方式:data和josn#post请求,查询手机号归属地deftest_rpost(self):
        url ='https://eolink.o.apispace.com/teladress/teladress'
        payload ={"mobile":"13610048587"}# Contetnt-Type使用application/x-www-form-urlencoded(相当于表单上传)对应报文是dict类型(字典类型),post应为data传参
        headers ={"X-APISpace-Token":"mhb9k3ivo75m2putbaln*******","Authorization-Type":"apikey","Content-Type":"application/x-www-form-urlencoded"}# 使用request.request()方法实现
        res = requests.request("POST", url, json=payload, headers=headers)# data可以传递str或dic类型参数,单不能传递嵌套的dict型数据# 使用json.dumps()  把dict格式转化成json字符串# dpayload = json.dumps(payload)# res = requests.request("POST", url, data=dpayload, headers=headers)# res.text()  获得返回的字符串格式的数据print('\n'+res.text)# res.json()  获得返回的json对象(①键值对②字典格式的数据,不能包含嵌套)print(res.json())if __name__ =='__main__':
    TestRequests.test_rget()
    TestRequests.test_rpost()

【运行结果】在这里插入图片描述

四、请求必须带请求头的接口,以及需要cookie鉴权和session鉴权的接口

请求分四部分(缺一不可):请求方式、请求路径、请求头、请求正文

4.1 正则提取

【正则提取举例】提取html文件中某一个变量值,例如中的value的值
【代码如下】

import re
classTestZhengze:
    cs_Token =''deftest_strat(self):#正则提取下列中的value值str='<input type="hidden" id="bsToken" name="bsToken" value="d170371c1389a005958220f155d17bb6">'#复制左边界   name="bsToken" value="d170371c1389a005958220f155d17bb6"#将要去取的值改为 (.*?)#使用re.search()方法进行正则提取
        obj = re.search('name="bsToken" value="(.*?)"',str)print(obj.group(1))#通过类引用全局变量,将取到的值保存到全局变量当中
        TestZhengze.cs_Token = obj.group(1)#测试再其他函数中使用这个全局变量deftest_token(self):print('\n'+TestZhengze.cs_Token)if __name__ =='__main__':
   TestZhengze.test_strat()
   TestZhengze.test_token()

四要素没问题但是接口返回出错,查找cookie鉴权是否正确

4.2判断是否是cookie出错

打开项目,F12进入开发者模式,查看cookie下是否有值(点击Application,选择Storage,点击Cookies。右边显示cookies详细信息。看到values下有值,说明存在cookie鉴权)
在这里插入图片描述

4.3 两种解决cookie鉴权方式

1、使用cookie关联
2、使用session关联

session鉴权不用传递cookie值也可以鉴权成功
代码如下:

import requests
from requests.cookies import RequestsCookieJar
#有cookie鉴权的接口测试,本测试中接口为bing搜索引擎#成功输出如下#-----------------#<RequestsCookieJar[<Cookie MUID=20B158D8B6C468ED02144A66B7EA697A for .bing.com/>, <Cookie SRCHD=AF=000047 for .bing.com/>, <Cookie SRCHHPGUSR=SRCHLANG=zh-Hans for .bing.com/>, <Cookie SRCHUID=V=2&GUID=0005DEE951274F3E88819BBF9E3021C9&dmnchg=1 for .bing.com/>, <Cookie SRCHUSR=DOB=20230220 for .bing.com/>, <Cookie SUID=M for .bing.com/>, <Cookie _EDGE_S=F=1&SID=05B549989A046F5C2DAD5B269B2A6E18 for .bing.com/>, <Cookie _EDGE_V=1 for .bing.com/>, <Cookie _HPVN=CS=eyJQbiI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiUCJ9LCJTYyI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiSCJ9LCJReiI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiVCJ9LCJBcCI6dHJ1ZSwiTXV0ZSI6dHJ1ZSwiTGFkIjoiMjAyMy0wMi0yMFQwMDowMDowMFoiLCJJb3RkIjowLCJHd2IiOjAsIkRmdCI6bnVsbCwiTXZzIjowLCJGbHQiOjAsIkltcCI6MX0= for .bing.com/>, <Cookie _SS=SID=05B549989A046F5C2DAD5B269B2A6E18 for .bing.com/>, <Cookie MUIDB=20B158D8B6C468ED02144A66B7EA697A for cn.bing.com/>]>#200#<RequestsCookieJar[<Cookie MUID=20B158D8B6C468ED02144A66B7EA697A for .bing.com/>, <Cookie SRCHD=AF=000047 for .bing.com/>, <Cookie SRCHHPGUSR=SRCHLANG=zh-Hans for .bing.com/>, <Cookie SRCHUID=V=2&GUID=0005DEE951274F3E88819BBF9E3021C9&dmnchg=1 for .bing.com/>, <Cookie SRCHUSR=DOB=20230220 for .bing.com/>, <Cookie SUID=M for .bing.com/>, <Cookie _EDGE_S=F=1&SID=05B549989A046F5C2DAD5B269B2A6E18 for .bing.com/>, <Cookie _EDGE_V=1 for .bing.com/>, <Cookie _HPVN=CS=eyJQbiI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiUCJ9LCJTYyI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiSCJ9LCJReiI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiVCJ9LCJBcCI6dHJ1ZSwiTXV0ZSI6dHJ1ZSwiTGFkIjoiMjAyMy0wMi0yMFQwMDowMDowMFoiLCJJb3RkIjowLCJHd2IiOjAsIkRmdCI6bnVsbCwiTXZzIjowLCJGbHQiOjAsIkltcCI6MX0= for .bing.com/>, <Cookie _SS=SID=05B549989A046F5C2DAD5B269B2A6E18 for .bing.com/>, <Cookie MUIDB=20B158D8B6C468ED02144A66B7EA697A for cn.bing.com/>]>##-----------------#<RequestsCookieJar[<Cookie MUID=1868BFDD0D2465C51030AD630C0A6412 for .bing.com/>, <Cookie SRCHD=AF=000047 for .bing.com/>, <Cookie SRCHHPGUSR=SRCHLANG=zh-Hans for .bing.com/>, <Cookie SRCHUID=V=2&GUID=A11E9B8919704A07AB4D91C5870AFB43&dmnchg=1 for .bing.com/>, <Cookie SRCHUSR=DOB=20230220 for .bing.com/>, <Cookie SUID=M for .bing.com/>, <Cookie _EDGE_S=F=1&SID=1DE257BD61F265E90302450360DC645B for .bing.com/>, <Cookie _EDGE_V=1 for .bing.com/>, <Cookie _HPVN=CS=eyJQbiI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiUCJ9LCJTYyI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiSCJ9LCJReiI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiVCJ9LCJBcCI6dHJ1ZSwiTXV0ZSI6dHJ1ZSwiTGFkIjoiMjAyMy0wMi0yMFQwMDowMDowMFoiLCJJb3RkIjowLCJHd2IiOjAsIkRmdCI6bnVsbCwiTXZzIjowLCJGbHQiOjAsIkltcCI6MX0= for .bing.com/>, <Cookie _SS=SID=1DE257BD61F265E90302450360DC645B for .bing.com/>, <Cookie MUIDB=1868BFDD0D2465C51030AD630C0A6412 for cn.bing.com/>]>#{'MUID': '1868BFDD0D2465C51030AD630C0A6412', 'SRCHD': 'AF=000047', 'SRCHHPGUSR': 'SRCHLANG=zh-Hans', 'SRCHUID': 'V=2&GUID=A11E9B8919704A07AB4D91C5870AFB43&dmnchg=1', 'SRCHUSR': 'DOB=20230220', 'SUID': 'M', '_EDGE_S': 'F=1&SID=1DE257BD61F265E90302450360DC645B', '_EDGE_V': '1', '_HPVN': 'CS=eyJQbiI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiUCJ9LCJTYyI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiSCJ9LCJReiI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiVCJ9LCJBcCI6dHJ1ZSwiTXV0ZSI6dHJ1ZSwiTGFkIjoiMjAyMy0wMi0yMFQwMDowMDowMFoiLCJJb3RkIjowLCJHd2IiOjAsIkRmdCI6bnVsbCwiTXZzIjowLCJGbHQiOjAsIkltcCI6MX0=', '_SS': 'SID=1DE257BD61F265E90302450360DC645B', 'MUIDB': '1868BFDD0D2465C51030AD630C0A6412'}#1868BFDD0D2465C51030AD630C0A6412classTestCookie:#设置全局变量用于存放获取到的cookie
    p_cookie =''deftest_getcookie(self):
        data ={"sb_form_c":"pdf"}
        url ="https://cn.bing.com/?form=000047"
        r = requests.post(url=url, data=data)#提取cookie
        TestCookie.p_cookie = r.cookies
        print('\n-----------------')print(TestCookie.p_cookie)print(r.status_code)#print(res.text)print(r.cookies)print('\n-----------------')print(r.cookies)# response.cookies返回的是RequestsCookieJar对象print(requests.utils.dict_from_cookiejar(r.cookies))#将返回的cookie转换为dict格式print(requests.utils.dict_from_cookiejar(r.cookies)['MUID'])#使用session鉴权deftest_session(self):
        data ={"sb_form_c":"pdf"}
        url ="https://cn.bing.com/?form=000047"
        session = requests.session()
        session.post(url=url, data=data)
        cook = session.cookies
        print('\n---------session--------')print(session)print(cook)if __name__ =='__main__':
    TestCookie.test_getcookie()
    TestCookie.test_session()

六、一些小技巧

【pycharm使用小技巧】
①自动导包:鼠标移动到需要到导包的语句,alt+回车,自动导包
②ctrl键点击方法,进入方法内部查看方法详细信息,如参数等
③ctrl+F 查找

标签: python 单元测试

本文转载自: https://blog.csdn.net/weixin_43379926/article/details/129125716
版权归原作者 城三月 所有, 如有侵权,请联系我们删除。

“接口自动化测试之requests的使用”的评论:

还没有评论