pytest 黑科技:一招搞定测试的「准备」与「打扫」
—— 用 Fixture 优雅管理测试环境
引言
想象你在厨房做菜:
🔪 准备阶段:洗菜、切菜、热锅(测试初始化)
👨🍳 烹饪阶段:正式下锅(执行测试)
🧹 清理阶段:洗碗、擦灶台(资源回收)pytest 的 Fixture 就是你的智能厨房管家,帮你自动化管理全流程!
核心机制图解
三步上手 Fixture
1️⃣ 定义 Fixture
用 @pytest.fixture
声明环境管理器:
import pytest
@pytest.fixture(scope="module") # 🎯 作用域控制
def db_conn():
print("🔌 连接数据库") # 准备阶段
conn = create_connection()
yield conn # ✨ 魔法分割线
print("♻️ 关闭连接") # 清理阶段
conn.close()
2️⃣ 调用 Fixture
测试函数通过同名参数自动获取:
def test_query(db_conn): # 自动注入 db_conn
data = db_conn.query("SELECT * FROM users")
assert len(data) > 0 # ✅ 测试逻辑
3️⃣ 执行效果
🔌 连接数据库 # 先执行 yield 前代码
TEST: test_query... # 执行测试
♻️ 关闭连接 # 最后执行 yield 后代码
Fixture 作用域详解
控制资源复用频率,避免重复开销:
作用域 | 生命周期 | 典型场景 | 代码示例 |
---|---|---|---|
function | 每个测试函数独立 | 临时文件创建 | @pytest.fixture() |
class | 测试类内共享 | 浏览器初始化 | scope="class" |
module | 同 Python 文件共享 | 数据库连接 | scope="module" (最常用) |
session | 全局会话共享 | 登录凭证 | scope="session" |
💡 黄金法则:作用域越大,执行频率越低,测试速度越快!
思维导图:Fixture 核心能力
真实场景案例
🌐 Web 测试模板
@pytest.fixture(scope="module")
def browser():
driver = ChromeDriver() # 启动浏览器
driver.login("admin", "123456") # 全局登录
yield driver
driver.quit() # 关闭浏览器
def test_search(browser):
browser.search("pytest教程")
assert "官方文档" in browser.page_source
def test_cart(browser):
browser.add_to_cart("VIP会员")
assert "支付成功" in browser.title
总结
- 🪄 yield 是灵魂:1 行代码分离准备/清理阶段
- 🧩 作用域控制:4 种模式精准匹配测试需求
- 🤖 自动注入:同名参数自动触发 Fixture
- 🚀 效率提升:复用资源加速测试执行
终极心法:Fixture = 环境管理员 + 资源调度师 + 清洁工!
彩蛋:组合使用 @pytest.mark.parametrize
与 Fixture,可轻松实现 参数化环境配置,解锁更复杂的测试场景!