新闻详情

新闻详情

首页 / 资讯中心 / 详情

Python+requests+pytest接口自动化速成:一天搭建可复用测试框架

发布时间:2026/9/29 1:10:29来源:尧图网络
Python+requests+pytest接口自动化速成:一天搭建可复用测试框架
在团队里带过不少新人也帮很多转行的朋友做过接口自动化的入门辅导我自己的感受是接口自动化这个方向确实是测试和开发岗性价比最高的技能之一。不需要花哨的UI自动化不用纠结复杂的环境部署只要把请求怎么发、响应怎么验、用例怎么组织这三件事跑通你就能把重复的回归工作交给脚本腾出时间去做更有价值的事。这篇内容定位是“速成版”我按照一天能上手的节奏来拆解。目标很明确用 Python requests pytest 这套组合让你从零搭出一个能跑通、能看报告、能每天重复执行的接口自动化项目。你不用把 Python 学到多深也不需要懂框架源码只要照着实操路径走下班前就能看到一串绿色通过的用例。适合三类人刚接触自动化测试的测试工程师、想用脚本辅助联调的后端开发、以及准备面试接口自动化岗位的求职者。1. 速成之前先想明白接口自动化到底在做什么1.1 接口自动化的本质很多初学者上来就搜框架、看源码结果把自己绕晕了。接口自动化的本质其实特别朴素用代码模拟客户端发一个 HTTP 请求到服务器再对服务器返回的响应做校验。它和你在 Postman 里点“Send”做的事一模一样只不过从手动点击变成了脚本执行从肉眼看响应变成了代码断言。整个过程绕不开四个环节构造请求URL、请求头、参数、请求体、发送请求GET、POST、PUT、DELETE、提取响应状态码、响应头、响应体、断言校验业务是否成功、数据是否正确。只要把这四步刻在脑子里后面学的所有框架、所有工具都是为了让这四个环节更高效、更规范。1.2 技术选型为什么是 Python pytest requests接口自动化的主流技术栈其实不止一套。Java 那边有 RestAssured TestNGPostman 也有 Newman 命令行方案。但我带新人的时候一律推荐 Python 组合原因很简单requests 库封装了 HTTP 请求的底层细节发送请求、处理 Cookies、文件上传、SSL 校验都只需一行代码学习成本极低。pytest 是目前 Python 生态里最主流的测试框架断言失败信息清晰fixture 机制能优雅解决登录态、测试数据等公共逻辑还有海量插件支持。Python 本身语法简单就算完全没写过代码照着抄也能很快改出自己需要的脚本。对比 Java 方案Python 少写至少一半的样板代码对比 Postman脚本的灵活性和集成能力完全不在一个量级。对速成来说Python 组合是肉眼可见的最优解。1.3 一天速成的路线图我建议把一天时间切成四段每段只解决一个核心问题千万别混着学。时间段学习内容产出物上午 1-2 小时Python 环境搭建、虚拟环境配置、依赖安装能运行 print(hello) 的干净环境上午 2-3 小时requests 库发送 GET/POST 请求、处理响应数据能对任意接口完成请求和取数下午 3-4 小时断言逻辑、pytest 用例编写、数据驱动第一批可执行的自动化用例晚上 2-3 小时项目结构整理、allure 报告、常见报错排查完整可提交的接口自动化小项目这个路线砍掉了所有“锦上添花”的内容比如 CI 集成、mock 服务、性能测试这些等你跑通基础之后再补。速成的核心是做减法先把主干打通。2. 环境搭建Python、虚拟环境、依赖一次搞定2.1 Python 安装与路径验证很多人一上来就卡在环境上最常见的就是输入 python 之后提示“python was not found; run without arguments to install from the Microsoft Store”。这是 Windows 系统没识别到 Python 命令大多数情况是因为安装时没勾选“Add Python to PATH”。安装的时候记住两件事去官网下载建议选 3.10 或 3.11 版本不要太激进追新安装向导第一页底部一定要勾选“Add Python to PATH”。装完打开命令提示符输入 python --version能输出 Python 3.x.x 就说明环境通了。如果之前没勾选 PATH最快的修复办法是重新运行安装包选择 Modify把 Add Python to PATH 勾上再继续。2.2 虚拟环境每个项目一套依赖接口自动化项目一定要用虚拟环境这是很多速成教程不会强调但极其重要的一步。虚拟环境的作用是给当前项目单独隔离出一套 Python 运行空间你在里面安装的 requests、pytest 不会污染系统全局环境也不会和电脑上其他 Python 项目冲突。创建虚拟环境只需三行命令cd your_project_dir python -m venv venv激活方式分系统# Windows venv\Scripts\activate # macOS / Linux source venv/bin/activate激活成功后命令行前缀会出现 (venv)这时候你 pip install 的所有包都会装到这个项目里。我见过太多人因为没用虚拟环境把包装得乱七八糟最后项目换个电脑就跑不起来。这一步值得养成肌肉记忆。2.3 安装核心依赖与编辑器配置激活虚拟环境后一次性把依赖装齐pip install requests pytest pytest-html allure-pytest如果你的网络环境下载慢可以临时切换镜像源pip install requests pytest pytest-html allure-pytest -i https://pypi.tuna.tsinghua.edu.cn/simple编辑器我推荐 VSCode 或 PyCharm二选一即可。VSCode 需要装 Python 扩展然后用命令面板CtrlShiftP执行“Python: Select Interpreter”选你创建好的 venv 目录下的 python.exe。这一步如果漏了你会发现运行脚本时提示 ModuleNotFoundError因为编辑器还在用全局解释器。注意网上很多教程会让你顺便装一堆库比如 pandas、cv2。速成阶段千万别装接口自动化用不到装多了只会增加环境出问题的概率。3. 从 0 到 1用 requests 发送请求并处理响应3.1 三步跑通 GET 和 POST 请求requests 库的核心用法就两个方法requests.get() 和 requests.post()。先说 GET它负责从服务器获取数据参数直接拼在 URL 后面或者用 params 字典传import requests url https://api.example.com/user/list params {page: 1, size: 20} resp requests.get(url, paramsparams) print(resp.status_code) print(resp.json())POST 一般用来提交数据、创建资源请求体常用 JSON 格式。只需要一个 json 参数requests 会自动帮你把字典序列化成 JSON 并设置 Content-Type 头import requests url https://api.example.com/user/login payload {username: test_user, password: 123456} resp requests.post(url, jsonpayload) print(resp.status_code) print(resp.text)这里有个容易踩的坑有些人习惯用 data{key: value} 传参那样请求体会被编码成表单格式application/x-www-form-urlencoded如果后端接口声明的是接收 JSON就会解析失败。所以记住规则接口要 JSON 就传 json接口要表单就传 data拿不准就看接口文档或问开发。3.2 处理接口依赖Token、Session 与 Cookie真实项目里很少有能直接调通的接口大量接口都需要先登录拿凭证。最常见的场景是调用登录接口拿到 token然后后续所有请求都在请求头里带上 Authorization 字段。import requests # 第一步登录获取 token login_url https://api.example.com/login login_data {username: admin, password: admin123} token_resp requests.post(login_url, jsonlogin_data) token token_resp.json()[data][token] print(token:, token) # 第二步携带 token 请求业务接口 user_url https://api.example.com/user/info headers {Authorization: fBearer {token}} resp requests.get(user_url, headersheaders) print(resp.json())另一个常用技巧是 session 对象。如果你的接口依赖 Cookie 保持登录态用 requests.Session() 创建会话登录一次后后续请求会自动携带服务器返回的 Cookiesession requests.Session() session.post(https://api.example.com/login, jsonlogin_data) resp session.get(https://api.example.com/dashboard)实测下来用 session 比手动维护 Cookie 字典省心得多尤其是涉及多个接口连续调用的用例。3.3 上传文件、超时和 SSL 细节接口自动化的范围不只是普通 JSON 接口还会碰到文件上传接口。requests 上传文件用的是 files 参数服务器那边收到的是 multipart/form-data 格式files {file: open(report.xlsx, rb)} resp requests.post(https://api.example.com/api/upload, filesfiles) print(resp.json())我强烈建议每个请求都加上 timeout 参数比如 requests.get(url, timeout10)。不设超时意味着脚本会一直等服务器响应一旦服务器异常整个自动化任务就卡死在那个请求上后面所有用例全部超时。设了超时至少能在预期时间内失败并继续执行。另外测试环境经常用自签名 HTTPS 证书直接请求会报 SSLError。标准做法是加 verifyFalserequests 会跳过证书校验。同时为了避免告警刷屏加一行import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) resp requests.get(url, timeout10, verifyFalse)3.4 从响应里快速提取数据接口返回的 JSON 可能层级很深取数之前建议先打印 resp.json() 观察结构然后一层层往下取。比如返回格式是 {code: 0, data: {list: [{id: 1, name: 张三}, {id: 2, name: 李四}]}}想拿用户列表里第一个人的名字data resp.json() first_name data[data][list][0][name] print(first_name)这里有一个速成阶段最常见的报错KeyError 或 IndexError。原因无非是返回结果里根本没有你预期的字段或者列表是空的。所以取数之前养成一个好习惯先断言 resp.status_code 和 resp.json()[code] 是否符合预期再取业务数据这样定位问题会快很多。4. 接口自动化的灵魂断言规范4.1 断言到底该断什么很多人写接口自动化断言的粒度非常随意只检查状态码是 200 就结束。这等于考试只写名字没写答案。真正有效的断言需要覆盖五个层面断言层级校验内容示例状态码层HTTP 协议层是否正常status_code 200业务码层业务是否成功json()[code] 0关键字段层核心数据是否返回json()[data][token] 不为空数据正确性层数据内容和预期一致json()[data][total] 10性能兜底层响应时间是否达标resp.elapsed.total_seconds() 2从第一层到第五层断言粒度越来越细。日常工作中至少要做前四层接口涉及分页查询时再补一层响应时间校验防止接口越写越慢还没人发现。4.2 断言写法的几个门道pytest 里最直接的断言就是 Python 原生 assert失败后 pytest 会打印出具体的断言表达式和值排查问题非常高效def test_get_user_list(): resp requests.get(https://api.example.com/user/list, timeout10) assert resp.status_code 200 assert resp.json()[code] 0 assert len(resp.json()[data][list]) 0一个容易踩的坑是断言失败后后面的断言不会继续执行。如果你希望一个用例里所有断言全部跑一遍、把每个失败项都展示出来可以用 pytest-assume 插件import pytest def test_multi_assert(): resp requests.get(https://api.example.com/user/list, timeout10) json_data resp.json() pytest.assume(resp.status_code 200) pytest.assume(json_data[code] 0) pytest.assume(json_data[data][total] 10)如果你要校验响应体的完整 JSON 结构推荐用 jsonschema 库它能根据预定义的 schema 一次性校验字段名、字段类型、是否必填适合接口返回结构复杂的场景。4.3 数据驱动一套用例跑多组数据真实接口测试绝不能只跑一组数据登录接口至少得覆盖正确密码、错误密码、空账号、不存在账号这些场景。如果每个场景写一个用例函数代码会冗余到没法维护。pytest 的 pytest.mark.parametrize 就是干这个的import pytest import requests pytest.mark.parametrize(username, password, expected_code, [ (admin, admin123, 0), # 正常登录 (admin, wrong, 1001), # 密码错误 (, admin123, 1002), # 账号为空 (nobody, admin123, 1003), # 账号不存在 ]) def test_login(username, password, expected_code): resp requests.post( https://api.example.com/login, json{username: username, password: password}, timeout10, ) assert resp.json()[code] expected_code这样一组参数就是一条用例pytest 会把每组参数独立运行失败时能精准定位到具体是哪组数据挂了。数据量小可以直接写在装饰器里数据量大就抽到 JSON 或 YAML 文件里用代码动态读取加载测试代码一行都不用改。5. 用 pytest 组织用例形成工程化结构5.1 速成版项目目录结构学了 requests 和断言你已经会写“一次性脚本”了。但做自动化项目还差最后一步把散落的脚本整理成一个有结构的工程。这是我推荐的最简目录结构api_test_project/ ├── venv/ # 虚拟环境 ├── config/ │ └── config.yaml # 环境地址、账号配置 ├── common/ │ └── requests_util.py # 封装请求、统一打印日志 ├── testcases/ │ ├── conftest.py # fixture 公共逻辑 │ ├── test_login.py │ └── test_user.py ├── reports/ # 测试报告输出目录 ├── pytest.ini # pytest 配置文件 └── requirements.txt # 依赖清单很多教程动辄几十个目录搞一堆 base、core、utils速成阶段完全没必要。目录不在多在于职责清晰config 管配置common 管公共方法testcases 管用例reports 管结果。后面项目复杂了再拆分也不迟。5.2 conftest.py 和 fixture登录态不用重复写如果每个用例文件开头都写一遍“登录拿 token”你就成了一个合格的复制粘贴机器。pytest 的 fixture 机制可以把这个公共逻辑抽出来自动注入到需要它的用例里。在 testcases/conftest.py 里定义一个全局 fixtureimport pytest import requests pytest.fixture(scopesession) def auth_token(): 所有用例只登录一次返回 token resp requests.post( https://api.example.com/login, json{username: admin, password: admin123}, timeout10, ) token resp.json()[data][token] return token用例函数只需要在参数里声明 auth_tokenpytest 会自动执行这个 fixture 并把返回值传进来def test_get_user_info(auth_token): headers {Authorization: fBearer {auth_token}} resp requests.get(https://api.example.com/user/info, headersheaders, timeout10) assert resp.json()[code] 0fixture 还有个好处scopesession 意味着整个测试会话只登录一次不是每条用例都登录执行效率高很多。对于“登录一次到处使用”的场景这个方案是最优解。5.3 关键配置文件与 pytest 常用配置环境地址和账号密码不应该写死在代码里。最简单的方式是用 config.yaml需要装 PyYAMLbase_url: https://api.example.com user: username: admin password: admin123 headers: Content-Type: application/json代码里读取import yaml with open(../config/config.yaml, encodingutf-8) as f: config yaml.safe_load(f) base_url config[base_url]pytest.ini 里也可以配一些默认参数比如让 pytest 从 testcases 目录找用例、控制控制台输出格式[pytest] testpaths testcases addopts -v -s --alluredirreports/allure_results配好之后你只需要在项目根目录执行 pytest 回车所有用例就会自动开始跑。5.4 生成 Allure 报告一天速成里最让人有成就感的一步就是看到一份像样的测试报告。Allure 是目前最主流的测试报告工具pytest 通过 allure-pytest 插件集成命令上一步已经写进 pytest.ini 了。跑完用例后执行allure generate reports/allure_results -o reports/allure_report --clean allure open reports/allure_report浏览器会自动弹出报告页面里面有每个用例的执行结果、耗时、失败信息、参数组合还可以按功能模块筛选。但我得说句实话Allure 第一次配置时allure 命令行工具本身需要额外安装Windows 上建议用 scoop 或直接下载 zip 包解压后配置环境变量。如果时间实在紧张可以先用 pytest-html 生成的简单 HTML 报告顶一下Allure 作为后续进阶项。6. 速成阶段的高频报错与排查技巧6.1 高频报错速查表我在带新人过程中发现接口自动化的报错其实高度集中翻来覆去就那么几类。整理成一个速查表你遇到问题直接对着查就行。报错信息常见原因解决动作ModuleNotFoundError: No module named requests解释器选错或未安装依赖切换虚拟环境解释器重新 pip install requestsConnectionError接口地址错误、网络不通、服务未启动先浏览器或 Postman 确认接口可用再检查 URLSSLError / CERTIFICATE_VERIFY_FAILED自签名证书临时加 verifyFalse 并关闭告警JSONDecodeError响应不是 JSON比如返回了 HTML 或空内容先打印 resp.text 确认返回内容再决定是否转 JSONKeyError: token响应里没有这个字段打印完整 JSON确认字段路径是否正确或业务失败导致无 tokentimeout 超时服务器处理慢或请求未设置 timeout排查接口性能给请求合理设置 timeout6.2 响应不是 JSON 怎么办明明接口文档写返回 JSON脚本却报 JSONDecodeError这是新手最懵的场景。这时候别慌先打印响应体原始文本看看到底返回了什么resp requests.get(url, timeout10) print(resp.status_code) print(resp.text) print(resp.headers.get(Content-Type))常见的几种情况一是接口返回了错误页面的 HTML说明 URL 或请求方式不对二是接口返回了空字符串大概率是参数没传对三是返回了纯文本或 XML这种情况需要拿到对象后用 resp.text 做包含断言。记住一条铁律遇到任何解析错误先看原始响应不要脑补。6.3 “登录态失效”的经典排查思路用例跑着跑着突然全部报 401 或者提示未登录这种情况几乎所有做接口自动化的人都遇到过。按照我下面的顺序排查基本五分钟内能定位先检查 token 是否过期。很多测试环境的 token 有效期只有两小时脚本跑太久或者 fixture 缓存了过期 token重新登录即可。检查请求头是否真的带上了 token。打印一下你拼好的 headers确认不是变量引用错误导致 Authorization 字段没传。检查后端期望的 token 类型。有的接口要 Bearer xxxx有的只要 xxxx还有的要 Token xxxx一个字符都不能差。检查请求头字段名。后端期望的可能是 X-Access-Token、Authorization 或 token大小写都敏感看接口文档确认。排查完记得把结论固化到代码里比如在 fixture 里判断 token 过期状态自动触发重新登录这种自愈机制能让整个项目的稳定性上一个台阶。写在最后的一点经验按这套路径走下来你手里的成果已经不是一个脚本而是一个有目录结构、有公共逻辑、有报告输出的迷你接口自动化框架。这个框架虽然简单但接口自动化的核心能力全都在里面了。我个人带人的时候一直强调学接口自动化不要贪多先把“发请求、做断言、组织用例”这三板斧练扎实后面无论学 pytest 高级用法、接 CI 流水线还是做全链路自动化都是在这套骨架上添砖加瓦。遇到问题多打印响应、多看文档、多想一步后端为什么返回这个结果你已经比大多数只会点 Postman 的人走得远了。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

