python接口自动化(一)requests使用和基本方法封装

本文介绍了使用Python的requests库进行接口自动化测试,包括get和post请求的简单示例,以及如何通过函数调用和类封装来组织请求。特别推荐不包含构造器的类封装方式,便于后期从Excel读取参数直接传递给方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,用 python 做接口测试,主要用到就是 requests 库和 json 库。

1.先看一个简单的示例

1.1 get请求

# -*- coding: UTF-8 -*-
import requests

get_url = 'http://127.0.0.1:8000/api/get_guest_list/'
data = {'eid':1,'phone':'13511001100'}

# 产生一个名为r的Response对象,可以从这个对象中获取我们想要的信息; #get请求传参数时,使用params关键字

r = requests.get(url=get_url, params=data, timeout=5)     # timeout参数用来设定停止等待响应的时间

print(r.url)                    # 返回请求url
# http://127.0.0.1:8000/api/get_guest_list/?eid=1&phone=13511001100
print(r.json())                 # 以JSON格式解析响应内容
# {'status': 200, 'message': 'success', 'data': {'realname': 'alen', 'phone': '13511001100', 'email': 'alen@mail.com', 'sign': True}}
print(r.status_code)            # 返回状态码
# 200
print(r.raise_for_status())     # 如果发送了一个错误请求,如404、500等,可以通过raise_for_status()来抛出异常
# None
print(r.encoding)               # 查看requests使用了什么编码,同时可以用r.encoding属性来改变它
# utf-8
print(r.raw)                    # 获取来自服务器的原始套接字响应
# <urllib3.response.HTTPResponse object at 0x0000000003061A90>
print(r.headers)                # 服务器返回给我们的响应头信息,也可以在传参时通过headers=XXX来定制请求头
# {'Date': 'Sat, 10 Dec 2022 05:09:06 GMT', 'Server': 'WSGIServer/0.2 CPython/3.7.2', 'Content-Type': 'application/json', 'X-Frame-Options': 'DENY', 'Content-Length': '131', 'X-Content-Type-Options': 'nosniff', 'Referrer-Policy': 'same-origin'}
print(r.request)                # 获取原来创建的Request对象
# <PreparedRequest [GET]>
print(r.request.headers)        # 发送到服务器的请求头
# {'User-Agent': 'python-requests/2.28.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive'}

1.2 post请求

注意 post 请求的数据的格式

# -*- coding: UTF-8 -*-
import requests,json

post_url = 'http://127.0.0.1:8000/api/add_guest/'
payload2 = {'eid':1,'realname':'tom001','phone':13510011001}

r = requests.post(post_url, data=payload2, timeout=5)   # post请求传参数时,使用data关键字

print(r.json())         # 以JSON格式解析响应内容
# {'status': 200, 'message': 'add guest success'}
print(r.status_code)    # 返回状态码
# 200

# 若解析不了,可能是格式不对:
# 方法一:
r = requests.post(post_url, json=payload2, timeout=5)
# 方法二:
r = requests.post(post_url, data =json.dumps(payload2), timeout=5)


2.然后通过函数调用来发送 get/post 请求

将get、post 封装成函数

# -*- coding: UTF-8 -*-
import requests

def send_get(url, data):
    """ 定义send_get函数,用来接收参数,发送get请求 """
    r = requests.get(url=url, params=data, timeout=3)
    result = r.json()
    return result

def send_post(url, data):
    """ 定义send_post函数,用来接收参数,发送post请求 """
    # r = requests.post(url=url, json=data, timeout=3)
    r = requests.post(url=url, data=data, timeout=3)
    result = r.json()
    return result

def main(url, method, data):
    """ 定义一个主函数,根据method是get或post,来调用send_post()或send_get() """
    if method == 'POST':
        r = send_post(url, data)  # 如果是POST请求,则调用send_post()
    else:
        r = send_get(url, data)   # 如果是GET请求,则调用send_get()
    return r   # 将结果返回出去

