pytest setup怎么用?3分钟搞懂5级作用域,效率翻倍💥​​pytest setup使用指南,5级作用域详解,3分钟效率翻倍技巧💥

钩子:刚学pytest那会儿,我连写3个测试类全报错!就因为搞混了setup_classsetup_method——后来才懂,​​作用域选错≈埋雷​​💣


一、5级作用域:用错1个,全组翻车!

  1. ​模块级​​(setup_module

    → ​​整个.py文件只跑1次​​,适合开数据库连接📦

    pytest setup怎么用?3分钟搞懂5级作用域,效率翻倍💥​​pytest setup使用指南,5级作用域详解,3分钟效率翻倍技巧💥  第1张
    python下载复制运行
    def setup_module():print("🔥连接数据库!")  # 所有用例前执行

    反例:放这里初始化用户登录,第二个用例直接卡 *** !

  2. ​类级​​(setup_class

    → ​​一个测试类只跑1次​​,适合启动浏览器🌐

    python下载复制运行
    class TestLogin:    @classmethod  def setup_class(cls):print("🚀打开浏览器!")  # 本类第一个用例前执行

    实测:类里10个用例,用它能比setup_method​快8倍​​⏱️

  3. ​方法级​​(setup_method

    → ​​每个用例前都跑​​,适合清空输入框🧹

    python下载复制运行
    def setup_method(self):self.driver.clear_text()  # 每个方法前清空

    血泪:做购物车测试时,没清空就下单——​​连买30台手机​​📱(幸好是测试环境)

  4. ​函数级​​(setup_function

    → ​​类外的测试函数专属​​,别往类里塞!

    python下载复制运行
    def setup_function():print("📌初始化外部数据")def test_payment():  # 不在类里的函数  assert pay(100) == "success"
  5. ​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大翻车现场:你中招没?

  1. ​作用域“跨界”灾难​

    → 在setup_class里初始化用户登录,却想在setup_method调用?

    → 结果:​​类级变量≠方法级变量​​!直接报AttributeError

  2. ​teardown忘写,资源泄漏​

    python下载复制运行
    def setup_module():global connconn = redis.Redis()  # 开了连接  # 忘了写teardown_module关连接!

    后果:跑完200用例,​​服务器内存暴涨90%​​📈

  3. ​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分钟搞定​​💨 所以啊,​​作用域不是语法题,是数学题​​📐