接口自动化框架篇(16):框架中的不同请求方式封装

📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)

📝 职场经验干货:

软件测试工程师简历上如何编写个人信息(一周8个面试)

软件测试工程师简历上如何编写专业技能(一周8个面试)

软件测试工程师简历上如何编写项目经验(一周8个面试)

软件测试工程师简历上如何编写个人荣誉(一周8个面试)

软件测试行情分享(这些都不了解就别贸然冲了.)

软件测试面试重点,搞清楚这些轻松拿到年薪30W+

软件测试面试刷题小程序免费使用(永久使用)


在接口自动化测试中,封装不同的请求方式是提高代码复用性和可维护性的关键步骤。通过封装,可以将请求的细节隐藏在底层,使测试用例更加简洁和易于理解。本文将详细介绍如何在 Pytest 框架中封装常见的 HTTP 请求方法,包括 GET、POST、PUT、DELETE 等,并提供详细的代码示例。

一、封装请求方法的必要性

在接口自动化测试中,直接使用 requests 库发送 HTTP 请求虽然简单,但会导致测试用例中重复编写类似的代码。通过封装请求方法,可以:

减少代码重复:将重复的代码逻辑抽象到封装方法中,提高代码复用性。

提高可维护性:当接口的某些细节(如 URL、请求头等)发生变化时,只需修改封装方法,而无需修改每个测试用例。

增强测试的可读性:封装方法可以提供更直观的接口调用方式,使测试用例更加清晰易懂。

二、封装请求方法

(一)安装依赖库

首先,需要安装 requests 库,这是一个用于发送 HTTP 请求的 Python 库。

pip install requests

(二)封装请求类

创建一个 request_util.py 文件,封装不同的请求方法。

import requests

import json

class RequestUtil:

    def __init__(self, base_url):

        self.base_url = base_url

    def get(self, endpoint, params=None, headers=None):

        """发送 GET 请求"""

        url = f"{self.base_url}{endpoint}"

        response = requests.get(url, params=params, headers=headers)

        return response

    def post(self, endpoint, data=None, json=None, headers=None):

        """发送 POST 请求"""

        url = f"{self.base_url}{endpoint}"

        response = requests.post(url, data=data, json=json, headers=headers)

        return response

    def put(self, endpoint, data=None, json=None, headers=None):

        """发送 PUT 请求"""

        url = f"{self.base_url}{endpoint}"

        response = requests.put(url, data=data, json=json, headers=headers)

        return response

    def delete(self, endpoint, headers=None):

        """发送 DELETE 请求"""

        url = f"{self.base_url}{endpoint}"

        response = requests.delete(url, headers=headers)

        return response

    def patch(self, endpoint, data=None, json=None, headers=None):

        """发送 PATCH 请求"""

        url = f"{self.base_url}{endpoint}"

        response = requests.patch(url, data=data, json=json, headers=headers)

        return response

    def options(self, endpoint, headers=None):

        """发送 OPTIONS 请求"""

        url = f"{self.base_url}{endpoint}"

        response = requests.options(url, headers=headers)

        return response

    def head(self, endpoint, headers=None):

        """发送 HEAD 请求"""

        url = f"{self.base_url}{endpoint}"

        response = requests.head(url, headers=headers)

        return response‍

三、使用封装的请求类

(一)示例:发送 GET 请求

import pytest

from request_util import RequestUtil

@pytest.fixture

def api():

    return RequestUtil("https://api.example.com")

def test_get_user_info(api):

    response = api.get("/users/123")

    assert response.status_code == 200

    assert response.json()["name"] == "John Doe"

(二)示例:发送 POST 请求

def test_create_user(api):

    user_data = {"name": "John Doe", "email": "john.doe@example.com"}

    response = api.post("/users", json=user_data)

    assert response.status_code == 201

    assert response.json()["name"] == "John Doe"

(三)示例:发送 PUT 请求

def test_update_user(api):

    user_data = {"name": "John Doe Updated", "email": "john.doe.updated@example.com"}

    response = api.put("/users/123", json=user_data)

    assert response.status_code == 200

    assert response.json()["name"] == "John Doe Updated"

(四)示例:发送 DELETE 请求

def test_delete_user(api):

    response = api.delete("/users/123")

    assert response.status_code == 204

(五)示例:发送 PATCH 请求

def test_partial_update_user(api):

    user_data = {"email": "john.doe.updated@example.com"}

    response = api.patch("/users/123", json=user_data)

    assert response.status_code == 200

    assert response.json()["email"] == "john.doe.updated@example.com"