# get 调用
url1 = 'http://127.0.0.1:8000/api/get_guest_list/'
data1 = {'eid':1,'phone':'13511001100'}
demo1 = main(url1, 'GET', data1)
print(demo1)
# {'status': 200, 'message': 'success', 'data': {'realname': 'alen', 'phone': '13511001100', 'email': 'alen@mail.com', 'sign': True}}

# post 调用
url2 = 'http://127.0.0.1:8000/api/add_guest/'
data2 = {'eid':1,'realname':'tom003','phone':13510011003}
demo2 = main(url2, 'POST', data2)
print(demo2)
# {'status': 200, 'message': 'add guest success'}

3.定义一个类,对post请求和get请求进行封装

封装成类

3-1 含有构造器

# run_method.py
# -*- coding: UTF-8 -*-

import requests
import json

class RunMain:
    """ 含有构造器 """
    def __init__(self, url, method, data=None):
        self.t = self.run_main(url, method, data)

        # 利用json.dumps将响应数据进行json格式的编码解析
        # indent=2将输出结果缩进2个字符显示
        # sort_keys=False,输出结果是否按照关键字排序
        # json.dumps 序列化时对中文默认使用的ascii编码,ensure_ascii=False才会输出中文
        # return result
    def send_post(self, url, data):
        # r = requests.post(url=url, json=data)
        r = requests.post(url=url, data=data)
        result = r.json()
        return json.dumps(result, indent=2, sort_keys=False, ensure_ascii=False)

    def send_get(self, url, data):
        r = requests.get(url=url, params=data)
        result = r.json()
        return json.dumps(result, indent=2, sort_keys=False, ensure_ascii=False)

    def run_main(self, url, method, data=None):
        if method == 'GET':
            r = self.send_get(url, data)
        else:
            r = self.send_post(url, data)
        return r


if __name__ == '__main__':
    url1 = 'http://127.0.0.1:8000/api/get_guest_list/'
    data1 = {'eid':1,'phone':'13511001100'}
    test1 = RunMain(url1, 'GET', data1)  # 因为有构造器 __init__,实例化时要带参数
    print(test1.t)
#
# {
#   "status": 200,
#   "message": "success",
#   "data": {
#     "realname": "alen",
#     "phone": "13511001100",
#     "email": "alen@mail.com",
#     "sign": true
#   }
# }


    url2 = 'http://127.0.0.1:8000/api/add_guest/'
    data2 = {'eid':1,'realname':'tom004','phone':13510011004}
    test2 = RunMain(url2, 'POST', data2)  # 因为有构造器 __init__,实例化时要带参数
    print(test2.t)
    
# {
#   "status": 200,
#   "message": "add guest success"
# }

3-2 不含构造器(推荐)

# run_method.py
# -*- coding: UTF-8 -*-

import requests
import json
class RunMain:
    """无构造器"""
    def send_get(self, url, data):
        res = requests.get(url=url, params=data).json()
        return res

    def send_post(self, url, data):
        res = requests.post(url=url, data=data).json()
        return res

    def run_main(self, url, method, data=None):
        res = None
        if method == 'GET':
            res = self.send_get(url, data)
        else:
            res = self.send_post(url, data)
        return res


if __name__ == '__main__':
    url1 = 'http://127.0.0.1:8000/api/get_guest_list/'
    data1 = {'eid': 1, 'phone': '13511001100'}
    run1 = RunMain()  # 先实例化,实例化时不需要带参数
    print(run1.run_main(url1, 'GET', data1))
    # {'status': 200, 'message': 'success', 'data': {'realname': 'alen', 'phone': '13511001100', 'email': 'alen@mail.com', 'sign': True}}

    url2 = 'http://127.0.0.1:8000/api/add_guest/'
    data2 = {'eid':1,'realname':'tom005','phone':13510011005}
    run2 = RunMain()  # 先实例化,实例化时不需要带参数
    print(run2.run_main(url2, 'POST', data2))
    # {'status': 200, 'message': 'add guest success'}

ps.建议在封装运行方法类时,不要加构造器,这样就不需要在实例化时传参,在后面的主函数中从excel中取出参数后再传给类中的方法即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值