十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

pytest接口自动化测试框架工程化落地实践

pytest接口自动化测试框架工程化落地实践 做接口测试的同行应该都知道pytest 这东西入门容易但真正要在项目里撑场面的时候各种问题就冒出来了用例一多怎么组织、数据怎么管理、依赖登录态的接口怎么处理、报告怎么让领导和开发一眼看懂。这篇文章就是上一篇 pytest 入门内容的续集专门聊工程化落地把我在多个项目里跑通的套路完整整理出来。如果你已经会写def test_xxx()但还没搭过一套完整的接口自动化测试体系这篇文章正好能帮你把框架从能跑变成好用。1. 接口测试框架为何要分层设计1.1 从脚本到框架到底多了什么我刚开始做接口自动化的时候也是典型的脚本思维一个test_login.py里面requests请求、Excel 数据读取、断言逻辑、发邮件报告全部堆在一起。单个接口这么写确实跑得通但一旦接口数量超过 50 个或者业务字段隔三差五调整这种写法就变成灾难了——改一个公共请求头得在所有脚本里搜索替换想加一条测试数据得翻代码找到对应列表再 append。框架化的本质不是引入某个神秘工具而是给脚本加上约束和分工。数据不写死在代码里请求不散落在每个用例里断言有一套统一标准报告能自动生成。这样做的直接收益是维护成本从改代码降低为改数据。业务同学甚至可以在不懂代码的情况下往数据文件里添加测试用例这对团队协作来说非常重要。所以我在设计框架时第一原则就是数据与逻辑分离。测试数据放文件里用例只负责取数据、发请求、做断言这三件事任何改动都限制在单一模块内不会牵一发动全身。1.2 我惯用的框架目录结构直接给出一套我多次实践后稳定使用的目录结构你们可以按项目规模裁剪api_testing_framework/ ├── config/ │ ├── __init__.py │ ├── settings.py # 全局配置环境地址、超时时间、数据库连接等 │ └── environment.yaml # 多环境配置dev / test / prod ├── core/ │ ├── __init__.py │ ├── api_client.py # 基于 requests 的统一请求封装 │ ├── assert_utils.py # 断言封装 │ ├── auth_manager.py # 登录态和 token 管理 │ └── logger.py # 日志封装 ├── data/ │ ├── login_cases.yaml # 登录接口测试数据 │ ├── user_cases.yaml # 用户模块接口测试数据 │ └── ... ├── testcases/ │ ├── __init__.py │ ├── conftest.py # 全局 fixture │ ├── test_login.py │ ├── test_user.py │ └── ... ├── reports/ │ ├── html/ # pytest-html 或 Allure 报告输出 │ └── logs/ # 运行日志 ├── utils/ │ ├── __init__.py │ ├── read_data.py # 读取 yaml / json / excel 数据 │ ├── db_utils.py # 数据库连接与查询用于数据准备和清理 │ └── common.py # 通用工具函数 ├── pytest.ini ├── requirements.txt └── run.py # 统一入口脚本这个结构看起来目录多但每一层职责非常单一core层只做技术封装data层只放测试数据testcases层只写业务用例。新人接手项目时先看core理解请求和断言再看data添加用例数据最后看testcases了解业务场景上手成本会低很多。1.3 分层设计的关键原则分层的核心是单向依赖testcases依赖core和datacore不依赖testcases。如果有一天要把requests换成httpx只需要改动core/api_client.py而所有测试用例几乎不受影响如果后端接口从 HTTP 切换为 HTTPS也只需要调整config层的环境配置。还有一个容易忽略的点utils/db_utils.py非常重要。接口测试不像功能测试它经常需要前置数据准备和后置数据清理。比如测试创建订单接口可能需要先在数据库里插入一个用户测试完再把这个用户删掉。这些操作如果手工在数据库客户端里做自动化就跑不出全自动的效果。把数据库操作封装进utils层用例里直接调用才能实现完整的自动化闭环。2. pytest 进阶特性工程化落地必掌握2.1 fixture 到底怎么用才算进阶很多入门教程讲 fixture 只讲了定义一个函数、加个装饰器、然后当参数传进用例。但在接口测试的工程化场景里fixture 至少还有三个高级玩法你必须掌握。第一个是scope参数。接口测试里最典型的场景是登录一个测试类里 10 个用例都需要登录态如果每个用例都执行一次登录请求不仅浪费大量时间还容易触发服务端的频繁登录限制。这时把登录 fixture 的scope设为class或session就能让同一测试类内所有用例共享一次登录。import pytest from core.auth_manager import AuthManager pytest.fixture(scopeclass) def auth_token(): 会话级登录整类用例只登录一次 token AuthManager.login() yield token # 这里可以做登录态的销毁操作第二个是conftest.py的共享机制。conftest.py里的 fixture 对同目录及其子目录下的所有测试用例自动可见不需要任何 import 语句。我习惯把最通用的 fixture比如auth_token、logger、base_url放在根目录的conftest.py把模块专属的 fixture 放在对应模块目录下的conftest.py形成层级共享。第三个是yield的 setup/teardown 能力。yield之前的代码是 setupyield之后的代码是 teardown。接口测试中特别适合做创建测试数据 - 执行用例 - 清理测试数据这个流程。比如测试用户注销接口fixture 里先创建一个新用户用例执行完注销操作后再确认数据库里数据被正确清理。2.2 参数化一份用例跑多份数据接口测试和普通单元测试的一个显著区别在于一个接口往往需要验证大量数据组合。登录接口要测正常密码、错误密码、空密码、超长密码、不存在的用户、被锁定的用户等等。如果不做参数化同样的代码逻辑要复制十几遍丑得没法看。pytest 的参数化通过pytest.mark.parametrize实现import pytest pytest.mark.parametrize( username, password, expected_code, expected_msg, [ (admin, admin123, 0, 登录成功), (admin, wrong, 1001, 用户名或密码错误), (, admin123, 1002, 用户名不能为空), (admin, , 1003, 密码不能为空), (admin, a * 256, 1004, 密码长度不能超过128位), ] ) def test_login(username, password, expected_code, expected_msg): resp api_client.post(/api/login, json{username: username, password: password}) assert resp.json()[code] expected_code assert resp.json()[msg] expected_msg这样一条用例加上数据列表就覆盖了正常和异常场景。但要注意数据多了以后如果某条数据失败执行结果显示只是test_login[admin-wrong-1001-用户名或密码错误]虽然能定位到是哪组数据但如果数据是超长字符串报告里会显得很乱。建议用ids参数给每组数据起一个可读的名字pytest.mark.parametrize( username, password, expected_code, expected_msg, [...], ids[正常登录, 密码错误, 用户名为空, 密码为空, 密码超长] ) def test_login(...): ...另外参数化不止能传固定值还能配合request.getfixturevalue()做参数中带 fixture的高级操作这在构造复杂测试数据时非常有用不过日常大多数场景用不上先把基础参数化用好就够了。2.3 插件体系并发、重试、排序、超时一网打尽pytest 生态最强大的一点就是插件。接口测试里我几乎必装这几个pytest-html生成 HTML 格式的测试报告开箱即用适合不太想折腾 Allure 的团队。pytest-xdist分布式执行测试通过-n auto自动利用多核 CPU 并行跑用例接口测试用例之间往往相互独立并行收益非常高。pytest-rerunfailures失败用例自动重跑比如--reruns 2 --reruns-delay 1表示失败后间隔 1 秒重试 2 次。接口偶发超时、网络抖动是常态这个插件能有效减少误报。pytest-ordering通过pytest.mark.run(order1)控制用例执行顺序。虽然我推荐用例间不要有依赖但某些场景下比如必须先跑通登录用例再跑业务用例确实需要指定顺序。pytest-timeout给用例设置超时时间防止某个接口卡住导致整个测试会话挂起。在pytest.ini里的推荐配置[pytest] addopts -v -s --htmlreports/html/report.html --self-contained-html --reruns 2 --reruns-delay 1 -n auto testpaths testcases python_files test_*.py python_classes Test* python_functions test_*这里的--self-contained-html表示把报告所需的 CSS/JS 内嵌到 HTML 文件里方便直接通过邮件或 IM 发送给别人查看。还有一点经验-n auto的并行数量和接口被测服务的承受能力有关如果被测服务是单机部署且性能一般并行数量建议手动指定为-n 2或-n 3别一上来就把服务打挂了。3. 核心功能实现请求、数据、断言三位一体3.1 requests 请求层封装实战接口测试的请求如果直接在每个用例里写requests.get()后续加统一日志、加超时、加鉴权 header 时会非常痛苦。所以我都会封装一个ApiClient类import requests import time import json from core.logger import logger class ApiClient: def __init__(self, base_url, timeout10): self.base_url base_url self.timeout timeout self.session requests.Session() def _request(self, method, path, **kwargs): url self.base_url path kwargs.setdefault(timeout, self.timeout) start_time time.time() try: response self.session.request(method, url, **kwargs) elapsed round((time.time() - start_time) * 1000, 2) logger.info(f{method} {url} 耗时 {elapsed}ms 状态码 {response.status_code}) return response except requests.Timeout: logger.error(f{method} {url} 请求超时) raise except requests.ConnectionError: logger.error(f{method} {url} 连接失败) raise def get(self, path, paramsNone, **kwargs): return self._request(GET, path, paramsparams, **kwargs) def post(self, path, jsonNone, dataNone, **kwargs): return self._request(POST, path, jsonjson, datadata, **kwargs) def put(self, path, jsonNone, **kwargs): return self._request(PUT, path, jsonjson, **kwargs) def delete(self, path, **kwargs): return self._request(DELETE, path, **kwargs)这套封装看起来简单但有几个细节很重要。第一是使用requests.Session()而不是直接requests.get()Session 会自动管理 Cookie对需要 Cookie 保持会话的接口测试特别关键。第二是统一记录请求日志接口测试排查问题的时候一份包含完整请求时间、地址、状态码的日志能省去大量抓包时间。第三是默认超时时间不设置 timeout 的 requests 请求遇到网络异常时可能长时间挂起这是线上事故级别的隐患。3.2 用 YAML 管理用例数据有了请求封装接下来就是把测试数据从代码里赶出去。我用得最顺手的格式是 YAML因为它支持注释、层级清晰、可读性好比 JSON 更适合手动维护测试数据。一个登录接口的 YAML 用例文件login_success: method: POST path: /api/login data: username: admin password: admin123 headers: Content-Type: application/json validate: - eq: [code, 0] - eq: [msg, 登录成功] - contains: [data.token, eyJ] login_wrong_password: method: POST path: /api/login data: username: admin password: wrong_password validate: - eq: [code, 1001] - eq: [msg, 用户名或密码错误]然后在用例里通过一个read_data工具函数读取import pytest import yaml from pathlib import Path from core.api_client import ApiClient def load_cases(file_name): file_path Path(__file__).parent.parent / data / file_name with open(file_path, encodingutf-8) as f: return yaml.safe_load(f) cases load_cases(login_cases.yaml) pytest.mark.parametrize(case_name, case_data, cases.items(), idslist(cases.keys())) def test_login(case_name, case_data, api_client): resp api_client.request(case_data[method], case_data[path], jsoncase_data[data]) for assertion in case_data[validate]: if eq in assertion: expected_path, expected_value assertion[eq] actual_value resp.json() for key in expected_path.split(.): actual_value actual_value[key] assert actual_value expected_value, f{expected_path} 期望 {expected_value}实际 {actual_value}这里用case_name参数名配合idslist(cases.keys())报告里每组数据都会显示对应的 YAML key比如test_login[login_success]一目了然。这种做法把接口用例变成了数据条目新增用例时只需要在 YAML 里加一段不需要触碰代码。3.3 断言封装不是只会 assert断言是接口测试最容易写乱的地方。新手常犯的错误是每个用例里写一大堆assert resp.status_code 200、assert resp.json()[code] 0然后失败时输出信息极不友好都不知道期望值是多少、实际值是多少。我推荐的断言分层策略是第一层HTTP 状态码断言。resp.status_code必须为 200或业务约定的其他值这表示网络传输层正常。第二层业务状态码断言。resp.json()[code]为 0 表示业务成功非 0 表示业务异常。这一层是接口测试真正的核心因为很多接口即使业务失败HTTP 状态码依然是 200。第三层业务字段断言。校验返回的具体数据字段比如用户名的值是否为预期值、列表的长度是否为预期值。基于这个思路可以把断言封装成工具函数def assert_response(resp, expected_codeNone, expected_msgNone, expected_dataNone): assert resp.status_code 200, fHTTP 状态码异常: {resp.status_code} json_data resp.json() if expected_code is not None: assert json_data[code] expected_code, f业务 code 期望 {expected_code}实际 {json_data.get(code)}完整响应: {json_data} if expected_msg is not None: assert json_data[msg] expected_msg, f业务 msg 期望 {expected_msg}实际 {json_data.get(msg)}完整响应: {json_data} if expected_data is not None: assert json_data[data] expected_data, f业务 data 期望 {expected_data}实际 {json_data.get(data)}还有一个很好的习惯是断言失败时打印完整的响应体。接口测试失败后测试人员第一步反应往往是服务端到底返回了什么如果断言信息里只有期望值和实际值没有上下文排查效率会很低。所以在封装里把完整响应体打出来算是我实操中最值回票价的细节之一。3.4 登录态与 Token 管理接口测试里 80% 以上的接口都需要登录态。Token 管理如果处理不好就会出现每个用例都现调登录接口或Token 过期后用例批量失败的问题。我的做法是在根目录conftest.py里定义一个session级别的 fixture用来统一获取和管理 Token并把它注入到ApiClient的公共请求头中。import pytest from core.api_client import ApiClient pytest.fixture(scopesession) def api_client(config): 全局唯一的 API 客户端自动携带登录 token client ApiClient(config[base_url]) token AuthManager.get_token(client) client.session.headers.update({Authorization: fBearer {token}}) return client这里还有一个实战细节AuthManager.get_token()内部可以封装先从本地缓存读取没有则调用登录接口获取的逻辑同时记录 Token 的过期时间。如果测试运行时间较长比如持续回归 2 小时Token 过期了怎么办我通常会在请求封装里做一次401 拦截自动重试当响应状态码是 401 时自动用刷新接口获取新 Token重新发起一次请求。这个功能虽然代码量不大但非常实用能让长时间的回归测试稳定不少。4. 工具选型postman、jmeter、apifox 与 pytest 怎么配合4.1 各自的定位很多刚入门的朋友会纠结做接口测试到底用 postman 还是 pytest 还是 jmeter我先说结论它们不是替代关系而是不同阶段的工具。工具核心定位优势局限postman手工调试与快速验证上手快、集合管理方便、支持环境变量和脚本不适合大型自动化回归报告能力弱apifox接口管理 调试 Mock一体化程度高团队协作友好接口文档自动生成自动化表达能力有限复杂断言不便jmeter性能测试为主压测能力强支持复杂场景编排做接口自动化断言、数据驱动比较笨重pytest requests自动化回归与持续集成代码表达能力强生态完善断言灵活报告可定制需要编程基础前期搭建成本高4.2 实战中的组合策略我在实际项目里的打法是这样开发联调阶段后端还没真正交付我用 apifox 或 postman 中的 Mock 功能先模拟返回把自己的处理逻辑调通同时把接口报文、字段含义摸清楚。接口基本稳定后用 postman 做一轮快速冒烟把明显的调用问题暴露出来。进入稳定测试阶段开始用 pytest 搭建自动化用例把核心链路和全量接口跑成回归集。每次发版前或者每晚定时任务用 pytest 跑回归并用 Allure 生成报告发给团队。需要验证性能指标时把关键接口迁移到 jmeter 做压测。这种组合的好处是调试快、自动化稳、压测专各取所长而不是一个工具干所有事。5. Mock 模拟接口测试让测试不等人5.1 什么时候必须 Mock做接口测试最怕的不是接口报错而是接口压根没写好或者依赖了外部系统。典型场景包括被测系统需要调用第三方支付接口但支付平台没有测试环境无法真实触发支付成功回调。你负责模块 A依赖团队 B 的接口但 B 的接口还在开发中。测试数据涉及外部环境状态比如短信验证码发送到了真实手机号上。某些异常场景根本无法构造比如服务端突然返回 500 错误你没法让开发真的把服务停掉。在这些情况下Mock 是唯一的解法。Mock 的核心思想是用一个假的依赖替代真的依赖让被测系统按照预期路径运行。5.2 pytest-mock 与 requests-mock 快速上手在 pytest 生态里有两个最常用的 Mock 工具。pytest-mock是通用 Mock 库本质是对unittest.mock的封装requests-mock则专门用于拦截 requests 请求对接口测试来说更加直观。import requests_mock def test_get_user_info_with_mock(api_client): mock_data {code: 0, msg: success, data: {id: 1, name: 张三}} with requests_mock.Mocker() as m: m.get(http://test-server/api/user/1, jsonmock_data, status_code200) resp api_client.get(/api/user/1) assert resp.json()[data][name] 张三这个示例里requests_mock在内存中拦截了所有匹配的 GET 请求直接返回预先定义好的数据完全不经过真实网络。这样即使被测服务完全不可用你的测试用例也能正常跑通。但需要提醒的是Mock 测试的是自己的逻辑不是对方的逻辑。过度依赖 Mock 会导致测试环境与真实环境脱节到时候联调阶段依然会炸。我的原则是能不用 Mock 就不用必须在依赖方接口未就绪或环境不稳定时才用。5.3 自建 Mock 服务实战requests_mock适合单元级别的 Mock但如果需要在接口测试过程中提供一个完整的、独立运行的 Mock 服务比如给前端或联调团队使用我推荐用 FastAPI 快速搭建一个from fastapi import FastAPI from pydantic import BaseModel app FastAPI() class PayRequest(BaseModel): order_id: str amount: float app.post(/api/mock/pay/callback) def pay_callback(req: PayRequest): return { code: 0, msg: 支付成功回调, data: { order_id: req.order_id, amount: req.amount, status: SUCCESS, transaction_id: fMOCK{req.order_id} } } if __name__ __main__: import uvicorn uvicorn.run(app, host0.0.0.0, port8099)这个 Mock 服务可以用来模拟支付回调被测系统在测试环境里配置回调地址为这个 Mock 服务测试人员就能自由控制回调响应的内容和状态不受真实支付平台限制。实际上很多团队会把 Mock 服务做成一个可配置响应的通用平台通过配置不同的路径和返回 JSON 来模拟各种上下游系统这个投入会带来极大的测试效率提升。6. 测试报告与持续集成6.1 pytest-html 与 Allure 怎么选报告是接口自动化测试的门面。做得好测试结果一目了然开发愿意看、领导愿意信做得差即使覆盖率再高别人也会觉得这活儿没干完。pytest-html的优点是轻量、零额外依赖、配置一下就能用。适合小型项目或者团队还没有独立的报告服务。但它也有硬伤界面比较朴素没有测试步骤、截图、历史趋势等维度展示效果一般。Allure是更专业的选择。它生成的报告包含测试步骤、参数、附件、执行历史、严重程度等丰富信息而且界面颜值在线团队也更容易接受。搭配pytest-allure-adapter插件使用虽然多一步安装 Allure 命令行工具的过程但对接口自动化这种长期维护的项目来说这个投入非常值得。6.2 Allure 接入步骤在 pytest 项目里接入 Allure 的步骤很简单安装依赖pip install allure-pytest安装 Allure 命令行工具Mac 用brew install allureWindows 到官网下载解压后配置环境变量添加命令行参数--alluredirreports/allure-results用例中添加allure.title()、allure.description()、allure.feature()等装饰器丰富报告展示内容运行后执行allure generate reports/allure-results -o reports/allure-report --clean生成 HTML 报告执行allure open reports/allure-report本地打开报告一个示例用例import allure allure.feature(登录模块) allure.story(正常登录场景) allure.title(使用正确用户名密码登录成功) def test_login_success(api_client): resp api_client.post(/api/login, json{username: admin, password: admin123}) assert_response(resp, expected_code0, expected_msg登录成功)allure.feature相当于模块维度allure.story相当于功能点维度allure.title是用例的可读名称。报告里可以按 feature 分组浏览非常直观。6.3 持续集成让回归测试自动跑起来接口自动化测试的真正价值在持续集成中体现。我的标准做法是开发提交代码后CI比如 Jenkins 或 GitLab CI自动触发测试流水线。流水线里先构建被测服务再执行 pytest 测试。测试通过则继续后续发布流程测试失败则通知对应负责人。每晚定时跑一次全量回归第二天早上团队直接查看报告。GitLab CI 的一个最小.gitlab-ci.yml片段api-test: stage: test script: - pip install -r requirements.txt - pytest testcases/ --alluredirreports/allure-results - allure generate reports/allure-results -o reports/allure-report --clean artifacts: paths: - reports/allure-report/ expire_in: 7 days only: - main注意artifacts配置它能把生成的报告作为 CI 产物保存下来团队成员可以直接点击 CI 页面里的报告链接查看结果不用把 HTML 文件下载到本地。这个体验比手动跑一次把报告发群里要好得多也是我强烈推荐逐步落地的一步。7. 常见问题与排查技巧实录7.1 用例乱序和相互依赖pytest 默认按照文件中用例的定义顺序执行但不同文件的执行顺序并不保证。如果用例之间存在隐式依赖比如 A 用例创建了数据B 用例依赖这份数据执行顺序一变就炸。我的建议是用例之间的数据依赖一律通过 fixture 解决而不是通过用例执行顺序解决。比如需要已创建的用户就定义一个create_userfixtureB 用例直接声明依赖这个 fixture不管 A 用例跑不跑、什么时候跑B 用例都有可用的数据。如果确实需要控制顺序用pytest-ordering插件的pytest.mark.run(order1)指定但这是治标不治本的办法能不用就不用。7.2 fixture 作用域踩坑scopesession的 fixture 只会执行一次这带来一个隐患如果它内部保存了可变对象比如一个字典、一个列表用例之间相互修改这个对象就会产生数据污染。举个真实例子我在一个项目里定义了一个session级别的env_datafixture返回的是一个字典然后在用例里直接env_data[order_id] xxx导致后续用例读取到被修改的数据。问题的根源是 fixture 返回了同一个引用正确做法是返回不可变对象或者每次使用都copy.deepcopy()。这是一个非常隐蔽的坑排查了很久才找到原因。7.3 中文乱码与日志丢失pytest 在控制台输出中文时Windows 终端经常显示乱码。这不是代码问题而是编码问题。解决办法是在pytest.ini中设置disable_test_id_escaping True同时确保所有文件用 UTF-8 编码保存。日志丢失是另一个常见问题。如果只在控制台打了print()使用-s参数能看到但一旦接入 CI 或者并行执行输出就会混乱。正确的做法是在core/logger.py里配置同时输出到控制台和文件的 logger并带上时间戳和用例名这样排查问题时有据可查。7.4 测试数据污染接口自动化跑的次数多了数据库里会积累大量测试数据导致用例失败。比如创建用户接口同一个手机号第一次跑能创建成功第二次跑就提示手机号已存在。解决思路有三种第一种用例开始前先清理目标数据保证环境干净第二种每次生成随机数据避免冲突第三种用唯一时间戳做后缀。我在项目里通常采用前置清理 随机数据双保险既能保证可重复执行又能模拟真实场景。utils/db_utils.py里的清理函数就是为这个场景准备的。7.5 并发执行与 Token 冲突pytest-xdist并行执行时如果多个进程同时调用登录接口、同时更新 Token可能会出现 Token 覆盖的问题。因为session级别的 fixture 在pytest-xdist下是每个 worker 进程各自执行一次不同进程的 Token 互相独立这本身没有问题但如果你把 Token 写到了全局变量或共享文件里就会出冲突。解决方法是Token 只保存在进程内部的ApiClient实例中不要跨进程共享。每个 worker 进程维护自己的登录态各跑各的用例互不干扰。如果你有登录一次所有用例共享的强需求可以考虑先用串行模式跑登录相关的冒烟用例再并行跑其余用例。7.6 常见问题速查表问题现象可能原因解决方向用例报告显示[admin-wrong-1001]无法理解参数化未设置 ids添加ids参数给数据起可读名称同一个用例第一次跑过第二次跑失败测试数据被污染增加前置清理或使用随机数据并行执行后登录相关用例批量失败Token 跨进程共享冲突每个 worker 独立维护登录态接口偶发超时导致用例失败网络波动或服务性能问题使用pytest-rerunfailures增加重试断言失败但不知道响应体内容断言信息太简略在断言封装中打印完整响应体报告里中文乱码终端或报告编码问题设置disable_test_id_escaping Truefixture 返回值被后续用例修改引用了可变对象使用copy.deepcopy()或返回不可变对象数据库积累大量脏数据缺少后置清理在teardown中调用db_utils清理数据最后再分享一个我这些年做接口测试框架的体会。很多人一开始总想把框架设计得大而全各种插件、各种封装、各种自动化平台一股脑全上结果项目还没跑起来维护框架本身就已经累得不行。我的建议是反过来先用手写脚本跑通 10 个核心用例感受痛点当痛点出现时再层层加重也就水到渠成了。比如用例多了开始到处复制再引入 fixture 和 conftest数据频繁修改再引入 YAML 数据驱动报告太丑没人看再接入 Allure。接口测试框架不是一蹴而就的成品而是在业务迭代中不断生长的体系。希望这篇文章能让你少走一些我踩过的弯路后续如果大家有兴趣我还可以聊聊接口测试的覆盖率统计、全链路压测和流量回放这几个进阶方向。
返回列表