一、前置准备:环境搭建与验证
1. 基础环境要求
已安装Python环境(建议3.8及以上版本),确保pip包管理器可用,避免版本兼容问题。
2. 安装核心依赖库
本次实战需要两个核心库:requests(发送HTTP/HTTPS接口请求)和pytest(接口测试用例管理、执行、断言),打开终端(Windows用CMD,Mac/Linux用终端)执行安装命令,网络不佳可使用国内镜像源加速。
# 常规安装(同时安装requests和pytest)
pip install requests pytest# 国内清华镜像源加速安装(解决下载慢、超时问题)
pip install requests pytest -i https://pypi.tuna.tsinghua.edu.cn/simple# 可选:安装指定稳定版本(避免最新版本兼容问题)
pip install requests==2.31.0 pytest==7.4.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
3. 验证安装是否成功
终端输入以下命令,若能显示对应版本号,说明安装完成且环境可用:
# 验证requests版本
pip show requests# 验证pytest版本
pytest --version
二、核心1:requests库入门——发送各类接口请求
requests库封装了复杂的HTTP底层实现,只需简单几行代码即可发送GET、POST等常见接口请求,同时方便解析响应结果。本文选用公开可访问的测试接口(httpbin.org)进行演示,无需额外搭建接口服务,新手可直接复制代码运行。
1. 发送GET请求(带/不带请求参数)
GET请求常用于查询数据,参数可直接拼接在URL后,也可通过params参数传递(推荐,自动处理编码问题)。
# 导入requests库
import requestsdef test_get_request():# 1. 不带参数的GET请求url1 = "https://httpbin.org/get"response1 = requests.get(url=url1)# 2. 带参数的GET请求(推荐使用params传递,自动拼接URL)url2 = "https://httpbin.org/get"params_data = {"name": "zhangsan","age": 25,"city": "Beijing"}response2 = requests.get(url=url2, params=params_data)# 3. 解析响应结果(接口测试核心:获取响应数据用于后续断言)print("=== 不带参数GET请求响应结果 ===")print("响应状态码:", response1.status_code) # 响应状态码(200表示成功)print("响应头信息:", response1.headers) # 响应头print("响应正文(原始格式):", response1.text) # 原始响应正文(字符串格式)print("响应正文(JSON格式):", response1.json()) # 解析为JSON格式(接口返回JSON时首选)print("\n=== 带参数GET请求响应结果 ===")print("响应状态码:", response2.status_code)print("实际请求URL:", response2.url) # 查看自动拼接后的完整URLprint("响应正文(JSON格式):", response2.json())
2. 发送POST请求(表单格式/JSON格式)
POST请求常用于提交数据,核心区分两种请求体格式:application/x-www-form-urlencoded(表单格式)和application/json(JSON格式,目前接口开发主流)。
import requestsdef test_post_request():# 1. 发送表单格式(form-data)的POST请求url1 = "https://httpbin.org/post"form_data = {"username": "test_user","password": "123456","gender": "male"}response1 = requests.post(url=url1, data=form_data)# 2. 发送JSON格式的POST请求(推荐,目前大多数接口采用此格式)url2 = "https://httpbin.org/post"json_data = {"user_id": 1001,"nickname": "小张","hobbies": ["reading", "running", "coding"],"address": {"province": "Beijing","district": "Chaoyang"}}# 用json参数传递数据,requests会自动设置请求头Content-Type为application/jsonresponse2 = requests.post(url=url2, json=json_data)# 解析响应结果print("=== 表单格式POST请求响应结果 ===")print("响应状态码:", response1.status_code)print("响应正文(JSON格式):", response1.json())print("\n=== JSON格式POST请求响应结果 ===")print("响应状态码:", response2.status_code)print("响应正文(JSON格式):", response2.json())
3. 核心补充:请求头设置与超时控制
实际接口测试中,常需要设置请求头(如User-Agent、Token鉴权)和超时时间(避免接口长时间无响应阻塞测试)。
import requestsdef test_request_with_header_and_timeout():url = "https://httpbin.org/headers"# 1. 设置请求头(模拟浏览器、携带Token鉴权等)headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36","Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", # 模拟Token鉴权"Content-Type": "application/json"}# 2. 设置超时时间(单位:秒),超过5秒无响应则抛出异常try:response = requests.get(url=url, headers=headers, timeout=5)print("请求成功!")print("响应状态码:", response.status_code)print("响应正文(JSON格式):", response.json())except requests.exceptions.Timeout:print("请求超时!接口响应时间超过5秒")
三、核心2:pytest框架入门——管理接口测试用例
pytest是Python主流的测试框架,支持用例自动发现、断言简化、前后置处理、测试报告生成等功能,核心掌握用例规范和基础用法,即可满足接口自动化测试需求。
1. pytest测试用例编写规范(必守)
pytest会自动识别符合以下规范的用例,无需额外配置,新手务必牢记:
- 测试文件以
test_开头(如test_api.py)或_test.py结尾。 - 测试函数以
test_开头(如test_get_user_info())。 - 测试类以
Test开头(首字母大写,无__init__方法),测试方法以test_开头。 - 断言使用Python原生
assert语句,简洁高效。
2. 基础用例编写:单个接口测试(含断言)
接口自动化测试的核心是“断言验证”,即判断接口响应结果是否符合预期(如状态码是否为200、响应数据字段是否正确等),以下是完整的单个接口测试用例。
# 文件名:test_api_demo.py(符合pytest用例文件规范)
import requests# 测试函数(以test_开头,符合pytest用例规范)
def test_get_user_info():"""测试GET接口——查询用户信息(示例)"""# 1. 接口请求配置url = "https://httpbin.org/get"params = {"name": "zhangsan", "age": 25}headers = {"User-Agent": "Python-Requests/2.31.0"}# 2. 发送接口请求response = requests.get(url=url, params=params, headers=headers, timeout=5)# 3. 断言验证(核心:判断响应结果是否符合预期)# 断言1:响应状态码为200(接口请求成功)assert response.status_code == 200, f"接口请求失败,状态码:{response.status_code}"# 断言2:实际请求URL中包含预期参数(验证参数是否正确传递)assert "name=zhangsan" in response.url, "URL中未包含预期参数name=zhangsan"assert "age=25" in response.url, "URL中未包含预期参数age=25"# 断言3:响应JSON数据中,args字段包含预期的用户信息response_json = response.json()assert response_json["args"]["name"] == "zhangsan", "响应数据中name字段值不符合预期"assert response_json["args"]["age"] == "25", "响应数据中age字段值不符合预期"print("所有断言通过,接口测试成功!")
3. 用例执行:终端命令与结果查看
- 打开终端,进入测试文件所在目录。
- 执行以下核心命令(二选一):
# 基础执行:运行所有符合规范的测试用例
pytest# 详细执行:显示用例执行详情(推荐,便于排查问题)
pytest -v# 指定文件执行:只运行test_api_demo.py中的用例
pytest test_api_demo.py -v
- 执行结果解读:
- 绿色
.表示用例执行成功。 - 红色
F表示用例执行失败(断言不通过或代码报错)。 - 最终会显示用例总数、成功数、失败数、执行时间。
- 绿色
4. 前后置处理:用例的初始化与清理(setup/teardown)
实际测试中,常需要统一做前置处理(如获取登录Token、初始化测试数据)和后置处理(如清理测试数据、关闭连接),pytest支持函数级和类级的前后置方法。
# 文件名:test_api_with_setup_teardown.py
import requestsdef setup_function():"""函数级前置处理:每个测试函数执行前都会运行"""print("\n=== 前置处理:获取登录Token,初始化测试数据 ===")# 此处可添加实际的登录逻辑,获取Token并保存(如存入全局变量、配置文件等)global token # 全局变量,供测试函数使用token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."print(f"获取到Token:{token}")def teardown_function():"""函数级后置处理:每个测试函数执行后都会运行"""print("=== 后置处理:清理测试数据,关闭连接 ===")# 此处可添加实际的清理逻辑(如删除测试创建的用户、订单等)print("测试数据清理完成")# 测试函数1
def test_get_user_info():"""测试查询用户信息接口"""url = "https://httpbin.org/get"headers = {"Authorization": f"Bearer {token}"}response = requests.get(url=url, headers=headers, timeout=5)# 断言assert response.status_code == 200print("查询用户信息接口测试通过")# 测试函数2
def test_post_user_data():"""测试提交用户数据接口"""url = "https://httpbin.org/post"json_data = {"user_id": 1001, "nickname": "小张"}headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}response = requests.post(url=url, json=json_data, headers=headers, timeout=5)# 断言assert response.status_code == 200print("提交用户数据接口测试通过")
四、实战整合:requests+pytest实现多接口自动化测试
以下是完整的实战案例,包含多个接口用例、参数化设计(减少冗余代码),模拟实际项目中的接口测试场景,可直接复制运行。
1. 实战案例:用户模块接口自动化测试
# 文件名:test_user_module_api.py
import requests
import pytest# 定义测试数据(参数化使用,减少冗余代码)
test_data = [("zhangsan", 25, 200), # 用例1:正常参数("lisi", 30, 200), # 用例2:正常参数("", 22, 200) # 用例3:用户名为空(模拟边界场景)
]@pytest.mark.parametrize("name, age, expected_code", test_data)
def test_get_user_list(name, age, expected_code):"""用户列表查询接口测试(参数化版本,批量运行多组用例)"""# 1. 接口配置url = "https://httpbin.org/get"params = {"name": name, "age": age}headers = {"User-Agent": "Python-Requests/2.31.0","Content-Type": "application/json"}# 2. 发送请求response = requests.get(url=url, params=params, headers=headers, timeout=5)# 3. 断言验证# 断言1:响应状态码符合预期assert response.status_code == expected_code, f"状态码不符合预期,实际:{response.status_code},预期:{expected_code}"# 断言2:响应数据中的参数与请求参数一致(非空场景)if name:assert response.json()["args"]["name"] == name, "用户名响应数据不符合预期"assert response.json()["args"]["age"] == str(age), "年龄响应数据不符合预期"print(f"用例(name={name}, age={age})测试通过")def test_create_user():"""创建用户接口测试(JSON格式POST请求)"""# 1. 接口配置url = "https://httpbin.org/post"json_data = {"username": "test_auto_user","password": "123456","age": 28,"gender": "male"}headers = {"Content-Type": "application/json"}# 2. 发送请求response = requests.post(url=url, json=json_data, headers=headers, timeout=5)# 3. 断言验证assert response.status_code == 200assert response.json()["json"]["username"] == "test_auto_user"assert response.json()["json"]["age"] == 28print("创建用户接口测试通过")
2. 执行实战用例并查看结果
终端执行命令:
pytest test_user_module_api.py -v
执行成功后,会看到3组参数化用例+1个创建用户用例全部通过,终端输出详细的执行日志,便于后续排查问题。
五、进阶优化:生成美观的HTML测试报告
实际工作中,需要向团队提交可视化的测试报告,pytest-html插件可生成清晰美观的HTML格式报告,步骤如下:
1. 安装pytest-html插件
pip install pytest-html -i https://pypi.tuna.tsinghua.edu.cn/simple
2. 生成HTML测试报告
终端执行以下命令,运行用例并生成报告:
# 生成HTML报告,指定报告保存路径(report.html为报告文件名,可自定义)
pytest test_user_module_api.py -v --html=report.html
3. 查看测试报告
执行完成后,在测试文件所在目录会生成report.html文件,用浏览器打开即可查看完整报告,包含用例总数、成功数、失败数、执行时间、详细日志等信息,可直接分享给团队成员。
六、常见问题与注意事项
- 接口请求超时:务必设置
timeout参数(推荐3-10秒),避免无响应阻塞测试。 - JSON解析报错:使用
response.json()前,先确认接口返回的是合法JSON格式,否则会抛出JSONDecodeError。 - 鉴权失败:检查Token是否有效、请求头中Token格式是否正确(如是否包含
Bearer前缀)。 - 用例不被识别:严格遵守pytest用例编写规范(文件名、函数名/类名格式)。
- 中文乱码:HTML报告中文乱码可在生成命令中添加编码配置,或修改报告模板编码。
- 重复执行问题:接口测试尽量保证“幂等性”(多次执行同一用例,结果一致),避免创建重复数据。