用Python requests库玩转接口自动化测试!测试工程师的实战秘籍

接口自动化测试是提升测试效率的关键,而Python的requests库因其简洁易用、功能强大,成为测试工程师的"瑞士军刀"。

但你是否还在用requests.get()requests.post()写重复代码?是否遇到过文件上传失败、Cookie管理混乱、响应断言复杂的问题?

本文从零到一拆解requests库的进阶用法,手把手教你打造高可用的接口自动化框架!


一、requests库的"核心六式"

1. 基础请求:GET/POST轻松上手
复制代码
  1. import requests

  2. # GET请求:查询用户列表

  3. response = requests.get(

  4. url="https://api.example.com/users",

  5. params={"page": 1, "size": 10} # 自动拼接URL参数

  6. )

  7. # POST请求:创建新用户

  8. payload = {"name": "测试君", "role": "tester"}

  9. response = requests.post(

  10. url="https://api.example.com/users",

  11. json=payload # 自动设置Content-Type为application/json

  12. )

  13. print(response.status_code) # 状态码

  14. print(response.json()) # 解析JSON响应

AI写代码


2. 会话管理:保持登录态(Session对象)

痛点 :每次请求手动传Cookie/Token太麻烦!
解决:用Session对象自动保持会话!

复制代码
  1. # 登录并保持会话

  2. with requests.Session() as s:

  3. login_data = {"username": "admin", "password": "test123"}

  4. s.post("https://api.example.com/login", data=login_data)

  5. # 后续请求自动携带Cookie

  6. profile = s.get("https://api.example.com/profile")

  7. print(profile.json())

AI写代码


3. 文件上传:测试文件接口必备​​​​​​​
复制代码
  1. # 上传图片文件

  2. files = {'file': open('test_image.jpg', 'rb')} # 二进制模式打开

  3. response = requests.post(

  4. "https://api.example.com/upload",

  5. files=files,

  6. headers={"Authorization": "Bearer xyz123"}

  7. )

  8. # 多文件上传(如测试批量导入)

  9. multiple_files = [

  10. ('files', ('report1.xlsx', open('report1.xlsx', 'rb'))),

  11. ('files', ('report2.xlsx', open('report2.xlsx', 'rb')))

  12. ]

  13. response = requests.post(url, files=multiple_files)

AI写代码


4. 超时与重试:提升测试稳定性​​​​​​​
复制代码
  1. # 设置超时(连接超时3秒,读取超时10秒)

  2. try:

  3. response = requests.get(

  4. "https://api.example.com/data",

  5. timeout=(3, 10)

  6. )

  7. except requests.exceptions.Timeout:

  8. print("请求超时,请检查网络或服务状态!")

  9. # 自动重试(需安装requests-retry库)

  10. from requests.adapters import HTTPAdapter

  11. from requests.packages.urllib3.util.retry import Retry

  12. retry_strategy = Retry(

  13. total=3, # 最大重试次数

  14. status_forcelist=[500, 502, 503, 504], # 遇到这些状态码重试

  15. backoff_factor=1 # 重试等待时间间隔

  16. )

  17. adapter = HTTPAdapter(max_retries=retry_strategy)

  18. session = requests.Session()

  19. session.mount("https://", adapter)

  20. response = session.get(url)

AI写代码


5. 响应断言:自动化测试的灵魂​​​​​​​
复制代码
  1. # 断言状态码和关键字段

  2. assert response.status_code == 200, f"状态码异常:{response.status_code}"

  3. response_data = response.json()

  4. assert response_data["code"] == 0, "接口返回错误码"

  5. assert "user_id" in response_data["data"], "未返回用户ID"

  6. assert len(response_data["data"]["roles"]) >= 1, "用户角色至少一个"

  7. # 使用JSON Schema验证数据结构(需安装jsonschema库)

  8. schema = {

  9. "type": "object",

  10. "properties": {

  11. "code": {"type": "number"},

  12. "data": {

  13. "type": "object",

  14. "properties": {

  15. "user_id": {"type": "string"},

  16. "roles": {"type": "array"}

  17. },

  18. "required": ["user_id"]

  19. }

  20. },

  21. "required": ["code", "data"]

  22. }

  23. import jsonschema

  24. jsonschema.validate(instance=response_data, schema=schema)

AI写代码


