当前位置: 首页 > news >正文

pytest之fixture

Python + pytest 是 API 测试最主流的组合:

1.最高频的使用场景

1. 从接口文档生成测试代码

把接口描述或 Swagger JSON 粘给 AI,直接产出:

# AI 生成的初稿结构

import pytest
import requestsclass TestUserLogin:
BASE_URL = "https://api.example.com"@pytest.mark.parametrize("payload,expected_status,expected_msg", [
({"username": "valid", "password": "valid"}, 200, "success"),
({"username": "", "password": "valid"}, 400, "用户名不能为空"),
({"username": "valid", "password": "wrong"}, 401, "密码错误"),
({"username": "a" * 256, "password": "valid"}, 400, None), # 边界值
])
def test_login(self, payload, expected_status, expected_msg):
resp = requests.post(f"{self.BASE_URL}/login", json=payload)
assert resp.status_code == expected_status

 

你只需要审查逻辑,不用从零写。

---
2. fixture 设计

告诉 AI 你的业务依赖关系,它帮你规划 fixture 层次:

@pytest.fixture(scope="session")
def auth_token():
# AI 帮你写好登录获取 token 的逻辑
...@pytest.fixture
def created_order(auth_token):
# 依赖 token,创建订单并在测试后清理
order = create_order(auth_token)
yield order
delete_order(order["id"], auth_token)

 

---

代码解释:

 yield 在 pytest fixture 里是分隔"准备""清理"两个阶段的关键字。  1)执行顺序:
测试开始↓order = create_order(auth_token)   ← 前置:创建订单↓yield order                        ← 把 order 传给测试函数,然后【暂停在这里】↓[测试函数执行]↓delete_order(order["id"], ...)     ← 后置:测试结束后自动清理 2)对比理解:

# 没有 yield —— 只有准备,没有清理
@pytest.fixture
def created_order(auth_token):
  order = create_order(auth_token)
  return order # 测试结束后订单留在系统里,产生脏数据


# 有 yield —— 准备 + 清理
@pytest.fixture
def created_order(auth_token):
  order = create_order(auth_token)
  yield order # 测试结束后自动执行 yield 下面的代码
  delete_order(order["id"], auth_token) # 清理掉

3)测试函数怎么用

def test_get_order(created_order):
  # created_order 就是 yield 传出来的那个 order 对象
  resp = requests.get(f"/orders/{created_order['id']}")
  assert resp.status_code == 200

---
核心记忆:yield 之前 = setUp,yield 本身 = 传值给测试,yield 之后 = tearDown。即使测试中途报错,yield 后面的清理代码也保证会执行。

4)@pytest.fixture这个装饰器表示什么意思

@pytest.fixture
def created_order(auth_token):
  order = create_order(auth_token)
  yield order
  delete_order(order["id"], auth_token)

# 测试函数只需要在参数里写同名变量,pytest 自动传进来
def test_get_order(created_order): # ← pytest 看到参数名,自动找同名 fixture 执行
assert created_order["status"] == "pending"

你不需要手动调用 created_order(),pytest 自动帮你执行并把结果传进来,这就是"注入"。

没有 fixture 的写法对比

# 没有 fixture —— 每个测试都要手动重复准备和清理
def test_get_order():
token = login()
order = create_order(token)
try:
assert order["status"] == "pending"
finally:
delete_order(order["id"], token)

def test_update_order():
token = login() # 重复
order = create_order(token) # 重复
try:
...
finally:
delete_order(order["id"], token) # 重复

# 有 fixture —— 准备/清理逻辑只写一次,测试函数专注断言
def test_get_order(created_order):
assert created_order["status"] == "pending"

def test_update_order(created_order):
...

scope 控制复用范围

@pytest.fixture(scope="function") # 默认,每个测试函数都重新执行一次
@pytest.fixture(scope="class") # 同一个测试类共享一次
@pytest.fixture(scope="module") # 同一个文件共享一次
@pytest.fixture(scope="session") # 整个测试会话只执行一次(如 auth_token)

一句话总结:@pytest.fixture 就是把"公共的准备+清理逻辑"抽出来复用,谁的参数里写了这个名字,pytest 就自动注入给谁。

 

5) yield 后面跟参数,表示把这个值传递给使用该 fixture 的测试函数。

对比

# yield 不带参数 —— 只做准备/清理,不传值
@pytest.fixture
def setup_database():
  db.connect()
  yield # 什么都不传
  db.disconnect()