VC2010Express中文版2025年使用指南:安装配置与C++编译实战 2026/9/29 2:02:00

VC2010Express中文版2025年使用指南:安装配置与C++编译实战

简介:Visual C 2010 Express 简体中文离线独立安装包,面向刚接触 C 编程的初学者、高校学生以及需要搭建本地开发环境的教学人员。它解决的是在线安装受网络波动影响、组件下载不全的问题,一次解压即可在无网或弱网环境下完成部署&#xff0c…

阅读更多 →
电机PID控制实战:从原理到单片机PWM实现 2026/9/29 2:02:00

电机PID控制实战:从原理到单片机PWM实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Vue3进阶实战:手写响应式内核、路由权限与Pinia工程化 2026/9/29 2:01:53

Vue3进阶实战:手写响应式内核、路由权限与Pinia工程化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
STM32CubeMX 6.14下载安装到工程生成完整避坑指南 2026/9/29 2:01:47

STM32CubeMX 6.14下载安装到工程生成完整避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
龙芯1B LoongIDE安装与交叉编译环境搭建指南 2026/9/29 2:01:47

龙芯1B LoongIDE安装与交叉编译环境搭建指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
RK3568 eDP链路训练失败排查与修复实战指南 2026/9/29 2:01:47

RK3568 eDP链路训练失败排查与修复实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