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'])