📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)
📝 职场经验干货:
在接口自动化测试中,封装不同的请求方式是提高代码复用性和可维护性的关键步骤。通过封装,可以将请求的细节隐藏在底层,使测试用例更加简洁和易于理解。本文将详细介绍如何在 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%免费】