Pytest中function等fixture作用域的区别及适用场景
Pytest Fixture作用域相关问题解答
1. 各fixture作用域的区别
- function:默认作用域,粒度最细。每个测试函数执行前初始化一次,函数执行完成后销毁。不同测试函数会触发独立的fixture实例,同一测试函数多次调用该fixture仅执行一次。
- class:作用于单个测试类。类内所有测试方法共用同一个fixture实例——在类的第一个测试方法执行前初始化,类中所有测试完成后销毁。
- module:作用于单个Python模块(.py文件)。模块内所有测试函数、测试类共享该fixture,模块首个测试执行前初始化,模块所有测试结束后销毁。
- package:作用于整个Python包(含
__init__.py的目录),Pytest 7.0及以上版本支持。包下所有模块的测试共用该fixture,包内首个测试执行前初始化,包内所有测试完成后销毁。 - session:作用域最广,覆盖整个测试会话(即一次
pytest命令的执行周期)。整个会话内仅初始化一次该fixture,所有测试共用,会话结束后才销毁。
2. 各作用域的适用场景
- function作用域:用于需要每次测试独立初始化的资源,比如每个测试都要重置的临时对象、不能共享的状态,或是用完即销毁的轻量依赖(如单次请求的临时数据库连接)。
- class作用域:当测试类内的所有测试方法依赖同一不变资源时使用,比如测试同一业务类的不同方法时,共享该类的实例;或是类内测试共用同一测试数据集,减少重复初始化的开销。
- module作用域:模块内多个测试共享同一资源时选用,比如模块内所有测试都需要的数据库连接、配置文件实例,初始化一次即可供整个模块的测试使用。
- package作用域:适用于整个包下测试共享的全局资源,比如包内多模块测试都需要的外部服务连接、大型测试数据集,避免在每个模块重复初始化。
- session作用域:针对初始化成本极高的资源,比如启动测试用Docker容器、建立远程服务器长连接、加载大体积测试数据——这类资源初始化耗时久,整个测试会话仅需一次,能显著提升测试效率。
内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito
相关产品推荐
相关产品推荐