def test_something(setup_database):
  # setup_database 是 None,你只是借用了它的准备/清理流程
  ...

# yield 带参数 —— 准备/清理 + 传值
@pytest.fixture
def created_order(auth_token):
  order = create_order(auth_token)
  yield order # 把 order 这个对象传出去

def test_get_order(created_order):
  # created_order 就是上面 yield 传出来的 order 对象
  print(created_order["id"]) # 可以直接用

 


3. conftest.py 结构规划

描述你的项目结构,AI 帮你设计合理的 conftest 分层,避免 fixture 混乱。

---
4. 断言增强

AI 会提示你除了 status_code 之外还应该断言什么:

- 响应时间阈值 assert resp.elapsed.total_seconds() < 2
- 必填字段存在性
- 字段类型校验(配合 jsonschema 或 pydantic)
- 业务逻辑一致性(创建后查询,数据要对应)

---
5. 日志分析与报错定位

测试跑失败时,把 pytest 输出直接粘给 AI,通常能快速给出根因和修复建议。

---
推荐的提问方式

┌──────────┬────────────────────────────────────┐
│ 场景 │ 给 AI 的信息 │
├──────────┼────────────────────────────────────┤
│ 生成用例 │ 接口路径 + 参数说明 + 业务规则 │
├──────────┼────────────────────────────────────┤
│ 生成脚本 │ 上面的用例 + 你用的 requests/httpx │
├──────────┼────────────────────────────────────┤
│ 调试失败 │ pytest 完整报错 + 相关代码片段 │
├──────────┼────────────────────────────────────┤
│ 优化结构 │ 当前 conftest.py 内容 │
└──────────┴────────────────────────────────────┘

 

http://www.jsqmd.com/news/955534/

相关文章:

  • 2026年机械设备模型代表性企业发展现状分析(附核心数据) - 多才菠萝
  • 工程师绩效评估四大维度:从技术贡献到职场价值的全面解析
  • AI搜索优化避坑指南:亲测这些做法适得其反
  • STM32定时器输入捕获双通道频率测量:从原理到实践的避坑指南
  • 劳力士国内官方售后服务网点、联系方式与收费标准全梳理|2026年6月最新 - 劳力士服务中心
  • 3PEAK思瑞浦 TP2311-TR SOT23-5 精密运放
  • 2026年婴儿用品安全质疑舆情中品牌危机管理危机公关常见的删帖误区
  • Web3项目出海合规指南:乘风破浪,合规先行
  • PyTorch版DCGAN图像生成实战包:含训练脚本、模型定义与预存权重
  • 一级标题 - Bold字重
  • 硬件产品成功之道:从MCU到生态的系统工程解析
  • 国内2026年加气块厂家评选品牌出炉与基建行业走势分析
  • 线性电源与开关电源:原理、选型与设计实战全解析
  • 工程师思维重塑:从理论焦虑到常识推理的工程实践
  • 2026台州装修实力榜|10家高口碑装企推荐 - 资讯快报
  • 塑料瓶打包机 - 资讯快报
  • 2026 年 6 月 5 日遵义黄金铂金 k 金钻石回收 5 家门店实地测评详解 - 资讯快报
  • 南京岩洲建设:六合区小挖机出租公司电话 - LYL仔仔
  • 3PEAK思瑞浦 TP2312-VR MSOP8 精密运放
  • 2026腾讯企业邮箱一年费用多少?收费标准及购买方式说明 - 品牌2026
  • Mythos门控能力解析:大模型跨文档一致性推理的范式革命
  • 前端已死?从前端到AI工程师的血泪转型之路
  • OpenClaw Windows Hub:AI 驱动个人助手的 Windows 配套套件,功能丰富亮点多!
  • 自动化办公利器 OpenClaw 安装实操,含 Gateway 离线故障处理方法(包含安装包)
  • OpenSpeedy终极指南:免费开源游戏变速工具完整使用教程
  • VMware Workstation Pro搭集群环境:从单台CentOS 7到三节点互通的完整配置清单
  • ComfyUI-Manager:重构AI绘画工作流管理的全新范式
  • OpenClaw 云器Lakehouse:让数据开发进入对话时代
  • NanaZip:告别Windows文件管理烦恼的现代压缩解决方案
  • 杭州购宠指南|认准明轩猫犬舍(萧山+上城双店),实体选宠远离网购陷阱 - 资讯纵览