本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:开箱即用的Python接口自动化测试环境,基于pytest+requests构建,新手照着文档改3行代码就能跑通。测试用例统一用YAML编写,结构清晰易维护;支持接口间参数传递(比如登录后提取token供后续请求复用)、自动维持Cookie和Session状态。内置封装好的DDT数据驱动机制,一份用例配合多组测试数据批量执行。Allure报告自动生成,含用例分类、失败截图、执行时长、步骤详情等可视化信息。日志模块按level分级记录,自动归档到logs目录,保留错误堆栈便于排查。BaseUrl、公共请求头、通用断言逻辑全部抽离进config.yaml,不同环境(开发/测试/预发)一键切换。框架自带conftest.py提供标准化fixture,支持执行顺序控制、用例跳过、参数化标记(@pytest.mark.parametrize)、热加载和异常捕获。testcases放YAML用例,test_api是测试入口脚本,allRun.py支持一键全量运行,pytest.ini已预置常用配置。配套有从安装依赖、配置环境到编写首个用例的完整操作指南,每步带说明和注意事项。

1. 这不是“又一个框架”,而是一套能立刻上手的接口测试工作流

我带过不少刚转测试开发的新人,也帮业务团队搭过十几套自动化方案。最常听到的抱怨不是“不会写代码”,而是:“文档写了20页,我照着配了3小时,连第一个请求都发不出去。”这套脚手架,就是为解决这个痛点而生的——它不追求炫技,不堆砌设计模式,核心目标只有一个:让一个懂基础HTTP和YAML语法的人,在15分钟内跑通第一个真实接口用例,并看到带截图、带步骤、带失败堆栈的Allure报告。

关键词里提到的“YAML用例、Allure报告、DDT数据驱动、pytest框架”,不是并列的四个技术点,而是一条被反复打磨过的完整工作流闭环:你用YAML写人话式的用例(比如- 登录成功:用户名admin,密码123456,断言返回code=0),框架自动把它翻译成pytest可执行的测试函数;DDT引擎读取多组数据后,生成多个独立的测试实例;pytest按fixture定义的顺序执行,中间自动提取token、维持Session;所有过程日志按error/warn/info分级归档到logs/目录下,出错时直接定位到哪一行哪一参数;最后Allure把整个执行链路可视化呈现,从请求头、响应体、断言结果到耗时曲线,一目了然。

它不强制你学装饰器原理,也不要求你理解pytest插件加载机制。allRun.py就是那个“一键按钮”,config.yaml就是那个“环境开关”,testcases/login.yaml就是那个“用例说明书”。你改三行:config.yaml里换域名、testcases/里改个账号密码、test_api/test_login.py里指定用例路径——运行,报告就出来了。后面要加新接口?复制一个YAML文件,填几个字段,连Python都不用碰。这才是工程化该有的样子:把复杂留给自己,把简单留给使用者。

2. 整体架构与设计思路拆解:为什么是这五块拼图?

2.1 为什么选pytest而不是unittest或Robot Framework?

很多人第一反应是“unittest更基础”“Robot语法更像自然语言”。但实际落地时,pytest的生态优势是碾压级的。举个最实在的例子:你要给10个接口做“相同前置条件+不同参数”的批量测试,unittest得写10个重复的setUp(),Robot得维护10个Keyword调用;而pytest一句@pytest.mark.parametrize("user, pwd", [("admin","123"), ("test","456")])就搞定,且每个参数组合在Allure报告里显示为独立用例,失败互不影响。

更重要的是,pytest的fixture机制天然适配接口测试的依赖链。登录获取token → 用token调用户中心 → 用用户ID调订单列表,这种强依赖关系,用@pytest.fixture(depends=["login_fixture"])就能声明式定义执行顺序,比手动写self.token = login_resp.json()["token"]清晰十倍。框架里的conftest.py已经预置了base_url_fixturesession_fixtureauth_token_fixture三级依赖,你只需在测试函数参数里写def test_user_center(session_fixture):,框架自动帮你注入已登录的session对象——这背后是pytest的scope管理(session级fixture只初始化一次)和yield机制(yield前做setup,yield后做teardown),但使用者完全不用关心。

提示:别被“fixture”这个词吓住。它本质就是个带生命周期管理的函数。你写的def base_url_fixture(): return "https://api-dev.example.com",框架会在每个测试开始前自动调用它,并把返回值传给需要它的测试函数。比全局变量安全,比手动传参省事。

2.2 为什么用YAML而非JSON或Excel管理用例?

