Python接口自动化测试实战:Requests+Pytest从入门到CI落地

发布时间:2026/9/4 2:22:25
Python接口自动化测试实战:Requests+Pytest从入门到CI落地 接口自动化这些年迭代下来技术栈其实已经很稳定。新手选型经常纠结“Java 还是 Python”“框架怎么写才高级”实际到了项目中最常用、最容易被团队接受的一条路还是 Python Requests Pytest再接到持续集成里做定时回归。今天这条分享不会只讲概念而是把“6 小时搞懂接口自动化”这条路线需要掌握的内容完整过一遍环境怎么搭、Requests 怎么发请求、Pytest 怎么组织用例、数据驱动怎么做、批量任务怎么跑、CI 怎么接入以及最常见的 429 限流、连接失败、用例不收集这类问题怎么排查。如果你正准备从手工测试转向自动化测试或者在测开面试前想快速补齐接口测试经验这篇文章可以直接收藏。核心目标只有一个看完整篇之后你能在本地跑通一条“登录获取 Token - 带鉴权调业务接口 - 断言返回结果 - 批量执行 - 出测试报告”的完整链路而不是停留在“会调 requests.get”的阶段。1. 核心能力速览从材料看这条技术路线的重点是 Python 接口自动化测试的工程化实现不是某个具体软件的破解或安装。先看整体能力能力项说明学习目标Python Requests Pytest 完成接口自动化测试从入门到持续集成核心依赖requests、pytest、pytest-xdist、pytest-html、allure-pytest主要能力接口请求、断言、用例组织、数据驱动、Token 处理、批量回归、CI 集成被测对象HTTP / HTTPS 接口REST / JSON 格式最通用硬件要求普通开发机即可无 GPU 要求2 核 4G 内存足够日常执行操作系统Windows / macOS / Linux 均可启动方式命令行执行 pytest或由 Jenkins / GitLab CI 定时触发是否支持批量任务支持pytest 参数化 pytest-xdist 并发是否支持接口 API 调用Requests 本身就是 HTTP 客户端直接对接被测服务报告方式pytest-html 生成 HTML 报告Allure 生成可视化趋势报告使用边界解决功能回归、冒烟、数据校验不解决性能压测和复杂 UI 自动化这套方案的优势在于依赖少、上手快、生态成熟。Python 的 requests 语法直观Pytest 的 fixture 和参数化机制非常适合接口测试中常见的“登录态共享”“多组数据批量验证”需求再通过 CI 工具定时执行就能把接口回归变成自动化的日常任务。2. 6 小时路线怎么分配先定目标再动手标题里的“6 小时”更适合理解成一个紧凑的学习路线不是听完就能处理所有疑难问题而是用 6 个阶段把主干能力串起来。时间学习内容完成标志第 1 小时Python 环境安装、虚拟环境、pip 安装依赖能在命令行运行 python --version能导入 requests 和 pytest第 2 小时Requests 发送 GET / POST 请求处理 JSON 响应、超时、请求头能独立访问一个测试接口并打印返回数据第 3 小时Pytest 用例组织、断言、mark 标选用例能写 5 个以上接口断言用例并通过 pytest 执行第 4 小时fixture 共享登录态conftest.py 管理公共前置能实现所有业务接口测试自动携带 Token第 5 小时数据驱动、参数化、批量执行、HTML / Allure 报告能用一份 JSON 数据文件驱动一批用例第 6 小时接入 Jenkins 或 GitLab CI定时执行并产出报告能在 CI 上看到接口测试结果很多新手容易卡在第 2 到第 4 小时之间原因是上手就抓复杂框架忽略了 requests 请求细节和 pytest 执行逻辑。更好的做法是先找一个可以反复调用的测试接口比如本地 Mock 服务把请求、断言、Token 传递练熟再谈工程化。这套方案的适用场景非常明确接口回归测试、冒烟测试、业务链路验证、数据完整性校验。它不适合做 UI 自动化也不适合代替性能压测工具。接口自动化关注的是“接口返回是否符合预期”而压测关注的是“系统在高并发下的表现”两者目标不同工具选择也不同。3. 环境准备与最小工程目录3.1 Python 环境检查开始之前先确认本机 Python 环境。Windows 建议直接到 Python 官网下载安装包安装时勾选“Add Python to PATH”macOS / Linux 可以使用系统自带 Python也可以使用 Homebrew、apt 或 pyenv 安装。打开终端执行python --version pip --version建议使用 Python 3.8 及以上版本目前主流接口自动化项目基本都兼容。Python 3.12、3.13 中 requests 和 pytest 也能正常运行如果遇到个别依赖不兼容可以创建虚拟环境后重新安装。实际开发中不建议把依赖装到全局环境不同项目之间的 requests、pytest 版本可能互相影响。创建虚拟环境python -m venv .venvWindows 激活.venv\Scripts\activatemacOS / Linux 激活source .venv/bin/activate激活后命令行前面会出现(.venv)标识后面安装的依赖都会隔离在这个虚拟环境里。如果 Windows PowerShell 提示脚本执行策略限制可以改用 Git Bash 或 CMD 执行也可以临时放开当前终端策略。3.2 安装依赖这里建议把依赖写进 requirements.txt方便在 CI 环境里一键安装requests2.31.0 pytest7.4.0 pytest-xdist3.5.0 pytest-html4.1.0 allure-pytest2.13.2 flask3.0.0 python-dotenv1.0.0安装命令pip install -r requirements.txt如果只想先跑通最小示例执行pip install requests pytest pytest-html3.3 最小工程目录建议按照下面的结构组织工程便于后续扩展和 CI 集成api_test/ ├── api/ # 接口层封装 │ ├── __init__.py │ └── http_client.py # ApiClient 封装 ├── data/ # 测试数据 │ └── login_cases.json ├── tests/ # 测试用例 │ ├── __init__.py │ ├── conftest.py │ └── test_user.py ├── reports/ # 测试结果输出 ├── requirements.txt ├── pytest.ini └── README.md接口层放请求封装数据层放可参数化的测试数据tests 里只写测试逻辑和断言。这样当被测接口地址变化、请求头逻辑变化时只需要修改封装层而不需要把每个用例都改一遍。3.4 本地 Mock 接口为什么建议先用它练手做接口自动化最容易遇到的问题是被测环境不稳定、被限流、需要复杂数据权限。强烈建议学习阶段先用本地 Mock 服务练手把精力放在测试框架本身。创建一个mock_server.pyfrom flask import Flask, jsonify, request app Flask(__name__) app.route(/api/login, methods[POST]) def login(): data request.get_json(forceTrue) if data.get(username) admin and data.get(password) 123456: return jsonify({ code: 0, message: success, token: mock-token-abc123 }) return jsonify({ code: 1001, message: 用户名或密码错误 }), 401 app.route(/api/users, methods[GET]) def users(): auth request.headers.get(Authorization, ) if not auth: return jsonify({code: 401, message: 未登录}), 401 return jsonify({ code: 0, data: [ {id: 1, name: Alice, role: admin}, {id: 2, name: Bob, role: user} ] }) if __name__ __main__: app.run(host127.0.0.1, port5000, debugTrue)启动python mock_server.py用 requests 写一个冒烟请求import requests resp requests.post( http://127.0.0.1:5000/api/login, json{username: admin, password: 123456}, timeout5 ) print(resp.status_code) print(resp.json())能看到 200 状态码和返回的 token说明环境链路已经通了。本地 Mock 的最大好处是没有跨网络延迟、不会被限流、不依赖测试环境数据逻辑可完全掌控。4. Requests 接口调用基础与稳定请求写法Requests 是整个接口自动化的基础。需要掌握的并不是多少个方法而是 GET / POST、Session、请求头、超时、重试、SSL 校验这几个关键能力。4.1 GET 与 POST 基础请求import requests # GET 请求 response requests.get( http://127.0.0.1:5000/api/users, headers{Authorization: Bearer mock-token-abc123}, timeout10 ) print(response.status_code) print(response.json()) # POST 请求 payload {username: admin, password: 123456} response requests.post( http://127.0.0.1:5000/api/login, jsonpayload, timeout10 ) print(response.json())jsonpayload会自动把 Python 字典序列化为 JSON并设置Content-Type: application/json。这是接口测试最常用的写法。4.2 使用 Session 保持登录状态如果每个用例都新建 requests.get / requests.post每次都会创建独立连接。更推荐使用 Session它自动保存 Cookie、复用底层连接还能统一设置请求头import requests session requests.Session() session.headers.update({Content-Type: application/json}) # 登录后保存 token login_resp session.post( http://127.0.0.1:5000/api/login, json{username: admin, password: 123456} ) token login_resp.json()[token] # 后续请求统一携带 session.headers.update({Authorization: fBearer {token}}) # 业务接口 resp session.get(http://127.0.0.1:5000/api/users) print(resp.json())这样处理之后测试用例里不需要每个请求都手动粘贴 token而是由 Session 统一管理代码更干净。4.3 超时与重试接口不稳定的兜底方案很多接口测试脚本在请求失败时直接抛异常原因是没有设置 timeout。默认情况下 requests 会一直等待一旦网络异常或服务端无响应就可能卡住整个测试进程。建议所有请求都显式设置 timeout。对于经常遇到的 429 Too Many Requests 限流问题可以在请求层加自动重试from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry import requests retry_strategy Retry( total3, status_forcelist[429, 500, 502, 503], allowed_methods[GET], backoff_factor1 ) adapter HTTPAdapter(max_retriesretry_strategy) session requests.Session() session.mount(http://, adapter) session.mount(https://, adapter)需要留意的是POST 请求不一定幂等。如果 POST 接口不具备幂等性重试可能导致重复下单、重复注册。生产环境做接口测试时应该先确认被测接口是否允许重放或者只在测试环境启用自动重试。4.4 遇到 429 Too Many Requests 怎么办从接口测试的实际经验来看429 出现主要有三种场景场景原因处理思路请求频率过高同一 IP / 账号在短时间内发送大量请求降低并发数增加请求间隔抽样执行匿名请求限流多数开放接口对未鉴权请求限制更严格登录获取 Token 后再请求或使用有更高配额的认证账号公共测试接口被他人占用httpbin、reqres 等公共 Demo 服务整体压力大切到本地 Mock 服务或自建测试环境重试虽然能缓解瞬时限流但不能根治问题。如果测试任务需要高频调用接口应该在用例层增加时间间隔或者把并发数调低import time import requests time.sleep(0.5) # 请求之间加延时降低限流概率 resp requests.post(url, jsondata, timeout10)如果是在执行全量回归时触发 429可以在 pytest-xdist 并发参数上做限制比如先-n 2测试再逐步提高。5. Pytest 接口自动化用例设计与断言Requests 负责把请求发出去Pytest 负责组织用例、执行断言、收集失败结果。接口自动化写 Pytest 用例时重点掌握命名规则、断言写法、mark 标签这几个部分。5.1 配置 pytest.ini在工程根目录创建 pytest.ini[pytest] testpaths tests markers smoke: 冒烟用例 p0: 核心用例 addopts -qtestpaths指定 pytest 去 tests 目录收集用例markers声明自定义标签避免运行时出现 warningaddopts是默认命令行参数。Pytest 默认收集规则文件名以test_*.py开头或*_test.py结尾测试函数以test_开头测试类以Test开头且类内方法以test_开头如果写好了用例但执行时提示 collected 0 items优先检查命名是否符合规则。5.2 接口断言怎么写更有效接口测试的断言不能只看 HTTP 状态码还需要校验业务字段。示例import pytest import requests BASE_URL http://127.0.0.1:5000 pytest.mark.smoke def test_login_success(): resp requests.post( f{BASE_URL}/api/login, json{username: admin, password: 123456}, timeout5 ) assert resp.status_code 200 assert resp.json()[code] 0 assert resp.json()[token] ! pytest.mark.smoke def test_login_wrong_password(): resp requests.post( f{BASE_URL}/api/login, json{username: admin, password: wrong}, timeout5 ) assert resp.status_code 401 assert resp.json()[code] 1001建议断言的层次从低到高状态码接口是否可访问是否返回预期 HTTP 状态。业务 code服务端自己定义的业务返回码比如 0 表示成功、1001 表示参数错误。关键字段值比较返回 json 中具体字段是否符合预期。字段类型或结构确认 data 字段是 list 而不是字符串避免接口结构变更后被掩盖。def test_user_list(): resp requests.get( f{BASE_URL}/api/users, headers{Authorization: Bearer mock-token-abc123}, timeout5 ) assert resp.status_code 200 data resp.json().get(data, []) assert isinstance(data, list) assert len(data) 0 assert data[0][name]如果报错assert 后面的表达式会直接打印能一眼看出是状态码不匹配还是字段缺失排查成本比 print 大法低很多。5.3 使用 mark 拆分回归范围接口多起来之后每次全量跑可能耗时过长可以用 mark 拆分import pytest import requests pytest.mark.smoke def test_health_check(): resp requests.get(http://127.0.0.1:5000/api/health, timeout5) assert resp.status_code 200 pytest.mark.p0 def test_user_flow(): ...执行冒烟用例pytest -m smoke -v执行 P0 核心用例pytest -m p0 -v如果不加任何标签默认执行全部用例。这样在 CI 里可以做到提交代码后跑冒烟夜间定时跑完整回归。6. fixture 与数据驱动把用例做成批量任务6.1 fixture 共享登录态接口自动化最典型的前置是登录。如果一个模块下所有用例都需要 token不应该在每个用例里重复登录而是用 fixture 完成一次性登录在tests/conftest.py中放公共 fixtureimport pytest import requests pytest.fixture(scopesession) def base_url(): return http://127.0.0.1:5000 pytest.fixture(scopesession) def login_token(base_url): resp requests.post( f{base_url}/api/login, json{username: admin, password: 123456}, timeout5 ) assert resp.status_code 200 token resp.json()[token] return token测试用例直接声明依赖def test_user_list(base_url, login_token): resp requests.get( f{base_url}/api/users, headers{Authorization: fBearer {login_token}}, timeout5 ) assert resp.status_code 200 assert resp.json()[code] 0scopesession表示整个测试会话只登录一次执行 100 个用例不会登录 100 次。对于有登录次数限制的接口这个设计能显著降低限流风险。6.2 封装 ApiClient直接用 requests.Session 时每次都要拼完整 URL代码写起来重复。在api/http_client.py里封装一个客户端类统一处理 base_url、session、headers 和 tokenimport requests class ApiClient: def __init__(self, base_url, tokenNone): self.session requests.Session() self.base_url base_url.rstrip(/) if token: self.session.headers.update({ Authorization: fBearer {token} }) def request(self, method, path, **kwargs): url f{self.base_url}{path} kwargs.setdefault(timeout, 10) return self.session.request(method, url, **kwargs) def get(self, path, **kwargs): return self.request(GET, path, **kwargs) def post(self, path, **kwargs): return self.request(POST, path, **kwargs) def put(self, path, **kwargs): return self.request(PUT, path, **kwargs) def delete(self, path, **kwargs): return self.request(DELETE, path, **kwargs) def close(self): self.session.close()在 conftest 中把 login_token 和 base_url 组合成 ApiClient测试用例只关注业务路径import pytest from api.http_client import ApiClient pytest.fixture() def api(base_url, login_token): client ApiClient(base_url, login_token) yield client client.close()测试用例def test_user_list(api): resp api.get(/api/users) assert resp.status_code 200 assert resp.json()[code] 0这种分层的好处是以后如果被测系统改成了需要在 Header 里加签名只需要修改 ApiClient所有用例自动生效。6.3 JSON 文件驱动批量数据接口测试中经常需要验证几十组输入。可以在data/login_cases.json中维护用例数据[ { username: admin, password: 123456, expected_code: 200, expect_token: true }, { username: admin, password: wrong, expected_code: 401, expect_token: false }, { username: , password: , expected_code: 401, expect_token: false } ]测试代码动态读取 JSON并用 pytest.mark.parametrize 生成多条用例import json import pytest with open(data/login_cases.json, encodingutf-8) as f: login_cases json.load(f) pytest.mark.parametrize(case, login_cases, idslambda c: f{c[username]}-{c[expected_code]}) def test_login_with_json_data(api, case): resp api.post(/api/login, json{ username: case[username], password: case[password] }) assert resp.status_code case[expected_code] body resp.json() if case[expect_token]: assert body[token] ! else: assert body[code] 1001参数化之后的用例会显示成的独立 ID例如admin-200、admin-401、-401。执行时报错可以快速定位是哪一组数据影响。6.4 避免用例之间的数据依赖如果接口 A 创建的数据要被接口 B 使用不要直接写死在用例里而是通过 fixture 返回动态数据。接口测试的用例之间互相独立才能支持随机执行、并发执行和失败重跑。如果顺序执行依赖太强出现一次失败后面会连续失败排查代价很高。7. 接口批量执行与 Allure 报告7.1 Pytest 命令行批量执行本地开发时常用这些命令# 全量执行 pytest -v # 只跑某个文件 pytest tests/test_user.py -v # 根据关键字选择用例 pytest -k login -v # 根据标签执行冒烟用例 pytest -m smoke -v # 多进程并发 pytest -n 4 -v # 生成 HTML 报告 pytest --htmlreports/api-report.html --self-contained-html -v--self-contained-html会把 CSS / JS 一并嵌入 HTML方便直接发送给团队查看。7.2 pytest-xdist 并发需要注意什么pytest-xdist 能提升执行速度但接口测试不是越快越好。并发数过高会影响被测服务和测试数据稳定性。执行前先确认被测服务是否支持并发请求。不同并发进程之间是否共享同一个测试账号。接口是否存在幂等性问题。是否触发限流导致 429。稳妥的做法是先-n 2或-n 4观察被测服务响应时间和失败率再决定是否提高。7.3 Allure 报告装饰器Allure 在接口自动化里的价值是提供模块化、步骤化、失败截图和趋势图。先安装依赖pip install allure-pytest还需要本机安装 Allure 命令行工具macOS 可以用brew install allureWindows 需要把 allure 的 bin 目录加入 PATH。如果 CI 里不便安装可以先继续用 pytest-html。测试代码中加装饰器import allure import pytest allure.feature(用户模块) allure.story(登录) allure.title(登录成功后返回 Token) pytest.mark.smoke def test_login_success(api): resp api.post(/api/login, json{ username: admin, password: 123456 }) assert resp.status_code 200 assert resp.json()[token] ! 执行pytest -m smoke --alluredirallure-results --clean-alluredir -v allure generate allure-results -o allure-report --clean allure open allure-report执行后会自动打开浏览器展示报告可以按 feature、story 查看用例分组和失败原因。Allure 的统计趋势适合团队内部长期观察接口质量变化是接口自动化测试框架比较推荐的报告方案。8. 持续集成落地Jenkins 与 GitLab CI 配置示例持续集成是把接口自动化价值放大的关键一步。没有 CI 之前自动化用例只在本地手动跑接入 CI 之后可以做到合并代码触发测试、每晚定时回归、失败自动发通知。8.1 本地先保证可重复执行接 CI 之前先确认工程在全新环境能一键执行pip install -r requirements.txt pytest -m smoke --htmlreports/api-report.html --self-contained-html -v如果本机还需要手动启动 Mock 服务CI 环境也必须加上启动 Mock 的步骤否则测试会出现连接失败。8.2 Jenkins Pipeline 示例Jenkins 中新建流水线任务使用 Pipeline 脚本pipeline { agent any stages { stage(Checkout) { steps { checkout scm } } stage(Setup) { steps { sh python3 -m venv .venv sh .venv/bin/pip install -r requirements.txt sh .venv/bin/python mock_server.py } } stage(Run API Tests) { steps { sh .venv/bin/pytest -m smoke --htmlreports/api-report.html --self-contained-html -v } } } post { always { publishHTML(target: [ reportDir: reports, reportFiles: api-report.html, reportName: 接口自动化测试报告, keepAll: true ]) } } }publishHTML需要 Jenkins 安装 HTML Publisher 插件。如果被测服务不是本地 Mock而是独立的测试环境需要把 mock_server 启动步骤改为检查测试环境连通性。8.3 GitLab CI 配置示例GitLab CI 相对更简洁在工程根目录创建.gitlab-ci.ymlstages: - test api-test: stage: test image: python:3.12 script: - pip install -r requirements.txt - pytest -v --htmlreports/api-report.html --self-contained-html artifacts: when: always paths: - reports/ expire_in: 1 week rules: - if: $CI_PIPELINE_SOURCE merge_request_event - if: $CI_PIPELINE_SOURCE schedule上面的规则表示在合并请求和定时任务时执行测试产物保留一周。GitLab Runner 所在机器需要能访问被测服务地址如果被测服务在 Docker 内网需要注意网络配置。8.4 定时触发与失败通知Jenkins 可以配置Build periodicallyH 2 * * *表示每天凌晨 2 点执行。GitLab CI 可以配置 Pipeline Schedule。定时任务适合跑完整的回归用例集但执行前要保证测试数据可恢复否则第二次执行可能因为第一次产生的脏数据而失败。CI 中的接口测试“稳定”比“覆盖率高”更重要。如果用例本身存在随机失败团队很快就会忽略报告。所以接入 CI 前至少保证冒烟用例连续执行 3 到 5 次稳定通过。9. 资源占用与稳定性观察接口自动化测试对电脑配置要求不高重点观察的是执行过程中的请求频率、内存变化、被测服务压力而不是单纯追求 CPU 跑满。本地用 pytest 单进程执行时Requests 连接池复用了 Session内存占用整体平稳。引入 pytest-xdist 后并发进程数越多请求频率越高需要观察被测服务响应时间有没有明显变慢。如果出现大量超时或 429说明并发已经超过服务承受能力应该降低-n参数或增大请求间隔。在 Linux 环境可以用 top 查看 python 进程的 CPU 和内存趋势top -p $(pgrep -d, -f pytest)如果是在 CI 环境可以直接看 Jenkins 或 GitLab 的任务日志重点寻找ConnectionError、ReadTimeout、Too Many Requests这类关键字。一个稳定的接口测试工程应该是执行结果可预期而不是偶尔成功偶尔失败。遇到接口返回不稳定时先判断三个层面是不是测试代码问题请求参数是否正确、是否有遗漏 Header、断言是否过于严格。是不是测试数据问题数据被上一次执行污染、账号权限不足、数据未被清理。是不是服务环境问题被测服务负载高、网络抖动、限流触发。不要遇到失败就盲目重试。如果 10 次失败里有 8 次是同一个接口 500应该先反馈给开发定位问题而不是调整重试次数掩盖缺陷。10. 接口自动化常见问题与排查方法实际执行中高频问题整理成下表问题现象可能原因排查方式解决方案ModuleNotFoundError: No module named requests依赖未安装或当前命令行没有激活虚拟环境执行 pip list 检查确认命令行前缀是否包含 .venv激活虚拟环境后执行 pip install -r requirements.txt连接被拒绝 ConnectionError被测服务未启动或端口不对浏览器直接访问接口地址检查返回执行 netstat / lsof 查看端口启动 mock_server 或修改 base_url 配置collected 0 items文件名、函数名不符合 pytest 规则查看 tests 目录文件命名改为 test_ 开头文件名和函数名登录接口成功但业务接口返回 401Token 未传递或已过期打印请求头确认 Authorization 字段用 Session 统一管理 token或检查 token 有效期接口返回 429 Too Many Requests请求频率过高或匿名请求配额被限制查看响应头 Retry-After观察是否有大量并发降低并发、增加 sleep、使用认证账号、配置退避重试响应中文乱码服务端返回 charset 与 requests 默认解码不一致打印 resp.encoding设置 resp.encoding utf-8 后再调用 resp.json()本地能跑通CI 上连接失败CI 环境访问不到被测服务地址在 CI 脚本中先 curl 被测服务调整 base_url 为 CI 可访问地址或在 CI 中启动 Mock 服务SSL 证书报错被测环境使用自签名证书确认是否为测试环境临时设置 verifyFalse 并注释原因正式环境应使用正确证书多个用例互相影响用例存在数据依赖或共享数据未清理单用例执行通过全量执行失败通过 fixture 生成唯一测试数据测试结束调用清理接口关于 SSL 问题需要多说一句verifyFalse只建议在开发测试环境使用。如果公司内部有严格的安全审计应该把测试环境证书加入信任列表或者在请求中显式指定证书路径。11. 接口自动化工程落地的最佳实践从零搭建接口自动化时有几个容易被忽视但影响很大的实践建议。第一目录分层要清晰。接口层、数据层、用例层、报告层分开不要在一个 test 文件里同时塞请求封装和用例。后续新增接口时先加api层的封装方法再写测试用例最后补充数据文件。第二配置信息通过环境变量管理。base_url、测试账号、密码、密钥不应该硬编码在代码里。可以维护.env文件通过 python-dotenv 读取pip install python-dotenvimport os from dotenv import load_dotenv load_dotenv() BASE_URL os.getenv(BASE_URL, http://127.0.0.1:5000) USERNAME os.getenv(TEST_USERNAME, admin) PASSWORD os.getenv(TEST_PASSWORD, 123456)CI 中通过环境变量注入测试环境配置本机和 CI 之间不需要维护两份代码。第三尽量保证用例幂等。同一个用例执行 5 次结果应该一致。如果接口 A 会新增数据建议新增时使用随机数或时间戳标识测试结束后调用删除接口清理避免影响下一次执行。import time import uuid unique_name fuser_{int(time.time())}_{uuid.uuid4().hex[:6]}第四日志要可追踪。每次请求的 URL、请求头、请求体、响应体应该作为测试日志输出到文件。当接口返回不符合预期时不是只看断言信息而是能回溯当时发送了什么参数。第五使用时遵守授权边界。接口自动化测试只应该在你有权测试的环境执行。涉及生产环境、第三方服务、用户真实数据时必须获得明确授权不要通过高频遍历等方式获取未授权数据。若接口测试涉及个人信息或敏感业务数据需要对日志中的手机号、身份证号、Token 做脱敏处理。第六先小范围验证再扩大。第一次落地的团队不要追求一次性写 500 条用例而是先选 20 条核心冒烟用例跑通本地、报告、CI 全链路稳定后再逐步补充业务覆盖率。总结接口自动化的学习曲线并不陡峭真正难的是把简单用例如工程化方式稳定落地。这篇内容把 Python Requests Pytest 的主线完整梳理了一遍从本地 Mock 环境、接口调用、Pytest 断言到数据驱动、批量执行、Allure 报告再到 Jenkins / GitLab CI 持续集成最后给出了 429 限流、连接失败、用例不收集等常见问题的排查思路。如果你是第一次接触这套技术栈建议先按顺序完成三个动作第一用本地 Mock 服务把登录和业务接口跑通第二用 fixture 把 Token 传递逻辑抽出来第三把冒烟用例接上 CI 并生成一次报告。这三个动作完成后你已经具备在真实项目里落地接口自动化的基本能力。最容易踩的坑不是语法不会而是接口测试用例之间互相依赖或者被测环境不稳定导致用例随机失败。稳定永远比覆盖率高更重要。把核心链路先在固定环境里跑稳再逐步扩大接口范围是更务实的成长路径。如果后续想继续深入可以从接口签名加密处理、数据库数据校验、代码覆盖率、失败自动通知、测试环境容器化这几个方向继续扩展。