接口自动化测试入门:requests 必会知识点与常见坑

发布时间:2026/11/3 10:39:59
接口自动化测试入门:requests 必会知识点与常见坑

前言

接口自动化是测试开发岗位的入门基本功,而 Python 里做接口测试绕不开 requests。它语法很简单,但新手最容易在参数传递上踩坑:params、data、json 三个参数长得像,用错了接口就开始报
400。这篇把必备知识点和坑一次讲清。

一、为什么先学接口测试

  • 接口测试不依赖界面,跑得快、稳定,是自动化测试的「性价比之王」
  • 公司招聘测试开发,基本都要求会写接口自动化
  • 会接口测试之后再学 UI 自动化(Selenium/Playwright)会轻松很多

二、requests 的四种基础请求

importrequests requests.get(url,params={...})# 查询requests.post(url,json={...})# 新增/登录requests.put(url,json={...})# 修改requests.delete(url)# 删除

三、核心知识点:params / data / json 的区别

这是接口测试最高频的坑,务必分清:

参数放在哪里Content-Type典型场景
paramsURL 问号后面(查询字符串)无GET 请求带查询条件
data请求体,表单格式application/x-www-form-urlencoded老式表单提交
json请求体,JSON 格式application/json现代 REST 接口
# GET 查询requests.get("http://api/user",params={"name":"tom"})# → http://api/user?name=tom# POST 表单requests.post("http://api/login",data={"username":"tom","password":"123"})# POST JSON(现在最常见)requests.post("http://api/login",json={"username":"tom","password":"123"})

▎ 坑点:接口文档写的是 application/json,你用了 data,服务端解析不到参数,直接返回 400 或 415。反过来,老接口要表单你传了 json,也会失败。先看文档的 Content-Type,再决定用哪个参数。

四、响应处理与断言

resp=requests.get("http://api/user/1")resp.status_code# 状态码,如 200resp.headers# 响应头resp.text# 文本,strresp.json()# 解析为 dict(响应不是合法 JSON 会抛异常)

自动化测试必须断言,常见的断言维度:

assertresp.status_code==200body=resp.json()assertbody["code"]==0assertbody["data"]["name"]=="tom"assert"token"inbody["data"]

▎ 建议:不仅断言业务 code,也要断言关键字段的值和类型,否则接口「返回成功但数据错了」也测不出来。

五、保持登录态:Session 与 token

两种主流方式:

# 方式一:Session 自动管理 cookiesession=requests.Session()session.post("http://api/login",json={"username":"tom","password":"123"})resp=session.get("http://api/profile")# 自动带上 cookie# 方式二:手动带 token(更常见)token=requests.post("http://api/login",json={...}).json()["token"]headers={"Authorization":f"Bearer{token}"}requests.get("http://api/profile",headers=headers)

▎ 坑点:requests.get() 每次都是全新会话,第一次登录拿的 cookie 不会自动带到下一次请求,必须用 Session 或手动传 headers。

六、超时设置(生产必备)

resp=requests.get(url,timeout=5)# 5 秒超时resp=requests.get(url,timeout=(3,10))# (连接超时, 读取超时)

不设超时,接口卡死时你的自动化会一直挂着。面试问到「接口测试要注意什么」,「设置超时」是加分点。

七、文件上传

files={"file":open("test.png","rb")}requests.post("http://api/upload",files=files)

注意必须用 二进制模式 rb 打开文件。

八、结合 pytest 做参数化

importpytest,requests@pytest.mark.parametrize("username, password, expect_code",[("tom","123456",0),("tom","wrong",1001),("","123456",1002),])deftest_login(username,password,expect_code):resp=requests.post("http://api/login",json={"username":username,"password":password})assertresp.json()["code"]==expect_code

这就是「用少量代码覆盖正常 + 异常场景」的标准写法。

九、新手常见坑汇总

  1. params / data / json 用错,接口报 400/415
  2. 忘记保持登录态,用例全部返回未登录
  3. 不设 timeout,用例卡死
  4. 只断言状态码,不断言业务数据
  5. 测试数据写死,用例之间互相污染(后面要学「数据初始化/清理」)
  6. 断言里直接 resp.json() 不去判断响应是否合法,报错信息看不懂

十、总结与下一步

记住三步:构造请求(选对参数)→ 发送请求(带登录态、设超时)→ 断言响应(状态码 + 业务字段)。