接口自动化测试入门: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 | 典型场景 |
|---|---|---|---|
| params | URL 问号后面(查询字符串) | 无 | 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这就是「用少量代码覆盖正常 + 异常场景」的标准写法。
九、新手常见坑汇总
- params / data / json 用错,接口报 400/415
- 忘记保持登录态,用例全部返回未登录
- 不设 timeout,用例卡死
- 只断言状态码,不断言业务数据
- 测试数据写死,用例之间互相污染(后面要学「数据初始化/清理」)
- 断言里直接 resp.json() 不去判断响应是否合法,报错信息看不懂
十、总结与下一步
记住三步:构造请求(选对参数)→ 发送请求(带登录态、设超时)→ 断言响应(状态码 + 业务字段)。