PythonRequests实战电商API自动化测试从入门到精通引言为什么选择API自动化测试作为起点刚接触自动化测试的开发者常常被复杂的UI自动化框架吓退——元素定位不稳定、浏览器兼容性问题、执行速度慢等问题让人望而生畏。其实API测试才是自动化测试的最佳切入点。根据2023年测试行业调查报告显示80%的业务逻辑缺陷其实都集中在后端接口层而API测试具有执行速度快比UI测试快10倍以上、稳定性高、维护成本低等显著优势。本文将带你用Python生态中最轻量级的Requests库对电商系统核心业务流程登录→购物车操作→支付进行完整测试。不同于传统手工测试文档我们会直接编写可运行的测试代码让你在30分钟内就能获得第一个自动化测试成果。特别适合有以下需求的读者功能测试人员想转型自动化测试但不知从何入手开发人员需要快速验证自己编写的接口是否符合预期技术负责人希望建立基础的自动化测试能力1. 环境准备与工具链搭建1.1 基础环境配置开始前请确保已安装Python 3.8推荐使用3.10稳定版pip最新版本python -m pip install --upgrade pip任意主流IDEVS Code/PyCharm安装核心依赖库pip install requests pytest pytest-html1.2 接口测试辅助工具工欲善其事必先利其器推荐安装Postman用于初步接口调试Charles/Fiddler抓包分析接口细节JSON格式化工其快速格式化接口响应提示电商系统推荐使用开源项目Tpshop作为测试目标其API文档规范且完全开源2. 电商API测试核心方法论2.1 接口测试四要素一个完整的接口测试需要关注要素说明示例请求方法GET/POST/PUT/DELETE等POST请求地址接口URL/api/user/login请求参数Query/Header/Body参数{mobile:13800138000}预期响应状态码响应体结构200 OK token字段2.2 测试脚本设计原则# 优秀测试脚本的特征 def test_api(): # 1. 准备测试数据隔离生产环境 test_data generate_test_data() # 2. 发送请求并记录耗时 start time.time() response send_request(test_data) latency time.time() - start # 3. 多维度断言 assert response.status_code 200 assert response.json()[code] 200 assert token in response.json().get(data, {}) assert latency 1.0 # 性能断言 # 4. 清理测试数据 clean_up(test_data)3. 登录接口深度测试实战3.1 获取接口规范通过抓包或文档获取登录接口详情请求方法POST请求地址/api/user/login请求头Content-Type: application/json请求体{ mobile: 13800138000, password: 123456, verify_code: 8888 }3.2 编写基础测试用例import requests def test_login_success(): url http://demo.tpshop.com/api/user/login headers {Content-Type: application/json} payload { mobile: 13800138000, password: 12345678, verify_code: 8888 } response requests.post(url, jsonpayload, headersheaders) # 断言响应状态码 assert response.status_code 200 # 断言业务状态码 response_data response.json() assert response_data[code] 200 # 断言返回token不为空 assert len(response_data[data][token]) 0 # 返回token供后续测试使用 return response_data[data][token]3.3 异常场景测试完善的登录测试应覆盖参数异常测试手机号格式错误密码为空验证码错误业务异常测试账号不存在密码错误账号被锁定安全测试频繁登录限制密码加密传输错误信息模糊化pytest.mark.parametrize(mobile,password,verify_code,expected, [ (123, 123456, 8888, 手机号格式错误), # 错误手机号 (13800138000, , 8888, 密码不能为空), # 空密码 (13800138000, 123456, 9999, 验证码错误) # 错误验证码 ]) def test_login_failure(mobile, password, verify_code, expected): response requests.post(login_url, json{ mobile: mobile, password: password, verify_code: verify_code }) assert response.json()[msg] expected4. 购物车业务链测试4.1 购物车接口分析典型购物车操作流程添加商品到购物车 →POST /api/cart/add修改商品数量 →POST /api/cart/update删除购物车商品 →POST /api/cart/delete获取购物车列表 →GET /api/cart/list4.2 保持会话状态电商系统通常采用token鉴权需要在请求头中携带headers { Content-Type: application/json, Authorization: fBearer {token} # 使用登录返回的token }4.3 购物车测试脚本示例def test_cart_workflow(): # 先登录获取token token test_login_success() # 添加商品到购物车 add_response requests.post( http://demo.tpshop.com/api/cart/add, json{goods_id: 1, goods_num: 2}, headers{Authorization: fBearer {token}} ) assert add_response.json()[code] 200 # 验证购物车列表 list_response requests.get( http://demo.tpshop.com/api/cart/list, headers{Authorization: fBearer {token}} ) cart_items list_response.json()[data] assert len(cart_items) 0 assert cart_items[0][goods_id] 15. 支付流程模拟测试5.1 支付接口特殊性支付接口测试需要特别注意金额精度避免浮点数计算问题幂等性防止重复支付状态一致性支付成功后的订单状态同步5.2 测试支付流程def test_payment_process(): # 1. 登录 token test_login_success() # 2. 创建测试订单 order_response requests.post( http://demo.tpshop.com/api/order/create, json{cart_ids: 1,2, pay_code: wechat}, headers{Authorization: fBearer {token}} ) order_sn order_response.json()[data][order_sn] # 3. 模拟支付 pay_response requests.post( http://demo.tpshop.com/api/payment/pay, json{order_sn: order_sn, pay_amount: 0.01}, headers{Authorization: fBearer {token}} ) assert pay_response.json()[code] 200 # 4. 验证订单状态 order_detail requests.get( fhttp://demo.tpshop.com/api/order/detail?order_sn{order_sn}, headers{Authorization: fBearer {token}} ) assert order_detail.json()[data][order_status] 1 # 已支付5.3 支付异常测试必须覆盖的异常场景余额不足重复支付订单已取消网络超时6. 测试进阶技巧6.1 测试数据管理推荐使用Faker库生成测试数据from faker import Faker fake Faker() def generate_user(): return { mobile: fake.phone_number(), password: fake.password(length10), verify_code: 8888 }6.2 测试报告生成使用pytest-html生成美观的测试报告pytest test_api.py --htmlreport.html --self-contained-html6.3 性能基准测试def test_login_performance(): start_time time.time() for _ in range(100): test_login_success() elapsed time.time() - start_time assert elapsed 10 # 100次登录应在10秒内完成