JSON太“程序员”,缩进错误直接报错;Excel太“业务”,版本合并困难,Git里全是二进制冲突。YAML是平衡点:人类可读性强(支持注释、缩进即层级)、机器解析稳定(PyYAML库成熟)、Git友好(纯文本,diff清晰)。看一个真实用例片段:

- name: "用户登录成功"
  method: POST
  url: "/auth/login"
  headers:
    Content-Type: "application/json"
  json:
    username: "admin"
    password: "123456"
  extract:
    - key: "token"
      jsonpath: "$.data.token"
  validate:
    - eq: ["$.code", 0]
    - not_null: "$.data.token"

这段代码里,extractvalidate是框架预留的扩展点。extract会用jsonpath从响应中取值存入全局变量池(后续用例可通过{{ token }}引用),validate支持eq(等于)、not_null(非空)、contains(包含)等常用断言。你不需要写assert resp.json()["code"] == 0,因为框架已把断言逻辑封装进BaseApi类,你只管填规则。

注意:YAML的缩进是硬性要求(2空格),不能用Tab。这是新手最容易踩的坑。建议用VS Code装YAML插件,它会自动提示缩进错误。

2.3 Allure报告为何不可替代?

很多团队用pytest-html,但Allure有三个不可替代的优势:步骤粒度、附件集成、历史趋势。pytest-html只能展示用例名和整体通过率;Allure能把一次测试拆解为“发送请求→解析响应→执行断言→截图保存”四个原子步骤,每步可单独标记状态。更重要的是,它原生支持附件:当断言失败时,框架自动截取响应体(response.text)和请求头(request.headers)作为文本附件,点击即可查看;若接口返回图片,还能附加二进制截图。这些在reports/目录下的HTML里点开就能看,无需翻日志。

历史趋势功能则解决了“回归测试是否变慢”的灵魂拷问。Allure服务端启动后(allure serve reports/),它会自动聚合多次执行记录,生成响应时间折线图、失败率热力图。你一眼就能看出:/order/list接口在上周五部署后平均耗时从320ms涨到890ms,大概率是新引入的缓存逻辑有问题。

2.4 DDT数据驱动的本质是“用例复用”,不是“参数遍历”

很多人把DDT理解成“for循环跑数据”,这是误区。真正的DDT是一份用例逻辑,N种数据场景,M个环境配置的三维组合。框架的datas/目录下,你可以放:
- login_valid.csv(合法账号)
- login_invalid.csv(密码错误、账号不存在等异常场景)
- env_dev.yaml(开发环境配置)
- env_test.yaml(测试环境配置)

运行时执行pytest test_api/test_login.py --ddt datas/login_valid.csv --env env_test.yaml,框架会自动将CSV的每一行与YAML用例模板结合,生成如[登录成功-张三-测试环境][登录成功-李四-测试环境]等具体用例。关键在于:CSV只管数据,YAML只管逻辑,环境配置只管地址和头信息,三者解耦。这样新增一个测试场景,只需加一行CSV;切换环境,只需改一个参数——而不是复制粘贴10个Python文件。

2.5 日志分档不是“为了分而分”,而是故障定位的黄金路径

logs/目录下的文件命名规则是app_2026-04-02_15-02-19.log,精确到秒。为什么?因为当你收到一条告警“15:02:19订单创建失败”,直接打开对应日志文件,搜索order/create,3秒内定位到失败请求的完整上下文:请求URL、参数、响应状态码、错误堆栈。如果日志混在单个大文件里,光是grep都要等半分钟。

