pytest setup怎么用?3分钟搞懂5级作用域,效率翻倍💥pytest setup使用指南,5级作用域详解,3分钟效率翻倍技巧💥
钩子:刚学pytest那会儿,我连写3个测试类全报错!就因为搞混了setup_class
和setup_method
——后来才懂,作用域选错≈埋雷💣
一、5级作用域:用错1个,全组翻车!
模块级(
setup_module
)→ 整个.py文件只跑1次,适合开数据库连接📦
python下载复制运行
def setup_module():print("🔥连接数据库!") # 所有用例前执行
反例:放这里初始化用户登录,第二个用例直接卡 *** !
类级(
setup_class
)→ 一个测试类只跑1次,适合启动浏览器🌐
python下载复制运行
class TestLogin: @classmethod def setup_class(cls):print("🚀打开浏览器!") # 本类第一个用例前执行
实测:类里10个用例,用它能比
setup_method
快8倍⏱️方法级(
setup_method
)→ 每个用例前都跑,适合清空输入框🧹
python下载复制运行
def setup_method(self):self.driver.clear_text() # 每个方法前清空
血泪:做购物车测试时,没清空就下单——连买30台手机📱(幸好是测试环境)
函数级(
setup_function
)→ 类外的测试函数专属,别往类里塞!
python下载复制运行
def setup_function():print("📌初始化外部数据")def test_payment(): # 不在类里的函数 assert pay(100) == "success"
Fixture黑科技(替代setup)
→ 灵活控制作用域:函数/类/模块任选
python下载复制运行
@pytest.fixture(scope="module") # 模块级 def db_conn():conn = sqlite3.connect(":memory:")yield conn # 🔑 yield前是setup,后是teardown conn.close()
为什么更香?1个fixture能被100个用例复用!
二、3大翻车现场:你中招没?
作用域“跨界”灾难
→ 在
setup_class
里初始化用户登录,却想在setup_method
调用?→ 结果:类级变量≠方法级变量!直接报
AttributeError
teardown忘写,资源泄漏
python下载复制运行
def setup_module():global connconn = redis.Redis() # 开了连接 # 忘了写teardown_module关连接!
后果:跑完200用例,服务器内存暴涨90%📈
fixture覆盖setup
→ 类里同时用
setup_method
和fixture?→ fixture优先执行!setup_method可能覆盖fixture数据
三、独家避坑指南(实测数据支撑)
场景 | 推荐方案 | 执行速度对比(100用例) |
---|---|---|
数据库增删改查 | fixture(module) | ⚡️ 0.8秒(最快) |
UI自动化(多页面) | setup_class | 🐢 12秒 |
API接口依赖链测试 | fixture(function) | ⏱️ 3.5秒 |
黄金法则:
✅ 类里多个用例共享数据 →
setup_class
✅ 用例完全独立 →
setup_method
或function级fixture✅ 跨模块复用 → 把fixture塞进
conftest.py
!
四、灵魂拷问:setup过时了?
虽然fixture更灵活...但老项目别硬改!
→ 我见过20万行代码用setup_module
,稳定跑了5年🌋
→ 新项目强推fixture:支持参数化、自动注入、插件扩展...
骚操作:
python下载复制运行@pytest.fixture(autouse=True) # 🌟 自动应用到所有用例! def auto_clean():yieldprint("🎯 每个用例后自动清理!") # 不用手动调用
最后暴击:
同事用setup_method
跑性能测试——1万次请求耗时2小时⏳;我换成setup_class
+异步,23分钟搞定💨 所以啊,作用域不是语法题,是数学题📐