(六)示例:发送 OPTIONS 请求

def test_options_user(api):

    response = api.options("/users/123")

    assert response.status_code == 200

    assert "Allow" in response.headers

(七)示例:发送 HEAD 请求

def test_head_user(api):

    response = api.head("/users/123")

    assert response.status_code == 200

    assert response.headers["Content-Type"] == "application/json"

四、封装请求方法的高级技巧

(一)添加日志记录

在封装的请求方法中添加日志记录,以便在测试过程中记录请求和响应的详细信息。

import logging

class RequestUtil:

    def __init__(self, base_url):

        self.base_url = base_url

        self.logger = logging.getLogger(__name__)

    def get(self, endpoint, params=None, headers=None):

        url = f"{self.base_url}{endpoint}"

        self.logger.info(f"Sending GET request to {url}")

        response = requests.get(url, params=params, headers=headers)

        self.logger.info(f"Response status code: {response.status_code}")

        self.logger.info(f"Response content: {response.text}")

        return response

    # 其他请求方法类似

(二)处理异常

在封装的请求方法中添加异常处理机制,以便在请求失败时捕获异常并记录错误信息。

class RequestUtil:

    def __init__(self, base_url):

        self.base_url = base_url

        self.logger = logging.getLogger(__name__)

    def get(self, endpoint, params=None, headers=None):

        url = f"{self.base_url}{endpoint}"

        try:

            self.logger.info(f"Sending GET request to {url}")

            response = requests.get(url, params=params, headers=headers)

            response.raise_for_status()  # 检查状态码是否为 200

            self.logger.info(f"Response status code: {response.status_code}")

            self.logger.info(f"Response content: {response.text}")

            return response

        except requests.exceptions.RequestException as e:

            self.logger.error(f"Request failed: {e}")

            raise

(三)支持会话管理

在某些情况下,接口测试需要保持会话状态,例如登录后获取的 Token。可以使用 requests.Session 来管理会话。

class RequestUtil:

    def __init__(self, base_url):

        self.base_url = base_url

        self.session = requests.Session()

        self.logger = logging.getLogger(__name__)

    def get(self, endpoint, params=None, headers=None):

        url = f"{self.base_url}{endpoint}"

        self.logger.info(f"Sending GET request to {url}")

        response = self.session.get(url, params=params, headers=headers)

        self.logger.info(f"Response status code: {response.status_code}")

        self.logger.info(f"Response content: {response.text}")

        return response

    # 其他请求方法类似

(四)动态设置请求头

在某些情况下,可能需要根据不同的请求动态设置请求头。可以通过方法参数传递请求头,或者在封装类中动态设置请求头。

class RequestUtil:

    def __init__(self, base_url):

        self.base_url = base_url

        self.session = requests.Session()

        self.logger = logging.getLogger(__name__)

    def set_headers(self, headers):

        """动态设置请求头"""

        self.session.headers.update(headers)

    def get(self, endpoint, params=None, headers=None):

        url = f"{self.base_url}{endpoint}"

        self.logger.info(f"Sending GET request to {url}")

        response = self.session.get(url, params=params, headers=headers)

        self.logger.info(f"Response status code: {response.status_code}")

        self.logger.info(f"Response content: {response.text}")

        return response

    # 其他请求方法类似

(五)支持超时设置

在发送请求时,可以设置超时时间,以避免请求长时间未响应导致测试卡死。

class RequestUtil:

    def __init__(self, base_url, timeout=10):

        self.base_url = base_url

        self.timeout = timeout

        self.session = requests.Session()

        self.logger = logging.getLogger(__name__)

    def get(self, endpoint, params=None, headers=None):

        url = f"{self.base_url}{endpoint}"

        self.logger.info(f"Sending GET request to {url}")

        response = self.session.get(url, params=params, headers=headers, timeout=self.timeout)

        self.logger.info(f"Response status code: {response.status_code}")

        self.logger.info(f"Response content: {response.text}")

        return response

    # 其他请求方法类似‍

五、总结

通过封装不同的请求方法,可以显著提高接口自动化测试的代码复用性和可维护性。本文详细介绍了如何在 Pytest 框架中封装常见的 HTTP 请求方法,包括 GET、POST、PUT、DELETE 等,并提供了详细的代码示例。此外,还介绍了如何添加日志记录、处理异常、支持会话管理和动态设置请求头等高级技巧。希望这些内容能帮助你在接口自动化测试中更加高效地管理请求方法。

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值