6. 高级配置:代理、SSL验证与Mock​​​​​​​
复制代码
  1. # 设置代理(用于测试环境隔离或抓包调试)

  2. proxies = {

  3. "http": "http://10.10.1.10:3128",

  4. "https": "http://10.10.1.10:1080"

  5. }

  6. requests.get("https://api.example.com", proxies=proxies)

  7. # 禁用SSL证书验证(测试环境临时使用,生产环境慎用!)

  8. response = requests.get(url, verify=False)

  9. # 结合Mock服务(如使用pytest-mock)

  10. def test_api(mocker):

  11. mock_response = mocker.Mock()

  12. mock_response.json.return_value = {"code": 0, "data": "mocked"}

  13. mocker.patch("requests.get", return_value=mock_response)

  14. result = requests.get("https://api.example.com")

  15. assert result.json()["code"] == 0

AI写代码


二、接口自动化框架设计实战

1. 封装工具类:拒绝重复代码​​​​​​​
复制代码
  1. class APIClient:

  2. def __init__(self, base_url):

  3. self.base_url = base_url

  4. self.session = requests.Session()

  5. self.session.headers.update({"User-Agent": "AutoTest/1.0"})

  6. def get(self, path, params=None):

  7. url = f"{self.base_url}{path}"

  8. return self.session.get(url, params=params)

  9. def post_json(self, path, data):

  10. url = f"{self.base_url}{path}"

  11. return self.session.post(url, json=data)

  12. # 使用示例

  13. client = APIClient("https://api.example.com")

  14. response = client.post_json("/users", {"name": "测试员"})

AI写代码


2. 参数化测试:数据驱动​​​​​​​
复制代码
  1. import pytest

  2. test_data = [

  3. ("正常登录", {"username": "admin", "password": "123456"}, 200),

  4. ("密码错误", {"username": "admin", "password": "wrong"}, 401),

  5. ("用户名为空", {"username": "", "password": "123456"}, 400)

  6. ]

  7. @pytest.mark.parametrize("case_name, data, expected_code", test_data)

  8. def test_login(case_name, data, expected_code):

  9. response = requests.post("https://api.example.com/login", json=data)

  10. assert response.status_code == expected_code, f"用例失败:{case_name}"

AI写代码


3. 测试报告生成:Allure集成​​​​​​​
复制代码
  1. import allure

  2. @allure.title("测试创建用户接口")

  3. def test_create_user():

  4. with allure.step("步骤1:准备测试数据"):

  5. payload = {"name": "接口测试用户"}

  6. with allure.step("步骤2:发送POST请求"):

  7. response = requests.post(url, json=payload)

  8. with allure.step("步骤3:验证响应结果"):

  9. assert response.status_code == 201

  10. assert response.json()["id"] is not None

AI写代码


三、常见坑点与解决方案

❌ 坑1:响应内容乱码
  • 原因:服务器返回的编码与requests自动检测不一致。

  • 解决:手动指定编码:

复制代码
  1. response.encoding = 'utf-8' # 或 'gbk'

  2. print(response.text)

AI写代码

❌ 坑2:文件上传接口报错

  • 排查 :检查是否以二进制模式('rb')打开文件,且服务端要求的字段名是否正确。
❌ 坑3:Cookie失效问题
  • 解决:使用Session对象保持会话,或定期刷新Token。

四、拓展:接口性能监控小技巧​​​​​​​

复制代码
  1. import time

  2. start_time = time.time()

  3. response = requests.get("https://api.example.com/heavy-api")

  4. end_time = time.time()

  5. assert end_time - start_time < 2.0, f"接口响应超时:{end_time - start_time}秒"

  6. print(f"接口响应时间:{round(end_time - start_time, 2)}秒")

AI写代码

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

视频文档获取方式:

这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

相关推荐
u***j3243 小时前
后端服务限流实现,Redis+Lua脚本
java·redis·lua
CoderYanger3 小时前
A.每日一题——2536. 子矩阵元素加 1
java·线性代数·算法·leetcode·矩阵
不可描述的两脚兽3 小时前
Redis 快记
java·数据库·redis
sanggou3 小时前
【Python爬虫】手把手教你从零开始写爬虫,小白也能轻松学会!(附完整源码)
开发语言·爬虫·python
普通网友3 小时前
C++与Qt图形开发
开发语言·c++·算法
geng_zhaoying3 小时前
在VPython中使用向量计算3D物体移动
python·3d·vpython
yue0083 小时前
C# 更改窗体样式
开发语言·c#
普通网友3 小时前
C++中的适配器模式
开发语言·c++·算法
风闲12173 小时前
Qt源码编译记录
开发语言·qt