接口自动化测试之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=
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


class TestRequests:
    #request.get() url接口地址;params传递参数
    # post请求,查询手机号归属地和运营商
    def test_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请求,查询手机号归属地
    def test_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()

【运行结果】接口自动化测试之requests的使用_第1张图片

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

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

4.1 正则提取

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

import re
class TestZhengze:
    cs_Token = ''
    def test_strat(self):
        #正则提取下列中的value值
        str = ''
        #复制左边界   name="bsToken" value="d170371c1389a005958220f155d17bb6"
        #将要去取的值改为 (.*?)
        #使用re.search()方法进行正则提取
        obj = re.search('name="bsToken" value="(.*?)"',str)
        print(obj.group(1))
        #通过类引用全局变量,将取到的值保存到全局变量当中
        TestZhengze.cs_Token = obj.group(1)
    #测试再其他函数中使用这个全局变量
    def test_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鉴权)
接口自动化测试之requests的使用_第2张图片

4.3 两种解决cookie鉴权方式

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

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

import requests
from requests.cookies import RequestsCookieJar
#有cookie鉴权的接口测试,本测试中接口为bing搜索引擎
#成功输出如下
#-----------------
#, , , , , , , , , , ]>
#200
#, , , , , , , , , , ]>
#
#-----------------
#, , , , , , , , , , ]>
#{'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'}
#1868BFDD0D2465C51030AD630C0A6412

class TestCookie:
    #设置全局变量用于存放获取到的cookie
    p_cookie = ''
    def test_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鉴权
    def test_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,单元测试)