阿发聊测试 · 技术进阶系列
Python接口测试实战:requests库详解
GET/POST/Session/超时/文件上传/代理,一篇文章全掌握
你好,我是阿发。
最近收到一个读者的私信:"阿发,我面试的时候被问到'你用过requests库吗?怎么用它做接口测试?'我只知道get和post,结果被面试官追问了3个问题就卡壳了,最后offer也没拿到。"说实话,这个场景我见过太多了。很多测试工程师只会用requests发个简单的get请求,稍微深入一点的场景比如Session保持、文件上传、超时重试就完全不懂了。而这些恰恰是面试官最爱问的,也是实际工作中最常用的。今天这篇文章,我把requests库从入门到进阶,给你讲得明明白白。
SECTION 01
requests库:接口测试的瑞士军刀
在讲具体用法之前,先说说为什么要学requests。做接口测试,你可能用过Postman、JMeter这些工具。工具好用,但有个问题:工具是给人用的,没法自动化。你总不能每次发版都手动点一遍吧?
requests是Python的一个HTTP请求库,简单、强大、文档齐全。学会它,你就能写自动化测试脚本,让机器替你干活。而且现在几乎所有的接口测试框架(比如pytest+requests)都是基于它的。
一句话总结:requests是接口测试自动化的基石。不会requests,你的接口测试技能就是瘸腿的——只能手动测,不能自动化。
```bash
pip install requests
```
安装完导入就能用。记住一个原则:requests库的设计理念是"让HTTP请求变得简单",所以它的API非常直观。
GET请求是最常见的HTTP方法,用来获取数据。比如查询用户列表、获取商品详情,都是GET请求。
最简单的GET请求
```python
import requests
response = requests.get('https://api.example.com/users')
print(response.text)
```
带参数的GET请求
```python
import requests
# 方式1:直接拼在URL里
response = requests.get('https://api.example.com/users?page=2&size=10')
# 方式2:用params参数(推荐)
params = {'page': 2, 'size': 10}
response = requests.get('https://api.example.com/users', params=params)
```
为什么推荐方式2?
· 代码更清晰:参数和URL分开,一眼就能看到传了什么参数
· 自动编码:如果参数里有中文或特殊字符,requests会自动URL编码
· 方便调试:修改参数只需要改字典,不用动URL
| | |
|---|
| | |
| | |
| | |
| | assert status_code == 200 |
| | |
SECTION 03
POST请求:提交数据的核心方法
表单格式(form-data)
```python
import requests
url = 'https://api.example.com/login'
data = {'username': 'testuser', 'password': '123456'}
response = requests.post(url, data=data)
print(response.json())
```
JSON格式(application/json)
```python
import requests
url = 'https://api.example.com/users'
json_data = {'name': '张三', 'age': 25, 'email': 'zhangsan@example.com'}
response = requests.post(url, json=json_data)
print(response.json())
```
关键区别:data参数提交的是表单格式(application/x-www-form-urlencoded),json参数提交的是JSON格式(application/json)。两者不能混用,否则后端解析不到数据。
文件上传(multipart/form-data)
```python
import requests
url = 'https://api.example.com/upload'
files = {'file': open('test.jpg', 'rb')}
response = requests.post(url, files=files)
print(response.json())
```
SECTION 04
请求头和Cookie:身份认证的关键
设置请求头(Token认证)
```python
import requests
url = 'https://api.example.com/orders'
headers = {
'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',
'Content-Type': 'application/json'
}
response = requests.get(url, headers=headers)
print(response.json())
```
用Session自动管理Cookie(推荐)
```python
import requests
# 创建Session对象
session = requests.Session()
# 第一步:登录,Session会自动保存Cookie
login_data = {'username': 'test', 'password': '123456'}
session.post('https://api.example.com/login', data=login_data)
# 第二步:访问需要登录的接口,Session自动带上Cookie
response = session.get('https://api.example.com/orders')
print(response.json())
```
为什么用Session?:因为手动管理Cookie太麻烦了。登录后Cookie可能会变,或者有多个Cookie,Session会自动帮你处理这些,你不用管Cookie是什么。
SECTION 05
超时设置和异常处理:让脚本更健壮
超时设置
```python
import requests
# 设置总超时时间为10秒
response = requests.get('https://api.example.com/users', timeout=10)
# 分别设置连接超时和读取超时
response = requests.get('https://api.example.com/users', timeout=(3, 7))
```
异常处理
```python
import requests
from requests.exceptions import Timeout, ConnectionError, HTTPError
try:
response = requests.get('https://api.example.com/users', timeout=10)
response.raise_for_status()
data = response.json()
print('请求成功:', data)
except Timeout:
print('请求超时')
except ConnectionError:
print('连接失败')
except HTTPError as e:
print(f'HTTP错误: {e}')
```
```python
import requests
class UserAPITest:
def __init__(self, base_url):
self.base_url = base_url
self.session = requests.Session()
self.session.headers.update({'Content-Type': 'application/json'})
def login(self, username, password):
url = f'{self.base_url}/login'
data = {'username': username, 'password': password}
response = self.session.post(url, json=data, timeout=5)
token = response.json().get('data', {}).get('token')
self.session.headers.update({'Authorization': f'Bearer {token}'})
return response.json()
def create_user(self, user_data):
url = f'{self.base_url}/users'
return self.session.post(url, json=user_data, timeout=5).json()
def get_user(self, user_id):
url = f'{self.base_url}/users/{user_id}'
return self.session.get(url, timeout=5).json()
```
· Q1:requests.get()和requests.Session().get()有什么区别?
Session会自动保存Cookie,复用连接,适合需要保持会话的场景。
· Q2:data参数和json参数有什么区别?
data是表单格式,json是JSON格式。Content-Type分别是application/x-www-form-urlencoded和application/json。
· Q3:response.text和response.json()有什么区别?
text返回字符串,json()返回字典。如果响应不是JSON格式,json()会报错。
· Q4:怎么处理超时和异常?
timeout参数设置超时时间,try-except捕获Timeout、ConnectionError、HTTPError等异常。
最后
requests库不难,难的是把它用在实际场景中。只会发GET和POST不算会用,能处理Cookie、超时、文件上传、并发请求,才算真正掌握了这个工具。希望今天的内容能帮你在面试和工作中游刃有余。
关于接口测试进阶、简历修改、offer选择,都可以通过公众号菜单栏添加我微信 testafa 私信交流。需要学习资料也可以私信!