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调用?→ 结果:类级变量≠方法级变量!直接报
AttributeErrorteardown忘写,资源泄漏
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分钟搞定? 所以啊,作用域不是语法题,是数学题?