框架的日志模块做了三件事:
1. 分级拦截logging.getLogger("api").info("请求发送") 记INFO级,except Exception as e: logging.getLogger("api").error("请求失败", exc_info=True) 记ERROR级并附堆栈;
2. 自动归档:每次运行新建文件,旧日志保留(可配置最大保留数);
3. 上下文绑定:在log record里注入request_id(UUID),同一请求的所有日志(请求、响应、断言)共享该ID,用grep "request_id=abc123" logs/*.log即可串起完整链路。

实操心得:我在某次压测中发现偶发超时,但Allure报告只显示“请求超时”,没法定位是网络抖动还是服务卡顿。后来在日志里加了一行logging.info(f"请求耗时: {time.time()-start_time:.3f}s"),问题立刻暴露——超时全发生在数据库连接池耗尽的瞬间。这就是结构化日志的价值:它不是记录“发生了什么”,而是记录“为什么发生”。

3. 核心细节解析与实操要点:从零到第一个用例

3.1 目录结构即规范:每个文件夹的使命必须明确

框架的目录不是随意组织的,每个层级都有明确职责,违反会导致功能失效:

W5zqPVEwtiGLsHZYpbX0-master-eea3b72723d1af5e65b4042db818870c879de17e/
├── config.yaml              # 全局配置中枢:baseUrl、headers、timeout、log_level
├── conftest.py              # pytest fixture注册中心:定义base_url_fixture等依赖链
├── allRun.py                # 一键执行入口:封装pytest.main()调用,预设--alluredir等参数
├── pytest.ini               # pytest默认配置:testpaths、addopts、python_files
├── test_api/                # 测试脚本入口目录(必须以test_开头)
│   └── test_login.py        # 具体测试文件,调用YAML用例
├── testcases/               # YAML用例存放目录(必须以.yaml结尾)
│   └── login.yaml           # 用例文件,内容见2.2节示例
├── datas/                   # DDT数据源目录(csv/yaml格式)
├── logs/                    # 日志自动归档目录(框架自动创建)
├── reports/                 # Allure原始报告目录(allRun.py自动生成)
└── utils/                   # 工具类目录(BaseApi、JsonPathExtractor等)

关键约束:
- test_api/下的Python文件必须以test_开头,否则pytest不识别;
- testcases/下的YAML文件必须放在该目录下,框架通过os.listdir("testcases/")扫描;
- config.yaml中的base_url必须带协议和端口(如https://api-dev.example.com:8080),少一个字符都会导致requests报Invalid URL
- logs/reports/目录首次运行时自动创建,但需确保当前用户有写权限(Linux下注意chmod -R 755)。

3.2 config.yaml:环境切换的唯一开关

这是整个框架的“心脏起搏器”。一个典型的config.yaml长这样:

# 全局配置
base_url: "https://api-dev.example.com"
timeout: 15
log_level: "INFO"

# 公共请求头
headers:
  User-Agent: "TestFramework/1.0"
  Accept: "application/json"

# 环境标识(用于Allure报告分类)
env: "dev"

# 数据库配置(供后续扩展用,当前未启用)
db:
  host: "localhost"
  port: 3306

重点看base_urlenv。当你需要切到测试环境时,不要改代码里的URL,只改这里。框架在Allure报告中会自动将env: "test"渲染为标签,点击即可筛选所有测试环境用例。timeout设为15秒是经验之谈:短于5秒易误判网络抖动,长于30秒拖慢整体执行。我们曾在线上环境将timeout设为60秒,结果一个DNS解析失败的接口卡住整个测试套件——15秒是平衡稳定性与效率的黄金值。

注意:headers里的Content-Type不要在这里写!它属于具体用例的headers字段(见2.2节YAML示例)。全局headers只放跨接口通用的,如User-AgentAuthorization(若所有接口用同一token)。

3.3 conftest.py:fixture的“中央调度室”

这个文件是pytest的灵魂,它不写测试逻辑,只管“谁先谁后、谁依赖谁”。框架预置了四个核心fixture:

import pytest
from utils.base_api import BaseApi

# 1. 基础URL fixture(session级,整个测试会话只执行一次)
@pytest.fixture(scope="session")
def base_url_fixture(config):
    return config["base_url"]

# 2. Session fixture(session级,自动维持Cookie)
@pytest.fixture(scope="session")
def session_fixture(base_url_fixture):
    session = requests.Session()
    session.headers.update({"User-Agent": "TestFramework/1.0"})
    yield session
    session.close()  # yield后执行,确保资源释放

# 3. 登录token fixture(function级,每个测试函数独立获取)
@pytest.fixture(scope="function")
def auth_token_fixture(session_fixture, base_url_fixture):
    login_url = f"{base_url_fixture}/auth/login"
    resp = session_fixture.post(login_url, json={"username":"admin","password":"123456"})
    return resp.json()["data"]["token"]

# 4. API客户端fixture(function级,注入token和session)
@pytest.fixture(scope="function")
def api_client_fixture(session_fixture, auth_token_fixture, base_url_fixture):
    client = BaseApi(session_fixture, base_url_fixture)
    client.set_header("Authorization", f"Bearer {auth_token_fixture}")
    return client

使用时只需在测试函数参数声明:

def test_user_profile(api_client_fixture):
    resp = api_client_fixture.get("/user/profile")
    assert resp.json()["code"] == 0

框架自动完成:创建session → 调登录接口 → 提取token → 构建带token的client → 执行get请求。你甚至不用知道BaseApi类在哪,就像开车不用懂发动机原理。

实操心得:scope="session"的fixture一定要小心。我们曾把auth_token_fixture也设为session级,结果100个用例共用一个token,第50个用例因token过期失败。改成function级后,每个用例独立登录,问题消失。记住:状态易变的资源(如token、临时ID)用function级;状态稳定的资源(如base_url、session对象)用session级

3.4 YAML用例编写:从“能跑”到“好维护”的进阶技巧

初学者常犯的错误是把YAML写成“代码”,比如:

# ❌ 错误示范:硬编码所有值,无法复用
- name: "张三登录"
  url: "https://api-dev.example.com/auth/login"
  json: {"username": "zhangsan", "password": "pwd123"}

正确写法是三层抽象

# ✅ 正确示范:变量+环境+数据分离
- name: "用户登录"
  method: POST
  url: "{{ base_url }}/auth/login"          # 引用config.yaml的base_url
  json:
    username: "{{ user }}"                   # 引用DDT数据源的user字段
    password: "{{ pwd }}"
  extract:
    - key: "token"
      jsonpath: "$.data.token"
  validate:
    - eq: ["$.code", 0]
    - contains: ["$.msg", "success"]

这样,同一份YAML可搭配不同CSV数据源运行:
- datas/login_normal.csvuser,pwd\nadmin,123456\neditor,654321
- datas/login_abnormal.csvuser,pwd\nadmin,wrongpwd\n,123456

框架在运行时自动替换{{ user }}为CSV当前行的值。{{ base_url }}则来自config.yaml,实现“一份用例,多环境运行”。

提示:YAML里支持!include语法导入其他文件,但框架未启用。原因是——它会让用例分散,不利于Git审查。我们坚持“一个用例一个文件”,哪怕稍显冗余,也要保证可追溯性。

4. 实操过程与核心环节实现:手把手跑通第一个用例

4.1 环境准备:三步到位,拒绝玄学报错

第一步:安装Python 3.8+和pip
确认版本:python --version(必须≥3.8)。Windows用户注意:从python.org下载安装包时,勾选“Add Python to PATH”,否则后续命令会报'python' is not recognized

第二步:安装依赖(仅需一条命令)
进入框架根目录,执行:

pip install -r requirements.txt

requirements.txt内容精简到极致:

pytest==7.4.3
requests==2.31.0
PyYAML==6.0.1
allure-pytest==2.13.5
jsonpath-ng==1.6.0

为什么锁死版本?因为requests>=2.32.0在某些Linux发行版上会因SSL库冲突报错;allure-pytest新版对pytest 8.x支持不完善。我们经过200+次CI验证,确定这套组合最稳。

第三步:安装Allure命令行工具
- Windows:下载Allure 2.21.0,解压后将bin/目录加入系统PATH;
- macOS:brew install allure
- Linux:sudo apt-get install allure
验证:终端输入allure --version,输出2.21.0即成功。

注意:Allure服务端(allure serve)和报告生成(allure generate)是两回事。allRun.py调用的是后者,生成静态HTML;allure serve是本地启动Web服务,适合开发调试。新手建议先用allure serve reports/看效果。

4.2 修改三行代码:让框架“活”起来

打开config.yaml,修改base_url为你的真实API地址(例如公司测试环境):

base_url: "https://api-test.yourcompany.com"  # ← 改这里

打开testcases/login.yaml,修改登录账号密码(确保该账号在目标环境有效):

json:
  username: "test_user"   # ← 改这里
  password: "Test@123"    # ← 改这里

打开test_api/test_login.py,确认用例路径指向正确文件:

def test_login():
    # 加载testcases/login.yaml中的第一个用例
    run_yaml_case("login.yaml", case_index=0)  # ← 这行已写好,无需改

实操心得:第一次运行前,务必用Postman手动调通https://api-test.yourcompany.com/auth/login,确认返回格式是{"code":0,"data":{"token":"xxx"}}。框架的jsonpath: "$.data.token"严格依赖此结构,若后端返回{"token":"xxx"},需改为"$.token",否则extract失败,后续用例全挂。

4.3 一键执行与报告生成:见证奇迹的时刻

在框架根目录下,执行:

python allRun.py

你会看到终端滚动输出:

============================= test session starts ==============================
platform win32 -- Python 3.9.7, pytest-7.4.3, pluggy-1.3.0
rootdir: D:\framework
plugins: allure-pytest-2.13.5, html-4.1.1
collected 1 item

test_api\test_login.py .                                               [100%]

============================== 1 passed in 1.23s ===============================
Generating Allure report...
Report saved to: D:\framework\reports

此时,reports/目录下已生成一堆.json文件(Allure的原始数据),logs/下多了app_2026-04-02_15-02-19.log。现在启动Allure服务:

allure serve reports/

浏览器自动打开http://localhost:5050,你将看到:

  • Overview页:总用例数、通过率、执行时长饼图;
  • Categories页:按失败类型(AssertionError、ConnectionError)分组;
  • Suites页:展开test_api > test_login,看到[用户登录成功]用例;
  • 点击该用例:左侧显示“Steps”(发送请求→解析响应→执行断言),右侧显示“Attachments”(请求头、响应体文本);
  • 失败时:Steps里标红的步骤旁有“Exception”标签,点开即见完整堆栈。

提示:Allure报告默认打开最新一次执行。若想对比两次执行,用allure generate reports/ -o reports_history/ --clean生成静态HTML,然后用浏览器打开reports_history/index.html

4.4 DDT批量执行:从单点测试到场景覆盖

假设你要测试登录接口的10种异常场景,创建datas/login_edge_cases.csv

user,pwd,expected_code
"", "123456", 400
"admin", "", 400
"admin", "wrongpwd", 401
"admin", "123456", 0
"editor", "123456", 403

运行命令:

pytest test_api/test_login.py --ddt datas/login_edge_cases.csv -v

-v参数让pytest输出详细用例名,你会看到:

test_api/test_login.py::test_login[admin-123456-0] PASSED
test_api/test_login.py::test_login[admin-wrongpwd-401] PASSED
...

Allure报告中,每个组合都是独立用例,失败互不影响。这就是DDT的价值:用最小成本覆盖最大风险面

5. 常见问题与排查技巧实录:那些文档里不会写的坑

5.1 经典报错与速查表

报错信息 根本原因 解决方案
requests.exceptions.ConnectionError: Max retries exceeded base_url配置错误(少协议、端口错、域名不可达) ping api-test.yourcompany.comtelnet api-test.yourcompany.com 443验证网络连通性;检查config.yaml中URL是否带https://
jsonpath_ng.exceptions.JSONPathError: Invalid token extractvalidate中的jsonpath语法错误(如$.data.token写成$data.token 用在线工具jsonpath.com粘贴响应体和path测试;确保path以$开头
AttributeError: 'NoneType' object has no attribute 'json' 接口返回非JSON(如502 Bad Gateway的HTML页面) BaseApi类的_parse_response方法里加if "application/json" not in resp.headers.get("content-type", ""):判断,避免对HTML调.json()
allure-pytest: command not found Allure未安装或PATH未配置 macOS/Linux执行echo $PATH确认/usr/local/bin在路径中;Windows检查系统环境变量
pytest: error: unrecognized arguments: --ddt conftest.py中未注册ddt命令行参数 检查conftest.py是否有def pytest_addoption(parser): parser.addoption("--ddt", action="store")

5.2 日志定位故障的黄金三步法

当Allure报告只显示“断言失败”,但不知道具体哪一步出错时,按此流程排查:

第一步:锁定日志文件
Allure报告右上角有“Start time”,格式如2026-04-02 15:02:19。去logs/目录找文件名含2026-04-02_15-02-19的日志。

第二步:搜索request_id
在日志中搜索request_id=,找到类似request_id=abc123-def456的字符串。这是框架为本次请求生成的唯一ID。

第三步:串起完整链路
grep "request_id=abc123-def456" logs/*.log,你会看到:

INFO:api: [request_id=abc123-def456] 发送POST请求: https://api-test.yourcompany.com/auth/login
INFO:api: [request_id=abc123-def456] 请求参数: {'username': 'admin', 'password': '123456'}
ERROR:api: [request_id=abc123-def456] 响应状态码: 401, 响应体: {"code":401,"msg":"invalid credentials"}

三行日志,完整还原了失败现场:参数没错,但后端返回401,说明密码错误或账号被锁。比翻Allure附件快5倍。

5.3 Allure报告打不开?90%是浏览器缓存惹的祸

新手常遇到:allure serve reports/后浏览器打不开,或页面空白。这不是框架问题,而是Chrome/Firefox的CSP策略阻止了本地文件加载。解决方案只有两个:

  • 推荐:用allure generate reports/ -o allure-report --clean生成静态HTML,然后用VS Code装Live Server插件,右键allure-report/index.html选择“Open with Live Server”;
  • 备选:Chrome启动时加参数chrome.exe --unsafely-treat-insecure-origin-as-secure="file:///" --user-data-dir=/tmp/chrome_dev_test(仅限调试)。

实操心得:我们曾为这个问题折腾2小时,最后发现是公司安全软件拦截了allure serve的本地端口。解决方案是改用allure generate,彻底绕过服务端依赖。记住:Allure的核心价值是报告内容,不是服务端形式

5.4 如何添加新接口?一个真实案例

需求:为订单创建接口POST /order/create写自动化用例。

步骤1:分析接口依赖
该接口需要登录态(token),且返回order_id供后续查询。因此需复用auth_token_fixture,并在用例中extract订单ID。

步骤2:编写YAML用例
testcases/order_create.yaml中:

- name: "创建订单成功"
  method: POST
  url: "{{ base_url }}/order/create"
  headers:
    Authorization: "Bearer {{ token }}"
  json:
    product_id: "{{ product_id }}"
    quantity: 1
  extract:
    - key: "order_id"
      jsonpath: "$.data.order_id"
  validate:
    - eq: ["$.code", 0]
    - not_null: "$.data.order_id"

步骤3:准备DDT数据
datas/order_data.csv

product_id
1001
1002

步骤4:编写测试脚本
test_api/test_order.py

import pytest
from utils.yaml_runner import run_yaml_case

class TestOrder:
    def test_create_order(self):
        run_yaml_case("order_create.yaml", case_index=0)

步骤5:执行

pytest test_api/test_order.py --ddt datas/order_data.csv -v

全程无需写一行requests代码,所有HTTP细节、token注入、断言逻辑均由框架处理。这就是脚手架的意义:把重复劳动标准化,让你聚焦在业务逻辑验证上

6. 后续可扩展的方向:从脚手架到平台

这个框架的设计是“渐进式演进”的。当你用熟了基础功能,可以按需叠加能力:

  • 集成CI/CD:在Jenkins/GitLab CI中添加python allRun.py && allure generate reports/ -o ./public/allure-report --clean,每次Push自动跑测试并发布报告;
  • 对接缺陷系统:在utils/report_hook.py中重写on_test_failure方法,当用例失败时自动调用Jira API创建issue,附带Allure报告链接;
  • 性能监控:在BaseApi_send_request方法里加time.perf_counter()计时,将耗时数据推送到Prometheus,用Grafana画响应时间趋势图;
  • AI辅助用例生成:用LLM分析Swagger文档,自动生成testcases/下的YAML模板(我们已验证,准确率超85%,但需人工校验extract逻辑)。

但请记住:所有扩展的前提,是先用框架跑通100个真实用例,积累足够多的失败模式和日志样本。 没有扎实的执行基础,再炫酷的扩展都是空中楼阁。我见过太多团队花两周搭“完美框架”,结果第一个用例都跑不通,最后退回手工测试——那不是技术先进,而是工程倒退。

我个人在实际操作中的体会是:框架的价值不在于它有多复杂,而在于它能否让一个测试工程师在咖啡凉掉前,完成从写用例到看报告的全过程。当你看到allure serve reports/后浏览器弹出那个绿色的“100% Passed”,那一刻的成就感,就是所有深夜调试的回报。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:开箱即用的Python接口自动化测试环境,基于pytest+requests构建,新手照着文档改3行代码就能跑通。测试用例统一用YAML编写,结构清晰易维护;支持接口间参数传递(比如登录后提取token供后续请求复用)、自动维持Cookie和Session状态。内置封装好的DDT数据驱动机制,一份用例配合多组测试数据批量执行。Allure报告自动生成,含用例分类、失败截图、执行时长、步骤详情等可视化信息。日志模块按level分级记录,自动归档到logs目录,保留错误堆栈便于排查。BaseUrl、公共请求头、通用断言逻辑全部抽离进config.yaml,不同环境(开发/测试/预发)一键切换。框架自带conftest.py提供标准化fixture,支持执行顺序控制、用例跳过、参数化标记(@pytest.mark.parametrize)、热加载和异常捕获。testcases放YAML用例,test_api是测试入口脚本,allRun.py支持一键全量运行,pytest.ini已预置常用配置。配套有从安装依赖、配置环境到编写首个用例的完整操作指南,每步带说明和注意事项。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

更多推荐