Pytest - Fixture(5) - 作用域(scope)
Pytest - Fixture作用域(scope)
-
之前讲过,fixture里面有个
scop
参数,这个参数就是填写fixture作用域的;-
function
:每一个函数或方法都会调用; -
class
:每一个类调用一次,一个类中可以有多个方法; -
module
:每一个.py
文件调用一次,该文件内又有多个function
和class
; -
session
:是多个文件调用一次,可以跨.py
文件调用,每个.py
文件就是module
。
-
function
-
fixture默认作用域为
function
,即scope="function"
,scope可以不写。- 每一个函数或方法执行前都会调用,每个测试用例执行前都会执行一次function级别的fixture;
test_py.py
import pytest """用例级别fixture,作用域单个用例""" @pytest.fixture(autouse=True) def login_func(): print("\n--- function级别的作用域前置操作 ---") yield print("=== function级别的作用域后置操作 ===") # 调用login的fixture函数 def test_s1(login_func): print("\n用例test_s1:调用login_func的fixture函数") # 不调用login函数,也会运行fixture def test_s2(): print("\n用例test_s2:不调用login_func函数,也会运行fixture") if __name__ == '__main__': pytest.main(['-q', 'test_py.py'])
class
-
class
级别的fixture,在整个测试类中的所有测试用例——都会调用fixture函数。- 在类中的测试用例,任意一个用例引用fixture即可:
test_py.py
import pytest """类级别fixture,作用域整个类""" @pytest.fixture(scope="class") def login_cls(): print("\n--- class级别的作用域前置操作 ---") yield print("=== class级别的作用域后置操作 ===") class Test_cls(): # class级别的fixture任意一个用例引用即可 def test_s1(self, login_cls): print("\n用例test_s1:在类中的测试用例") def test_s2(self): print("\n用例test_s2:在类中的测试用例") if __name__ == '__main__': pytest.main(['-q', 'test_py.py'])
- 在类外的测试用例调用fixture,相当于function级别的fixture:
test_py.py
import pytest """类级别fixture,作用域整个类""" @pytest.fixture(scope="class", autouse=True) def login_cls(): print("\n--- class级别的作用域前置操作 ---") yield print("=== class级别的作用域后置操作 ===") """类外调用class级别的作用域,相当于function级别的作用域""" def test_s1(login_cls): print("\n用例test_s1:在类外的测试用例,调用login_cls的fixture函数") def test_s2(): print("\n用例test_s2:在类外的测试用例,不调用login_cls函数,也会运行fixture") if __name__ == '__main__': pytest.main(['-q', 'test_py.py'])
module
-
在Python中
module
即xx.py
文件;当fixture定义为module
时,则此fixture将在当前py文件中起作用。-
当fixture定义为module作用域时,只要当前文件中有一个测试用例使用了fixture,不管这个用例是在类外,还是在类中,都会在当前文件(模块)的所有测试用例执行之前去执行fixture定义的行为;
-
以及当前文件的所有用例结束之后同样去执行fixture定义的对应操作。
-
test_py.py
import pytest """模块级别fixture,作用域整个py文件""" @pytest.fixture(scope="module") def login_module(): print("\n--- module级别的作用域前置操作 ---") yield print("=== module级别的作用域后置操作 ===") # 测试类外和测试类内的函数方法都调用了相同module级别的fixture,但整个py文件只会生效一次fixture。 def test_s2(login_module): print("\n用例test_s2:在类外的测试用例") class Test_cls(): # module级别的fixture任意一个用例引用即可 def test_s1(self, login_module): print("\n用例test_s1:在类中的测试用例") def test_s3(self): print("\n用例test_s3:在类中的测试用例") if __name__ == '__main__': pytest.main(['-q', 'test_py.py'])
session
-
session
级别的fixture,是指在当前目录下的所有用例之前和之后执行fixture对应的操作;- fixture为session级别是可以跨.py模块调用的,如果多个用例只需调用一次fixture,那就可以设置为scope="session",并且写到
conftest.py
文件里。
- fixture为session级别是可以跨.py模块调用的,如果多个用例只需调用一次fixture,那就可以设置为scope="session",并且写到
conftest.py
import pytest """会话级别fixture,作用域当前目录""" @pytest.fixture(scope="session") def login_session(): """作用于整个py文件""" print("\n--- session级别的作用域前置操作 ---") yield print("=== session级别的作用域后置操作 ===")
test_py.py
def test_s2(login_session): print("\n用例test_s2:在类外的测试用例") class Test_cls(): # session级别的fixture任意一个用例引用即可 def test_s1(self, login_session): print("\n用例test_s1:在类中的测试用例") def test_s3(self): print("\n用例test_s3:在类中的测试用例") if __name__ == '__main__': pytest.main(['-q', 'test_py.py'])
分类:
Pytest
标签:
Python-自动化测试
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2022-05-27 Jenkins - 配置邮件通知